86 lines
1.9 KiB
Python
86 lines
1.9 KiB
Python
from ctypes import (
|
|
addressof,
|
|
c_char_p,
|
|
c_int,
|
|
c_long,
|
|
c_uint,
|
|
c_void_p,
|
|
CFUNCTYPE,
|
|
POINTER,
|
|
Structure,
|
|
)
|
|
import pytest
|
|
import h5py
|
|
from h5py import h5z
|
|
|
|
from .common import insubprocess
|
|
|
|
|
|
# Type of filter callback function of H5Z_class2_t
|
|
H5ZFuncT = CFUNCTYPE(
|
|
c_long, # restype
|
|
# argtypes
|
|
c_uint, # flags
|
|
c_long, # cd_nelemts
|
|
POINTER(c_uint), # cd_values
|
|
c_long, # nbytes
|
|
POINTER(c_long), # buf_size
|
|
POINTER(c_void_p), # buf
|
|
)
|
|
|
|
|
|
class H5ZClass2T(Structure):
|
|
"""H5Z_class2_t structure defining a filter"""
|
|
|
|
_fields_ = [
|
|
("version", c_int),
|
|
("id_", c_int),
|
|
("encoder_present", c_uint),
|
|
("decoder_present", c_uint),
|
|
("name", c_char_p),
|
|
("can_apply", c_void_p),
|
|
("set_local", c_void_p),
|
|
("filter_", H5ZFuncT),
|
|
]
|
|
|
|
|
|
def test_register_filter():
|
|
filter_id = 256 # Test ID
|
|
|
|
@H5ZFuncT
|
|
def failing_filter_callback(flags, cd_nelemts, cd_values, nbytes, buf_size, buf):
|
|
return 0
|
|
|
|
dummy_filter_class = H5ZClass2T(
|
|
version=h5z.CLASS_T_VERS,
|
|
id_=filter_id,
|
|
encoder_present=1,
|
|
decoder_present=1,
|
|
name=b"dummy filter",
|
|
can_apply=None,
|
|
set_local=None,
|
|
filter_=failing_filter_callback,
|
|
)
|
|
|
|
h5z.register_filter(addressof(dummy_filter_class))
|
|
|
|
try:
|
|
assert h5z.filter_avail(filter_id)
|
|
filter_flags = h5z.get_filter_info(filter_id)
|
|
assert (
|
|
filter_flags
|
|
== h5z.FILTER_CONFIG_ENCODE_ENABLED | h5z.FILTER_CONFIG_DECODE_ENABLED
|
|
)
|
|
finally:
|
|
h5z.unregister_filter(filter_id)
|
|
|
|
assert not h5z.filter_avail(filter_id)
|
|
|
|
|
|
@pytest.mark.mpi_skip
|
|
@insubprocess
|
|
def test_unregister_filter(request):
|
|
if h5py.h5z.filter_avail(h5py.h5z.FILTER_LZF):
|
|
res = h5py.h5z.unregister_filter(h5py.h5z.FILTER_LZF)
|
|
assert res
|