Move H5Fset_dset_no_attrs_hint VOL operations to native.

Move minimzied object header tests from separate file to test/ohdr.c
Some formatting changes.
This commit is contained in:
Jacob Smith 2018-12-18 13:42:03 -06:00
parent 5efc08a06d
commit 99bc714c4b
11 changed files with 906 additions and 966 deletions

View File

@ -1056,7 +1056,6 @@
./test/none.h5
./test/ntypes.c
./test/ohdr.c
./test/ohdr_min.c
./test/objcopy.c
./test/page_buffer.c
./test/paged_nopersist.h5

View File

@ -1858,7 +1858,7 @@ H5Fget_dset_no_attrs_hint(hid_t file_id, hbool_t *minimize)
if(NULL == vol_obj)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid file identifier")
#if 1
#if 0
if(H5VL_file_get(vol_obj, H5VL_FILE_GET_MIN_DSET_OHDR_FLAG, H5P_DATASET_XFER_DEFAULT, H5_REQUEST_NULL, minimize) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "unable to get file's dataset header minimization flag")
#else

View File

@ -3713,3 +3713,27 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5F_get_file_id() */
/*-------------------------------------------------------------------------
* Function: H5F_set_min_dset_ohdr
*
* Purpose: Set the crt_dset_ohdr_flag field with a new value.
*
* Return: SUCCEED/FAIL
*-------------------------------------------------------------------------
*/
herr_t
H5F_set_min_dset_ohdr(H5F_t *f, hbool_t minimize)
{
/* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */
FUNC_ENTER_NOAPI_NOINIT_NOERR
/* Sanity check */
HDassert(f);
HDassert(f->shared);
f->shared->crt_dset_min_ohdr_flag = minimize;
FUNC_LEAVE_NOAPI(SUCCEED)
} /* H5F_set_min_dset_ohdr() */

View File

@ -331,7 +331,7 @@ typedef struct H5F_t H5F_t;
#define H5F_POINT_OF_NO_RETURN(F) ((F)->shared->fs.point_of_no_return)
#define H5F_FIRST_ALLOC_DEALLOC(F) ((F)->shared->first_alloc_dealloc)
#define H5F_EOA_PRE_FSM_FSALLOC(F) ((F)->shared->eoa_pre_fsm_fsalloc)
#define H5F_MIN_DSET_OHDR(F) ((F)->shared->crt_dset_min_ohdr_flag)
#define H5F_GET_MIN_DSET_OHDR(F) ((F)->shared->crt_dset_min_ohdr_flag)
#define H5F_SET_MIN_DSET_OHDR(F, V) ((F)->shared->crt_dset_min_ohdr_flag = (V))
#else /* H5F_MODULE */
#define H5F_LOW_BOUND(F) (H5F_get_low_bound(F))
@ -390,7 +390,7 @@ typedef struct H5F_t H5F_t;
#define H5F_POINT_OF_NO_RETURN(F) (H5F_get_point_of_no_return(F))
#define H5F_FIRST_ALLOC_DEALLOC(F) (H5F_get_first_alloc_dealloc(F))
#define H5F_EOA_PRE_FSM_FSALLOC(F) (H5F_get_eoa_pre_fsm_fsalloc(F))
#define H5F_MIN_DSET_OHDR(F) (H5F_get_min_dset_ohdr(F))
#define H5F_GET_MIN_DSET_OHDR(F) (H5F_get_min_dset_ohdr(F))
#define H5F_SET_MIN_DSET_OHDR(F, V) (H5F_set_min_dset_ohdr((F), (V)))
#endif /* H5F_MODULE */

View File

@ -244,7 +244,8 @@ typedef enum H5VL_native_file_optional_t {
H5VL_NATIVE_FILE_GET_EOA, /* H5Fget_eoa */
H5VL_NATIVE_FILE_INCR_FILESIZE, /* H5Fincrement_filesize */
H5VL_NATIVE_FILE_SET_LIBVER_BOUNDS, /* H5Fset_latest_format/libver_bounds */
H5VL_NATIVE_FILE_SET_MIN_DSET_OHDR_FLAG /* H5Fset_dset_no_attrs_hint*/
H5VL_NATIVE_FILE_GET_MIN_DSET_OHDR_FLAG, /* H5Fget_dset_no_attrs_hint */
H5VL_NATIVE_FILE_SET_MIN_DSET_OHDR_FLAG /* H5Fset_dset_no_attrs_hint */
} H5VL_native_file_optional_t;

View File

@ -1614,17 +1614,6 @@ H5VL__native_file_get(void *obj, H5VL_file_get_t get_type,
break;
}
/* H5Fget_dset_no_attrs_hint */
case H5VL_FILE_GET_MIN_DSET_OHDR_FLAG:
{
hbool_t *minimize = va_arg(arguments, hbool_t*);
f = (H5F_t*)obj;
if(NULL == f)
HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file")
*minimize = H5F_MIN_DSET_OHDR(f);
break;
}
default:
HGOTO_ERROR(H5E_VOL, H5E_CANTGET, FAIL, "can't get this type of information")
} /* end switch */
@ -2123,6 +2112,18 @@ H5VL__native_file_optional(void *obj, hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR
}
/* H5Fget_dset_no_attrs_hint */
case H5VL_NATIVE_FILE_GET_MIN_DSET_OHDR_FLAG:
{
hbool_t *minimize = va_arg(arguments, hbool_t *);
*minimize = H5F_GET_MIN_DSET_OHDR(f);
#if 0
if(H5F_get_min_dset_ohdr(f, (hbool_t)minimize) < 0)
HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "cannot set file's dataset object header minimization flag")
#endif
break;
}
/* H5Fset_dset_no_attrs_hint */
case H5VL_NATIVE_FILE_SET_MIN_DSET_OHDR_FLAG:
{
int minimize = va_arg(arguments, int);

View File

@ -115,8 +115,7 @@ typedef enum H5VL_file_get_t {
H5VL_FILE_GET_INTENT, /* file intent */
H5VL_FILE_GET_NAME, /* file name */
H5VL_FILE_GET_OBJ_COUNT, /* object count in file */
H5VL_FILE_GET_OBJ_IDS, /* object ids in file */
H5VL_FILE_GET_MIN_DSET_OHDR_FLAG /* minimize dataset object headers? */
H5VL_FILE_GET_OBJ_IDS /* object ids in file */
} H5VL_file_get_t;
/* types for file SPECIFIC callback */

View File

@ -2719,9 +2719,6 @@ H5_trace(const double *returning, const char *func, const char *type, ...)
case H5VL_FILE_GET_OBJ_IDS:
HDfprintf(out, "H5VL_FILE_GET_OBJ_IDS");
break;
case H5VL_FILE_GET_MIN_DSET_OHDR_FLAG:
HDfprintf(out, "H5VL_FILE_GET_MIN_DSET_OHDR_FLAG");
break;
default:
HDfprintf(out, "%ld", (long)get);
break;

View File

@ -52,7 +52,7 @@ check_SCRIPTS = $(TEST_SCRIPT)
# As an exception, long-running tests should occur earlier in the list.
# This gives them more time to run when tests are executing in parallel.
TEST_PROG= testhdf5 \
cache cache_api cache_image cache_tagging lheap ohdr ohdr_mindset \
cache cache_api cache_image cache_tagging lheap ohdr \
stab gheap evict_on_close farray earray btree2 fheap \
pool accum hyperslab istore bittests dt_arith page_buffer \
dtypes dsets cmpd_dset filter_fail extend direct_chunk external efc \

View File

@ -36,9 +36,16 @@
const char *FILENAME[] = {
"ohdr",
"ohdr_min_a",
"ohdr_min_b",
NULL
};
/* used for object header size comparison */
#define EQ 1
#define LT 2
#define GT 3
/* The tbogus.h5 is generated from gen_bogus.c in HDF5 'test' directory.
* To get this data file, define H5O_ENABLE_BOGUS in src/H5Oprivate, rebuild
* the library and simply compile gen_bogus.c with that HDF5 library and run it.
@ -733,6 +740,847 @@ error:
return FAIL;
} /* test_unknown() */
/*
* Set an attribute with the given information.
* If the out parameter `attr_id` is negative, a new attribute will be
* created with the given information. Else, it will attempt to update the
* attribute with the new value.
*
* `dataspace_id` ignored if `attribute_id` >= 0
*/
static herr_t
put_attribute(hid_t loc_id, const char *attrname, const void *attrvalue, hid_t datatype_id, hid_t dataspace_id, hid_t *attribute_id)
{
if((*attribute_id) < 0) {
hid_t id = -1;
id = H5Acreate(loc_id, attrname, datatype_id, dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
if(id < 0)
return FAIL;
*attribute_id = id;
}
return H5Awrite(*attribute_id, datatype_id, attrvalue);
} /* put_attribute */
/*
* Count the number of attributes attached to an object.
* Returns negative in event of error.
*/
static int
count_attributes(hid_t dset_id)
{
H5O_info_t info;
if(H5Oget_info(dset_id, &info, H5O_INFO_ALL) < 0)
return -1;
else
return (int)info.num_attrs; /* should never exceed int bounds */
} /* count_attributes */
/*
* Get the total space used by the object header.
* Used by oh_compare()
* On success, stores size in `size_out` pointer.
*/
static herr_t
_oh_getsize(hid_t did, hsize_t *size_out)
{
H5O_info_t info;
if(FAIL == H5Oget_info2(did, &info, H5O_INFO_HDR))
return FAIL;
*size_out = info.hdr.space.total;
return SUCCEED;
} /* _oh_getsize */
/*
* Compare the TOTAL space used by datasets' object headers.
* Returns negative value if an error occurred,
* else positive #defined indicator value EQ, LT, GT.
*/
static int
oh_compare(hid_t did1, hid_t did2)
{
hsize_t space1 = 0;
hsize_t space2 = 0;
if(FAIL == _oh_getsize(did1, &space1))
return -1;
if(FAIL == _oh_getsize(did2, &space2))
return -2;
if(space1 < space2)
return LT;
else if(space1 > space2)
return GT;
else
return EQ;
} /* oh_compare() */
/*
* Demonstrate attribute addition to datasets.
* Conduct additions side-by-side with a standard datataset and one with
* minimized dataset object headers.
*/
static herr_t
test_minimized_oh_attribute_addition(void)
{
hsize_t array_10[1] = {10}; /* dataspace extent */
char buffer[10] = ""; /* to inspect string attribute */
int a_out = 0;
char filename[512] = "";
hid_t int_type_id = -1;
hid_t char_type_id = -1;
hid_t dcpl_id = -1;
hid_t dspace_id = -1;
hid_t dspace_scalar_id = -1;
hid_t dset_id = -1;
hid_t mindset_id = -1;
hid_t attr_1_id = -1;
hid_t attr_1a_id = -1;
hid_t attr_2_id = -1;
hid_t attr_2a_id = -1;
hid_t attr_3_id = -1;
hid_t attr_3a_id = -1;
hid_t file_id = -1;
herr_t ret;
int count = 0;
TESTING("minimized dset object headers attribute additions")
/*********
* SETUP *
*********/
if(h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) == NULL)
TEST_ERROR
dspace_id = H5Screate_simple(1, array_10, NULL);
if(dspace_id < 0) TEST_ERROR
dspace_scalar_id = H5Screate(H5S_SCALAR);
if(dspace_scalar_id < 0) TEST_ERROR
char_type_id = H5Tcopy(H5T_NATIVE_CHAR);
if(char_type_id < 0) TEST_ERROR
int_type_id = H5Tcopy(H5T_NATIVE_INT);
if(int_type_id < 0) TEST_ERROR
dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_id, TRUE);
if(ret < 0) TEST_ERROR
file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
if(file_id < 0) TEST_ERROR
H5E_BEGIN_TRY {
count = count_attributes(dset_id);
} H5E_END_TRY;
if(count != -1) TEST_ERROR
dset_id = H5Dcreate(file_id, "dataset", int_type_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if(dset_id < 0) TEST_ERROR
mindset_id = H5Dcreate(file_id, "mindataset", int_type_id, dspace_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT);
if(mindset_id < 0) TEST_ERROR
/********************
* TEST/DEMONSTRATE *
********************/
/* -------------------
* no attributes added
*/
count = count_attributes(dset_id);
if(count != 0) TEST_ERROR
count = count_attributes(mindset_id);
if(count != 0) TEST_ERROR
/* -----------------
* add one attribute
*/
ret = put_attribute(dset_id, "PURPOSE", "DEMO", char_type_id, dspace_id, &attr_1_id);
if(ret < 0) TEST_ERROR
ret = put_attribute(mindset_id, "PURPOSE", "DEMO", char_type_id, dspace_id, &attr_1a_id);
if(ret < 0) TEST_ERROR
count = count_attributes(dset_id);
if(count != 1) TEST_ERROR
count = count_attributes(mindset_id);
if(count != 1) TEST_ERROR
ret = H5Aread(attr_1_id, char_type_id, buffer);
if(ret < 0) TEST_ERROR
if(HDstrcmp("DEMO", buffer)) TEST_ERROR
ret = H5Aread(attr_1a_id, char_type_id, buffer);
if(ret < 0) TEST_ERROR
if(HDstrcmp("DEMO", buffer)) TEST_ERROR
/* -----------------
* modify one attribute
*/
ret = put_attribute(dset_id, "PURPOSE", "REWRITE", char_type_id, -1, &attr_1_id);
if(ret < 0) TEST_ERROR
ret = put_attribute(mindset_id, "PURPOSE", "REWRITE", char_type_id, -1, &attr_1a_id);
if(ret < 0) TEST_ERROR
count = count_attributes(dset_id);
if(count != 1) TEST_ERROR
count = count_attributes(mindset_id);
if(count != 1) TEST_ERROR
ret = H5Aread(attr_1_id, char_type_id, buffer);
if(ret < 0) TEST_ERROR
if(HDstrcmp("REWRITE", buffer)) TEST_ERROR
ret = H5Aread(attr_1a_id, char_type_id, buffer);
if(ret < 0) TEST_ERROR
if(HDstrcmp("REWRITE", buffer)) TEST_ERROR
/* -----------------
* add second attribute
*/
a_out = 5;
ret = put_attribute(dset_id, "RANK", &a_out, int_type_id, dspace_scalar_id, &attr_2_id);
if(ret < 0) TEST_ERROR
a_out = 3;
ret = put_attribute(mindset_id, "RANK", &a_out, int_type_id, dspace_scalar_id, &attr_2a_id);
if(ret < 0) TEST_ERROR
count = count_attributes(dset_id);
if(count != 2) TEST_ERROR
count = count_attributes(mindset_id);
if(count != 2) TEST_ERROR
ret = H5Aread(attr_2_id, int_type_id, &a_out);
if(ret < 0) TEST_ERROR
if(a_out != 5) TEST_ERROR
ret = H5Aread(attr_2a_id, int_type_id, &a_out);
if(ret < 0) TEST_ERROR
if(a_out != 3) TEST_ERROR
/* -----------------
* add third attribute
*/
a_out = -86;
ret = put_attribute(dset_id, "FLAVOR", &a_out, int_type_id, dspace_scalar_id, &attr_3_id);
if(ret < 0) TEST_ERROR
a_out = 2185;
ret = put_attribute(mindset_id, "FLAVOR", &a_out, int_type_id, dspace_scalar_id, &attr_3a_id);
if(ret < 0) TEST_ERROR
count = count_attributes(dset_id);
if(count != 3) TEST_ERROR
count = count_attributes(mindset_id);
if(count != 3) TEST_ERROR
ret = H5Aread(attr_3_id, int_type_id, &a_out);
if(ret < 0) TEST_ERROR
if(a_out != -86) TEST_ERROR
ret = H5Aread(attr_3a_id, int_type_id, &a_out);
if(ret < 0) TEST_ERROR
if(a_out != 2185) TEST_ERROR
/************
* TEARDOWN *
************/
if(H5Tclose(int_type_id) < 0) TEST_ERROR
if(H5Tclose(char_type_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_id) < 0) TEST_ERROR
if(H5Sclose(dspace_id) < 0) TEST_ERROR
if(H5Dclose(dset_id) < 0) TEST_ERROR
if(H5Dclose(mindset_id) < 0) TEST_ERROR
if(H5Aclose(attr_1_id) < 0) TEST_ERROR
if(H5Aclose(attr_1a_id) < 0) TEST_ERROR
if(H5Aclose(attr_2_id) < 0) TEST_ERROR
if(H5Aclose(attr_2a_id) < 0) TEST_ERROR
if(H5Aclose(attr_3_id) < 0) TEST_ERROR
if(H5Aclose(attr_3a_id) < 0) TEST_ERROR
if(H5Fclose(file_id) < 0) TEST_ERROR
PASSED()
return SUCCEED;
error :
H5E_BEGIN_TRY {
(void)H5Tclose(int_type_id);
(void)H5Tclose(char_type_id);
(void)H5Pclose(dcpl_id);
(void)H5Sclose(dspace_id);
(void)H5Dclose(dset_id);
(void)H5Dclose(mindset_id);
(void)H5Aclose(attr_1_id);
(void)H5Aclose(attr_1a_id);
(void)H5Aclose(attr_2_id);
(void)H5Aclose(attr_2a_id);
(void)H5Aclose(attr_3_id);
(void)H5Aclose(attr_3a_id);
(void)H5Fclose(file_id);
} H5E_END_TRY;
return FAIL;
} /* test_minimized_oh_attribute_addition */
/*
* Compare header sizes against when headers have been minimized.
*/
static herr_t
test_minimized_oh_size_comparisons(void)
{
hsize_t array_10[1] = {10}; /* dataspace extents */
/* IDs that are file-agnostic */
hid_t dspace_id = -1;
hid_t int_type_id = -1;
hid_t dcpl_minimize = -1;
hid_t dcpl_dontmin = -1;
/* IDs for non-minimzed file open */
hid_t file_f_id = -1; /* lower 'f' for standard file setting */
hid_t dset_f_x_id = -1; /* 'x' for default */
hid_t dset_f_N_id = -1; /* 'N' for explcit non-minimized dset */
hid_t dset_f_Y_id = -1; /* 'Y' for minimzed dset */
/* IDs for minimzed file open */
hid_t file_F_id = -1; /* upper 'F' for minimzed file setting */
hid_t dset_F_x_id = -1; /* 'x' for default */
hid_t dset_F_N_id = -1; /* 'N' for explcit non-minimized dset */
hid_t dset_F_Y_id = -1; /* 'Y' for minimzed dset */
char filename_a[512] = "";
char filename_b[512] = "";
herr_t ret;
TESTING("minimized dset object headers size comparisons");
/*********
* SETUP *
*********/
if(h5_fixname(FILENAME[1], H5P_DEFAULT, filename_a, sizeof(filename_a)) == NULL)
TEST_ERROR
if(h5_fixname(FILENAME[2], H5P_DEFAULT, filename_b, sizeof(filename_b)) == NULL)
TEST_ERROR
dcpl_minimize = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_minimize < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_minimize, TRUE);
if(ret < 0) TEST_ERROR
dcpl_dontmin = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_dontmin < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_dontmin, FALSE);
if(ret < 0) TEST_ERROR
dspace_id = H5Screate_simple(1, array_10, NULL);
if(dspace_id < 0) TEST_ERROR
int_type_id = H5Tcopy(H5T_NATIVE_INT);
if(int_type_id < 0) TEST_ERROR
file_f_id = H5Fcreate(filename_a, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
if(file_f_id < 0) TEST_ERROR
dset_f_x_id = H5Dcreate(file_f_id, "default", int_type_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if(dset_f_x_id < 0) TEST_ERROR
dset_f_N_id = H5Dcreate(file_f_id, "dsetNOT", int_type_id, dspace_id, H5P_DEFAULT, dcpl_dontmin, H5P_DEFAULT);
if(dset_f_N_id < 0) TEST_ERROR
dset_f_Y_id = H5Dcreate(file_f_id, "dsetMIN", int_type_id, dspace_id, H5P_DEFAULT, dcpl_minimize, H5P_DEFAULT);
if(dset_f_x_id < 0) TEST_ERROR
file_F_id = H5Fcreate(filename_b, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
if(file_F_id < 0) TEST_ERROR
ret = H5Fset_dset_no_attrs_hint(file_F_id, TRUE);
if(ret < 0) TEST_ERROR
dset_F_x_id = H5Dcreate(file_F_id, "default", int_type_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if(dset_F_x_id < 0) TEST_ERROR
dset_F_N_id = H5Dcreate(file_F_id, "dsetNOT", int_type_id, dspace_id, H5P_DEFAULT, dcpl_dontmin, H5P_DEFAULT);
if(dset_F_N_id < 0) TEST_ERROR
dset_F_Y_id = H5Dcreate(file_F_id, "dsetMIN", int_type_id, dspace_id, H5P_DEFAULT, dcpl_minimize, H5P_DEFAULT);
if(dset_F_Y_id < 0) TEST_ERROR
/*********
* TESTS *
*********/
if(oh_compare(dset_f_x_id, dset_f_x_id) != EQ) TEST_ERROR /* identity */
if(oh_compare(dset_f_x_id, dset_f_N_id) != EQ) TEST_ERROR
if(oh_compare(dset_f_x_id, dset_f_Y_id) != GT) TEST_ERROR
if(oh_compare(dset_f_N_id, dset_f_Y_id) != GT) TEST_ERROR
if(oh_compare(dset_F_x_id, dset_F_N_id) != EQ) TEST_ERROR
if(oh_compare(dset_F_x_id, dset_F_Y_id) != EQ) TEST_ERROR
if(oh_compare(dset_F_N_id, dset_F_Y_id) != EQ) TEST_ERROR
if(oh_compare(dset_F_x_id, dset_f_Y_id) != EQ) TEST_ERROR
if(oh_compare(dset_F_x_id, dset_f_x_id) != LT) TEST_ERROR
/************
* TEARDOWN *
************/
if(H5Sclose(dspace_id) < 0) TEST_ERROR
if(H5Tclose(int_type_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_minimize) < 0) TEST_ERROR
if(H5Pclose(dcpl_dontmin) < 0) TEST_ERROR
if(H5Fclose(file_f_id) < 0) TEST_ERROR
if(H5Dclose(dset_f_x_id) < 0) TEST_ERROR
if(H5Dclose(dset_f_N_id) < 0) TEST_ERROR
if(H5Dclose(dset_f_Y_id) < 0) TEST_ERROR
if(H5Fclose(file_F_id) < 0) TEST_ERROR
if(H5Dclose(dset_F_x_id) < 0) TEST_ERROR
if(H5Dclose(dset_F_N_id) < 0) TEST_ERROR
if(H5Dclose(dset_F_Y_id) < 0) TEST_ERROR
PASSED()
return SUCCEED;
error :
H5E_BEGIN_TRY {
(void)H5Pclose(dcpl_minimize);
(void)H5Pclose(dcpl_dontmin);
(void)H5Sclose(dspace_id);
(void)H5Tclose(int_type_id);
(void)H5Fclose(file_f_id);
(void)H5Dclose(dset_f_x_id);
(void)H5Dclose(dset_f_N_id);
(void)H5Dclose(dset_f_Y_id);
(void)H5Fclose(file_F_id);
(void)H5Dclose(dset_F_x_id);
(void)H5Dclose(dset_F_N_id);
(void)H5Dclose(dset_F_Y_id);
} H5E_END_TRY;
return FAIL;
} /* test_minimized_oh_size_comparisons */
/*
* Test minimized dataset object header with filter/pipeline message
*/
static herr_t
test_minimized_oh_with_filter(void)
{
char filename[512] = "";
const hsize_t extents[1] = {1024}; /* extents of dataspace */
const unsigned filter_values[] = {0}; /* TBD */
const hsize_t chunk_dim[] = {32}; /* needed for filter */
const int ndims = 1;
hid_t dspace_id = -1;
hid_t dtype_id = -1;
hid_t dcpl_xZ_id = -1;
hid_t dcpl_mx_id = -1;
hid_t dcpl_mZ_id = -1;
hid_t dset_xx_id = -1;
hid_t dset_xZ_id = -1;
hid_t dset_mx_id = -1;
hid_t dset_mZ_id = -1;
hid_t file_id = -1;
herr_t ret;
/* | default | minimize
* ----------+---------+---------
* no filter | xx | mx
* ----------+---------+---------
* filter | xZ | mZ
*/
TESTING("minimized dset object headers with filter message");
/*********
* SETUP *
*********/
if(h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) == NULL)
TEST_ERROR
dcpl_mx_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_mx_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_mx_id, TRUE);
if(ret < 0) TEST_ERROR
dcpl_xZ_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_xZ_id < 0) TEST_ERROR
ret = H5Pset_chunk(dcpl_xZ_id, ndims, chunk_dim);
if(ret < 0) TEST_ERROR
ret = H5Pset_filter(dcpl_xZ_id, H5Z_FILTER_DEFLATE, H5Z_FLAG_OPTIONAL, 0, filter_values);
if(ret < 0) TEST_ERROR
dcpl_mZ_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_mZ_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_mZ_id, TRUE);
if(ret < 0) TEST_ERROR
ret = H5Pset_chunk(dcpl_mZ_id, ndims, chunk_dim);
if(ret < 0) TEST_ERROR
ret = H5Pset_filter( dcpl_mZ_id, H5Z_FILTER_DEFLATE, H5Z_FLAG_OPTIONAL, 0, filter_values);
if(ret < 0) TEST_ERROR
dspace_id = H5Screate_simple(1, extents, extents);
if(dspace_id < 0) TEST_ERROR
dtype_id = H5Tcopy(H5T_NATIVE_INT);
if(dtype_id < 0) TEST_ERROR
file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
if(file_id < 0) TEST_ERROR
dset_xx_id = H5Dcreate(file_id, "xx", dtype_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if(dset_xx_id < 0) TEST_ERROR
dset_mx_id = H5Dcreate(file_id, "Mx", dtype_id, dspace_id, H5P_DEFAULT, dcpl_mx_id, H5P_DEFAULT);
if(dset_mx_id < 0) TEST_ERROR
dset_xZ_id = H5Dcreate(file_id, "xZ", dtype_id, dspace_id, H5P_DEFAULT, dcpl_xZ_id, H5P_DEFAULT);
if(dset_xZ_id < 0) TEST_ERROR
dset_mZ_id = H5Dcreate(file_id, "MZ", dtype_id, dspace_id, H5P_DEFAULT, dcpl_mZ_id, H5P_DEFAULT);
if(dset_mZ_id < 0) TEST_ERROR
/*********
* TESTS *
*********/
if(oh_compare(dset_mx_id, dset_xx_id) != LT) TEST_ERROR
if(oh_compare(dset_mx_id, dset_xZ_id) != LT) TEST_ERROR
if(oh_compare(dset_mZ_id, dset_mx_id) != GT) TEST_ERROR
if(oh_compare(dset_mZ_id, dset_xZ_id) != LT) TEST_ERROR
/************
* TEARDOWN *
************/
if(H5Sclose(dspace_id) < 0) TEST_ERROR
if(H5Tclose(dtype_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_xZ_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_mx_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_mZ_id) < 0) TEST_ERROR
if(H5Dclose(dset_xx_id) < 0) TEST_ERROR
if(H5Dclose(dset_xZ_id) < 0) TEST_ERROR
if(H5Dclose(dset_mx_id) < 0) TEST_ERROR
if(H5Dclose(dset_mZ_id) < 0) TEST_ERROR
if(H5Fclose(file_id) < 0) TEST_ERROR
PASSED()
return SUCCEED;
error:
H5E_BEGIN_TRY {
(void)H5Sclose(dspace_id);
(void)H5Tclose(dtype_id);
(void)H5Pclose(dcpl_xZ_id);
(void)H5Pclose(dcpl_mx_id);
(void)H5Pclose(dcpl_mZ_id);
(void)H5Dclose(dset_xx_id);
(void)H5Dclose(dset_xZ_id);
(void)H5Dclose(dset_mx_id);
(void)H5Dclose(dset_mZ_id);
(void)H5Fclose(file_id);
} H5E_END_TRY;
return FAIL;
} /* test_minimized_oh_with_filter */
/*
* Test minimized dataset object header and recording modification times.
*/
static herr_t
test_minimized_oh_modification_times(void)
{
/* test-local structure for parameterized testing
*/
struct testcase {
unsigned oh_version;
};
char filename[512] = "";
const hsize_t extents[1] = {128}; /* extents of dataspace */
hid_t dspace_id = -1;
hid_t dtype_id = -1;
hid_t dcpl_xT_id = -1; /* Track modtime */
hid_t dcpl_mx_id = -1; /* minimized */
hid_t dcpl_mT_id = -1; /* minimized, Track */
hid_t dcpl_mN_id = -1; /* minimized, do Not track */
hid_t dset_xx_id = -1;
hid_t dset_xT_id = -1;
hid_t dset_mx_id = -1;
hid_t dset_mT_id = -1;
hid_t dset_mN_id = -1;
hid_t file_id = -1;
hid_t fapl_id = -1;
herr_t ret;
unsigned i = 0; /* for testcase loop */
unsigned n_cases = 2; /* must match `cases` array size below */
struct testcase cases[2] = {
{ 1, }, /* version 1 object header */
{ 2, }, /* version 2 object header */
};
TESTING("minimized dset object headers with modification times");
/*********
* SETUP *
*********/
if(h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) == NULL)
TEST_ERROR
dcpl_mx_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_mx_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_mx_id, TRUE);
if(ret < 0) TEST_ERROR
dcpl_xT_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_xT_id < 0) TEST_ERROR
ret = H5Pset_obj_track_times(dcpl_xT_id, TRUE);
if(ret < 0) TEST_ERROR
dcpl_mT_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_mT_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_mT_id, TRUE);
if(ret < 0) TEST_ERROR
ret = H5Pset_obj_track_times(dcpl_mT_id, TRUE);
if(ret < 0) TEST_ERROR
dcpl_mN_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_mN_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_mN_id, TRUE);
if(ret < 0) TEST_ERROR
ret = H5Pset_obj_track_times(dcpl_mN_id, FALSE);
if(ret < 0) TEST_ERROR
dspace_id = H5Screate_simple(1, extents, extents);
if(dspace_id < 0) TEST_ERROR
dtype_id = H5Tcopy(H5T_NATIVE_INT);
if(dtype_id < 0) TEST_ERROR
for (i = 0; i < n_cases; i++) {
/* -------------- *
* per-case setup *
* -------------- */
fapl_id = H5P_DEFAULT;
if(cases[i].oh_version > 1) {
fapl_id = H5Pcreate(H5P_FILE_ACCESS);
if(fapl_id < 0) TEST_ERROR
ret = H5Pset_libver_bounds(fapl_id, H5F_LIBVER_V18, H5F_LIBVER_V110);
if(ret < 0) TEST_ERROR
}
file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id);
if(file_id < 0) TEST_ERROR
dset_xx_id = H5Dcreate( file_id, "xx", dtype_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if(dset_xx_id < 0) TEST_ERROR
dset_mx_id = H5Dcreate(file_id, "mx", dtype_id, dspace_id, H5P_DEFAULT, dcpl_mx_id, H5P_DEFAULT);
if(dset_mx_id < 0) TEST_ERROR
dset_xT_id = H5Dcreate(file_id, "xT", dtype_id, dspace_id, H5P_DEFAULT, dcpl_xT_id, H5P_DEFAULT);
if(dset_xT_id < 0) TEST_ERROR
dset_mT_id = H5Dcreate(file_id, "mT", dtype_id, dspace_id, H5P_DEFAULT, dcpl_mT_id, H5P_DEFAULT);
if(dset_mT_id < 0) TEST_ERROR
dset_mN_id = H5Dcreate(file_id, "mN", dtype_id, dspace_id, H5P_DEFAULT, dcpl_mN_id, H5P_DEFAULT);
if(dset_mN_id < 0) TEST_ERROR
/* ----- *
* TESTS *
* ----- */
/* sanity check */
if(oh_compare(dset_mx_id, dset_xx_id) != LT) TEST_ERROR
if(oh_compare(dset_mx_id, dset_xT_id) != LT) TEST_ERROR
if(oh_compare(dset_xx_id, dset_xT_id) != EQ) TEST_ERROR
if(oh_compare(dset_mx_id, dset_mT_id) != EQ) TEST_ERROR
if(oh_compare(dset_mN_id, dset_mT_id) != LT) TEST_ERROR
if(oh_compare(dset_mT_id, dset_xT_id) != LT) TEST_ERROR
/* ----------------- *
* per-case teardown *
* ----------------- */
if(H5Dclose(dset_xx_id) < 0) TEST_ERROR
if(H5Dclose(dset_xT_id) < 0) TEST_ERROR
if(H5Dclose(dset_mx_id) < 0) TEST_ERROR
if(H5Dclose(dset_mT_id) < 0) TEST_ERROR
if(H5Dclose(dset_mN_id) < 0) TEST_ERROR
if(H5Fclose(file_id) < 0) TEST_ERROR
if((fapl_id != H5P_DEFAULT) && (H5Pclose(fapl_id) < 0))
TEST_ERROR
} /* for each version tested */
/************
* TEARDOWN *
************/
if(H5Sclose(dspace_id) < 0) TEST_ERROR
if(H5Tclose(dtype_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_xT_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_mx_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_mT_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_mN_id) < 0) TEST_ERROR
PASSED()
return SUCCEED;
error:
H5E_BEGIN_TRY {
(void)H5Sclose(dspace_id);
(void)H5Tclose(dtype_id);
(void)H5Pclose(dcpl_xT_id);
(void)H5Pclose(dcpl_mx_id);
(void)H5Pclose(dcpl_mT_id);
(void)H5Pclose(dcpl_mN_id);
(void)H5Dclose(dset_xx_id);
(void)H5Dclose(dset_xT_id);
(void)H5Dclose(dset_mx_id);
(void)H5Dclose(dset_mT_id);
(void)H5Dclose(dset_mN_id);
(void)H5Fclose(file_id);
(void)H5Pclose(fapl_id);
} H5E_END_TRY;
return FAIL;
} /* test_minimized_oh_modification_times */
/*
* Test minimized dataset object header with a fill value set.
*/
static herr_t
test_minimized_oh_fillvalue_backwards_compatability(void)
{
char filename[512] = "";
const hsize_t extents[1] = {64}; /* extents of dataspace */
const int fill[1] = {343}; /* fill value of dataset */
hid_t file_id = -1;
hid_t dtype_id = -1;
hid_t dspace_id = -1;
hid_t dcpl_id = -1;
hid_t fapl_id = -1;
hid_t dset_0_id = -1;
hid_t dset_1_id = -1;
herr_t ret;
/*********
* SETUP *
*********/
TESTING("minimized dset object headers with fill values and different libver support");
if(h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) == NULL)
TEST_ERROR
dspace_id = H5Screate_simple(1, extents, extents);
if(dspace_id < 0) TEST_ERROR
dtype_id = H5Tcopy(H5T_NATIVE_INT);
if(dtype_id < 0) TEST_ERROR
dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_id, TRUE);
if(ret == FAIL) TEST_ERROR;
ret = H5Pset_fill_value(dcpl_id, dtype_id, fill);
if(ret == FAIL) TEST_ERROR;
fapl_id = H5Pcreate(H5P_FILE_ACCESS);
if(fapl_id < 0) TEST_ERROR
ret = H5Pset_libver_bounds(fapl_id, H5F_LIBVER_EARLIEST, H5F_LIBVER_LATEST);
if(ret == FAIL) TEST_ERROR;
file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id);
if(file_id < 0) TEST_ERROR
dset_0_id = H5Dcreate(file_id, "fullrange", dtype_id, dspace_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT);
if(dset_0_id < 0) TEST_ERROR
/* Close file and re-open with different libver bounds.
* Dataset "fullrange" must also be closed for expected reopen behavior.
*/
if(H5Fclose(file_id) < 0) TEST_ERROR;
if(H5Dclose(dset_0_id) < 0) TEST_ERROR
ret = H5Pset_libver_bounds(fapl_id, H5F_LIBVER_V18, H5F_LIBVER_LATEST);
if(ret == FAIL) TEST_ERROR;
file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id);
if(file_id < 0) TEST_ERROR
dset_1_id = H5Dcreate(file_id, "upperrange", dtype_id, dspace_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT);
if(dset_1_id < 0) TEST_ERROR
/* re-open "fullrange" dataset
*/
dset_0_id = H5Dopen2(file_id, "fullrange", H5P_DEFAULT);
if(dset_0_id < 0) TEST_ERROR
/*********
* TESTS *
*********/
/* dset not supporting pre-1.08 should be smaller? */
if(oh_compare(dset_1_id, dset_0_id) != LT) TEST_ERROR
/************
* TEARDOWN *
************/
if(H5Sclose(dspace_id) < 0) TEST_ERROR
if(H5Tclose(dtype_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_id) < 0) TEST_ERROR
if(H5Pclose(fapl_id) < 0) TEST_ERROR
if(H5Dclose(dset_0_id) < 0) TEST_ERROR
if(H5Dclose(dset_1_id) < 0) TEST_ERROR
if(H5Fclose(file_id) < 0) TEST_ERROR;
PASSED()
return SUCCEED;
error:
H5E_BEGIN_TRY {
(void)H5Sclose(dspace_id);
(void)H5Tclose(dtype_id);
(void)H5Pclose(dcpl_id);
(void)H5Pclose(fapl_id);
(void)H5Dclose(dset_0_id);
(void)H5Dclose(dset_1_id);
(void)H5Fclose(file_id);
} H5E_END_TRY;
return FAIL;
} /* test_minimized_oh_fillvalue_backwards_compatability */
#define STR_EARLIEST "earliest"
#define STR_V18 "v18"
#define STR_LATEST "latest"
@ -1030,6 +1878,21 @@ main(void)
if(test_ohdr_cache(filename, fapl) < 0)
TEST_ERROR
if(test_minimized_oh_attribute_addition() < 0)
TEST_ERROR
if(test_minimized_oh_size_comparisons() < 0)
TEST_ERROR
if(test_minimized_oh_with_filter() < 0)
TEST_ERROR
if(test_minimized_oh_modification_times() < 0)
TEST_ERROR
if(test_minimized_oh_fillvalue_backwards_compatability() < 0)
TEST_ERROR
} /* high */
} /* low */

View File

@ -1,944 +0,0 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tests to verify behavior of minimized dataset object headers.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "hdf5.h"
#include "h5test.h"
/******************
* TESTING MACROS *
******************/
/* basenames of test files created in this test suite */
#define OHMIN_FILENAME_A "ohdr_min_a"
#define OHMIN_FILENAME_B "ohdr_min_b"
/* used for object header size comparison */
#define EQ 1
#define LT 2
#define GT 3
/*********************
* UTILITY FUNCTIONS *
*********************/
/* ---------------------------------------------------------------------------
* Function: put_attribute()
*
* Purpose: Set an attribute with the given information.
*
* If the out parameter `attr_id` is negative, a new attribute will be
* created with the given information. Else, it will attempt to update the
* attribute with the new value.
*
* `dataspace_id` ignored if `attribute_id` >= 0
*
* Return: 0 (success) or -1 (failure)
*
* ---------------------------------------------------------------------------
*/
static herr_t
put_attribute(hid_t loc_id, const char *attrname, const void *attrvalue, hid_t datatype_id, hid_t dataspace_id, hid_t *attribute_id)
{
if((*attribute_id) < 0) {
hid_t id = -1;
id = H5Acreate(loc_id, attrname, datatype_id, dataspace_id, H5P_DEFAULT, H5P_DEFAULT);
if(id < 0)
return FAIL;
*attribute_id = id;
}
return H5Awrite(*attribute_id, datatype_id, attrvalue);
} /* put_attribute */
/* ---------------------------------------------------------------------------
* Function: count_attributes()
*
* Purpose: Count the number of attributes attached to an object.
*
* TODO: If the location id is that of a file, tries to count all the
* attributes present in the file.
*
* Return: -1 if an error occurred, else the number of attributes.
*
* ---------------------------------------------------------------------------
*/
static int
count_attributes(hid_t dset_id)
{
H5O_info_t info;
if(0 > H5Oget_info(dset_id, &info, H5O_INFO_ALL))
return -1;
else
return (int)info.num_attrs; /* should never exceed int bounds */
} /* count_attributes */
/* ---------------------------------------------------------------------------
* Function: _oh_getsize()
*
* Purpose: Get the total space used by the object header
*
*
* Return: SUCCEED/FAIL. On success, stores size in `size_out` pointer.
*
* ---------------------------------------------------------------------------
*/
static herr_t
_oh_getsize(hid_t did, hsize_t *size_out)
{
H5O_info_t info;
if(FAIL == H5Oget_info2(did, &info, H5O_INFO_HDR))
return FAIL;
*size_out = info.hdr.space.total;
return SUCCEED;
} /* _oh_getsize */
/* ---------------------------------------------------------------------------
* Function: oh_compare()
*
* Purpose: Compare the TOTAL space used by datasets' object headers.
*
*
* Return: negative value if an error occurred,
* else positive #defined indicator value EQ, LT, GT.
*
* ---------------------------------------------------------------------------
*/
static int
oh_compare(hid_t did1, hid_t did2)
{
hsize_t space1 = 0;
hsize_t space2 = 0;
if(FAIL == _oh_getsize(did1, &space1))
return -1;
if(FAIL == _oh_getsize(did2, &space2))
return -2;
if(space1 < space2)
return LT;
else if(space1 > space2)
return GT;
else
return EQ;
}
/******************
* TEST FUNCTIONS *
******************/
/* ---------------------------------------------------------------------------
* Demonstrate attribute addition to datasets.
* Conduct additions side-by-side with a standard datataset and one with
* minimized dataset object headers.
* ---------------------------------------------------------------------------
*/
static herr_t
test_minimized_oh_attribute_addition(void)
{
hsize_t array_10[1] = {10}; /* dataspace extent */
char buffer[10] = ""; /* to inspect string attribute */
int a_out = 0;
char filename[512] = "";
hid_t int_type_id = -1;
hid_t char_type_id = -1;
hid_t dcpl_id = -1;
hid_t dspace_id = -1;
hid_t dspace_scalar_id = -1;
hid_t dset_id = -1;
hid_t mindset_id = -1;
hid_t attr_1_id = -1;
hid_t attr_1a_id = -1;
hid_t attr_2_id = -1;
hid_t attr_2a_id = -1;
hid_t attr_3_id = -1;
hid_t attr_3a_id = -1;
hid_t file_id = -1;
herr_t ret;
int count = 0;
TESTING("attribute additions to [un]minimized dataset")
/*********
* SETUP *
*********/
if(h5_fixname(OHMIN_FILENAME_A, H5P_DEFAULT, filename, sizeof(filename)) == NULL)
TEST_ERROR
dspace_id = H5Screate_simple(1, array_10, NULL);
if(dspace_id < 0) TEST_ERROR
dspace_scalar_id = H5Screate(H5S_SCALAR);
if(dspace_scalar_id < 0) TEST_ERROR
char_type_id = H5Tcopy(H5T_NATIVE_CHAR);
if(char_type_id < 0) TEST_ERROR
int_type_id = H5Tcopy(H5T_NATIVE_INT);
if(int_type_id < 0) TEST_ERROR
dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_id, TRUE);
if(ret < 0) TEST_ERROR
file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
if(file_id < 0) TEST_ERROR
H5E_BEGIN_TRY {
count = count_attributes(dset_id);
} H5E_END_TRY;
if(count != -1) TEST_ERROR
dset_id = H5Dcreate(file_id, "dataset", int_type_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if(dset_id < 0) TEST_ERROR
mindset_id = H5Dcreate(file_id, "mindataset", int_type_id, dspace_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT);
if(mindset_id < 0) TEST_ERROR
/********************
* TEST/DEMONSTRATE *
********************/
/* -------------------
* no attributes added
*/
count = count_attributes(dset_id);
if(count != 0) TEST_ERROR
count = count_attributes(mindset_id);
if(count != 0) TEST_ERROR
/* -----------------
* add one attribute
*/
ret = put_attribute(dset_id, "PURPOSE", "DEMO", char_type_id, dspace_id, &attr_1_id);
if(ret < 0) TEST_ERROR
ret = put_attribute(mindset_id, "PURPOSE", "DEMO", char_type_id, dspace_id, &attr_1a_id);
if(ret < 0) TEST_ERROR
count = count_attributes(dset_id);
if(count != 1) TEST_ERROR
count = count_attributes(mindset_id);
if(count != 1) TEST_ERROR
ret = H5Aread(attr_1_id, char_type_id, buffer);
if(ret < 0) TEST_ERROR
if(HDstrcmp("DEMO", buffer)) TEST_ERROR
ret = H5Aread(attr_1a_id, char_type_id, buffer);
if(ret < 0) TEST_ERROR
if(HDstrcmp("DEMO", buffer)) TEST_ERROR
/* -----------------
* modify one attribute
*/
ret = put_attribute(dset_id, "PURPOSE", "REWRITE", char_type_id, -1, &attr_1_id);
if(ret < 0) TEST_ERROR
ret = put_attribute(mindset_id, "PURPOSE", "REWRITE", char_type_id, -1, &attr_1a_id);
if(ret < 0) TEST_ERROR
count = count_attributes(dset_id);
if(count != 1) TEST_ERROR
count = count_attributes(mindset_id);
if(count != 1) TEST_ERROR
ret = H5Aread(attr_1_id, char_type_id, buffer);
if(ret < 0) TEST_ERROR
if(HDstrcmp("REWRITE", buffer)) TEST_ERROR
ret = H5Aread(attr_1a_id, char_type_id, buffer);
if(ret < 0) TEST_ERROR
if(HDstrcmp("REWRITE", buffer)) TEST_ERROR
/* -----------------
* add second attribute
*/
a_out = 5;
ret = put_attribute(dset_id, "RANK", &a_out, int_type_id, dspace_scalar_id, &attr_2_id);
if(ret < 0) TEST_ERROR
a_out = 3;
ret = put_attribute(mindset_id, "RANK", &a_out, int_type_id, dspace_scalar_id, &attr_2a_id);
if(ret < 0) TEST_ERROR
count = count_attributes(dset_id);
if(count != 2) TEST_ERROR
count = count_attributes(mindset_id);
if(count != 2) TEST_ERROR
ret = H5Aread(attr_2_id, int_type_id, &a_out);
if(ret < 0) TEST_ERROR
if(a_out != 5) TEST_ERROR
ret = H5Aread(attr_2a_id, int_type_id, &a_out);
if(ret < 0) TEST_ERROR
if(a_out != 3) TEST_ERROR
/* -----------------
* add third attribute
*/
a_out = -86;
ret = put_attribute(dset_id, "FLAVOR", &a_out, int_type_id, dspace_scalar_id, &attr_3_id);
if(ret < 0) TEST_ERROR
a_out = 2185;
ret = put_attribute(mindset_id, "FLAVOR", &a_out, int_type_id, dspace_scalar_id, &attr_3a_id);
if(ret < 0) TEST_ERROR
count = count_attributes(dset_id);
if(count != 3) TEST_ERROR
count = count_attributes(mindset_id);
if(count != 3) TEST_ERROR
ret = H5Aread(attr_3_id, int_type_id, &a_out);
if(ret < 0) TEST_ERROR
if(a_out != -86) TEST_ERROR
ret = H5Aread(attr_3a_id, int_type_id, &a_out);
if(ret < 0) TEST_ERROR
if(a_out != 2185) TEST_ERROR
/************
* TEARDOWN *
************/
if(H5Tclose(int_type_id) < 0) TEST_ERROR
if(H5Tclose(char_type_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_id) < 0) TEST_ERROR
if(H5Sclose(dspace_id) < 0) TEST_ERROR
if(H5Dclose(dset_id) < 0) TEST_ERROR
if(H5Dclose(mindset_id) < 0) TEST_ERROR
if(H5Aclose(attr_1_id) < 0) TEST_ERROR
if(H5Aclose(attr_1a_id) < 0) TEST_ERROR
if(H5Aclose(attr_2_id) < 0) TEST_ERROR
if(H5Aclose(attr_2a_id) < 0) TEST_ERROR
if(H5Aclose(attr_3_id) < 0) TEST_ERROR
if(H5Aclose(attr_3a_id) < 0) TEST_ERROR
if(H5Fclose(file_id) < 0) TEST_ERROR
PASSED()
return SUCCEED;
error :
H5E_BEGIN_TRY {
(void)H5Tclose(int_type_id);
(void)H5Tclose(char_type_id);
(void)H5Pclose(dcpl_id);
(void)H5Sclose(dspace_id);
(void)H5Dclose(dset_id);
(void)H5Dclose(mindset_id);
(void)H5Aclose(attr_1_id);
(void)H5Aclose(attr_1a_id);
(void)H5Aclose(attr_2_id);
(void)H5Aclose(attr_2a_id);
(void)H5Aclose(attr_3_id);
(void)H5Aclose(attr_3a_id);
(void)H5Fclose(file_id);
} H5E_END_TRY;
return FAIL;
} /* test_minimized_oh_attribute_addition */
/* ---------------------------------------------------------------------------
* Compare header sizes against when headers have been minimized.
* ---------------------------------------------------------------------------
*/
static herr_t
test_minimized_oh_size_comparisons(void)
{
hsize_t array_10[1] = {10}; /* dataspace extents */
/* IDs that are file-agnostic */
hid_t dspace_id = -1;
hid_t int_type_id = -1;
hid_t dcpl_minimize = -1;
hid_t dcpl_dontmin = -1;
/* IDs for non-minimzed file open */
hid_t file_f_id = -1; /* lower 'f' for standard file setting */
hid_t dset_f_x_id = -1; /* 'x' for default */
hid_t dset_f_N_id = -1; /* 'N' for explcit non-minimized dset */
hid_t dset_f_Y_id = -1; /* 'Y' for minimzed dset */
/* IDs for minimzed file open */
hid_t file_F_id = -1; /* upper 'F' for minimzed file setting */
hid_t dset_F_x_id = -1; /* 'x' for default */
hid_t dset_F_N_id = -1; /* 'N' for explcit non-minimized dset */
hid_t dset_F_Y_id = -1; /* 'Y' for minimzed dset */
char filename_a[512] = "";
char filename_b[512] = "";
herr_t ret;
TESTING("default size comparisons");
/*********
* SETUP *
*********/
if(h5_fixname(OHMIN_FILENAME_A, H5P_DEFAULT, filename_a, sizeof(filename_a)) == NULL)
TEST_ERROR
if(h5_fixname(OHMIN_FILENAME_B, H5P_DEFAULT, filename_b, sizeof(filename_b)) == NULL)
TEST_ERROR
dcpl_minimize = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_minimize < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_minimize, TRUE);
if(ret < 0) TEST_ERROR
dcpl_dontmin = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_dontmin < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_dontmin, FALSE);
if(ret < 0) TEST_ERROR
dspace_id = H5Screate_simple(1, array_10, NULL);
if(dspace_id < 0) TEST_ERROR
int_type_id = H5Tcopy(H5T_NATIVE_INT);
if(int_type_id < 0) TEST_ERROR
file_f_id = H5Fcreate(filename_a, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
if(file_f_id < 0) TEST_ERROR
dset_f_x_id = H5Dcreate(file_f_id, "default", int_type_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if(dset_f_x_id < 0) TEST_ERROR
dset_f_N_id = H5Dcreate(file_f_id, "dsetNOT", int_type_id, dspace_id, H5P_DEFAULT, dcpl_dontmin, H5P_DEFAULT);
if(dset_f_N_id < 0) TEST_ERROR
dset_f_Y_id = H5Dcreate(file_f_id, "dsetMIN", int_type_id, dspace_id, H5P_DEFAULT, dcpl_minimize, H5P_DEFAULT);
if(dset_f_x_id < 0) TEST_ERROR
file_F_id = H5Fcreate(filename_b, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
if(file_F_id < 0) TEST_ERROR
ret = H5Fset_dset_no_attrs_hint(file_F_id, TRUE);
if(ret < 0) TEST_ERROR
dset_F_x_id = H5Dcreate(file_F_id, "default", int_type_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if(dset_F_x_id < 0) TEST_ERROR
dset_F_N_id = H5Dcreate(file_F_id, "dsetNOT", int_type_id, dspace_id, H5P_DEFAULT, dcpl_dontmin, H5P_DEFAULT);
if(dset_F_N_id < 0) TEST_ERROR
dset_F_Y_id = H5Dcreate(file_F_id, "dsetMIN", int_type_id, dspace_id, H5P_DEFAULT, dcpl_minimize, H5P_DEFAULT);
if(dset_F_Y_id < 0) TEST_ERROR
/*********
* TESTS *
*********/
if(oh_compare(dset_f_x_id, dset_f_x_id) != EQ) TEST_ERROR /* identity */
if(oh_compare(dset_f_x_id, dset_f_N_id) != EQ) TEST_ERROR
if(oh_compare(dset_f_x_id, dset_f_Y_id) != GT) TEST_ERROR
if(oh_compare(dset_f_N_id, dset_f_Y_id) != GT) TEST_ERROR
if(oh_compare(dset_F_x_id, dset_F_N_id) != EQ) TEST_ERROR
if(oh_compare(dset_F_x_id, dset_F_Y_id) != EQ) TEST_ERROR
if(oh_compare(dset_F_N_id, dset_F_Y_id) != EQ) TEST_ERROR
if(oh_compare(dset_F_x_id, dset_f_Y_id) != EQ) TEST_ERROR
if(oh_compare(dset_F_x_id, dset_f_x_id) != LT) TEST_ERROR
/************
* TEARDOWN *
************/
if(H5Sclose(dspace_id) < 0) TEST_ERROR
if(H5Tclose(int_type_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_minimize) < 0) TEST_ERROR
if(H5Pclose(dcpl_dontmin) < 0) TEST_ERROR
if(H5Fclose(file_f_id) < 0) TEST_ERROR
if(H5Dclose(dset_f_x_id) < 0) TEST_ERROR
if(H5Dclose(dset_f_N_id) < 0) TEST_ERROR
if(H5Dclose(dset_f_Y_id) < 0) TEST_ERROR
if(H5Fclose(file_F_id) < 0) TEST_ERROR
if(H5Dclose(dset_F_x_id) < 0) TEST_ERROR
if(H5Dclose(dset_F_N_id) < 0) TEST_ERROR
if(H5Dclose(dset_F_Y_id) < 0) TEST_ERROR
PASSED()
return SUCCEED;
error :
H5E_BEGIN_TRY {
(void)H5Pclose(dcpl_minimize);
(void)H5Pclose(dcpl_dontmin);
(void)H5Sclose(dspace_id);
(void)H5Tclose(int_type_id);
(void)H5Fclose(file_f_id);
(void)H5Dclose(dset_f_x_id);
(void)H5Dclose(dset_f_N_id);
(void)H5Dclose(dset_f_Y_id);
(void)H5Fclose(file_F_id);
(void)H5Dclose(dset_F_x_id);
(void)H5Dclose(dset_F_N_id);
(void)H5Dclose(dset_F_Y_id);
} H5E_END_TRY;
return FAIL;
} /* test_minimized_oh_size_comparisons */
/* ---------------------------------------------------------------------------
* Test minimized dataset object header with filter/pipeline message
* ---------------------------------------------------------------------------
*/
static herr_t
test_minimized_oh_with_filter(void)
{
char filename[512] = "";
const hsize_t extents[1] = {1024}; /* extents of dataspace */
const unsigned filter_values[] = {0}; /* TBD */
const hsize_t chunk_dim[] = {32}; /* needed for filter */
const int ndims = 1;
hid_t dspace_id = -1;
hid_t dtype_id = -1;
hid_t dcpl_xZ_id = -1;
hid_t dcpl_mx_id = -1;
hid_t dcpl_mZ_id = -1;
hid_t dset_xx_id = -1;
hid_t dset_xZ_id = -1;
hid_t dset_mx_id = -1;
hid_t dset_mZ_id = -1;
hid_t file_id = -1;
herr_t ret;
/* | default | minimize
* ----------+---------+---------
* no filter | xx | mx
* ----------+---------+---------
* filter | xZ | mZ
*/
TESTING("with filter message");
/*********
* SETUP *
*********/
if(h5_fixname(OHMIN_FILENAME_A, H5P_DEFAULT, filename, sizeof(filename)) == NULL)
TEST_ERROR
dcpl_mx_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_mx_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_mx_id, TRUE);
if(ret < 0) TEST_ERROR
dcpl_xZ_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_xZ_id < 0) TEST_ERROR
ret = H5Pset_chunk(dcpl_xZ_id, ndims, chunk_dim);
if(ret < 0) TEST_ERROR
ret = H5Pset_filter(dcpl_xZ_id, H5Z_FILTER_DEFLATE, H5Z_FLAG_OPTIONAL, 0, filter_values);
if(ret < 0) TEST_ERROR
dcpl_mZ_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_mZ_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_mZ_id, TRUE);
if(ret < 0) TEST_ERROR
ret = H5Pset_chunk(dcpl_mZ_id, ndims, chunk_dim);
if(ret < 0) TEST_ERROR
ret = H5Pset_filter( dcpl_mZ_id, H5Z_FILTER_DEFLATE, H5Z_FLAG_OPTIONAL, 0, filter_values);
if(ret < 0) TEST_ERROR
dspace_id = H5Screate_simple(1, extents, extents);
if(dspace_id < 0) TEST_ERROR
dtype_id = H5Tcopy(H5T_NATIVE_INT);
if(dtype_id < 0) TEST_ERROR
file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
if(file_id < 0) TEST_ERROR
dset_xx_id = H5Dcreate(file_id, "xx", dtype_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if(dset_xx_id < 0) TEST_ERROR
dset_mx_id = H5Dcreate(file_id, "Mx", dtype_id, dspace_id, H5P_DEFAULT, dcpl_mx_id, H5P_DEFAULT);
if(dset_mx_id < 0) TEST_ERROR
dset_xZ_id = H5Dcreate(file_id, "xZ", dtype_id, dspace_id, H5P_DEFAULT, dcpl_xZ_id, H5P_DEFAULT);
if(dset_xZ_id < 0) TEST_ERROR
dset_mZ_id = H5Dcreate(file_id, "MZ", dtype_id, dspace_id, H5P_DEFAULT, dcpl_mZ_id, H5P_DEFAULT);
if(dset_mZ_id < 0) TEST_ERROR
/*********
* TESTS *
*********/
if(oh_compare(dset_mx_id, dset_xx_id) != LT) TEST_ERROR
if(oh_compare(dset_mx_id, dset_xZ_id) != LT) TEST_ERROR
if(oh_compare(dset_mZ_id, dset_mx_id) != GT) TEST_ERROR
if(oh_compare(dset_mZ_id, dset_xZ_id) != LT) TEST_ERROR
/************
* TEARDOWN *
************/
if(H5Sclose(dspace_id) < 0) TEST_ERROR
if(H5Tclose(dtype_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_xZ_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_mx_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_mZ_id) < 0) TEST_ERROR
if(H5Dclose(dset_xx_id) < 0) TEST_ERROR
if(H5Dclose(dset_xZ_id) < 0) TEST_ERROR
if(H5Dclose(dset_mx_id) < 0) TEST_ERROR
if(H5Dclose(dset_mZ_id) < 0) TEST_ERROR
if(H5Fclose(file_id) < 0) TEST_ERROR
PASSED()
return SUCCEED;
error:
H5E_BEGIN_TRY {
(void)H5Sclose(dspace_id);
(void)H5Tclose(dtype_id);
(void)H5Pclose(dcpl_xZ_id);
(void)H5Pclose(dcpl_mx_id);
(void)H5Pclose(dcpl_mZ_id);
(void)H5Dclose(dset_xx_id);
(void)H5Dclose(dset_xZ_id);
(void)H5Dclose(dset_mx_id);
(void)H5Dclose(dset_mZ_id);
(void)H5Fclose(file_id);
} H5E_END_TRY;
return FAIL;
} /* test_minimized_oh_with_filter */
/* ---------------------------------------------------------------------------
* Test minimized dataset object header and recording modification times.
* ---------------------------------------------------------------------------
*/
static herr_t
test_minimized_oh_modification_times(void)
{
/* test-local structure for parameterized testing
*/
struct testcase {
unsigned oh_version;
};
char filename[512] = "";
const hsize_t extents[1] = {128}; /* extents of dataspace */
hid_t dspace_id = -1;
hid_t dtype_id = -1;
hid_t dcpl_xT_id = -1; /* Track modtime */
hid_t dcpl_mx_id = -1; /* minimized */
hid_t dcpl_mT_id = -1; /* minimized, Track */
hid_t dcpl_mN_id = -1; /* minimized, do Not track */
hid_t dset_xx_id = -1;
hid_t dset_xT_id = -1;
hid_t dset_mx_id = -1;
hid_t dset_mT_id = -1;
hid_t dset_mN_id = -1;
hid_t file_id = -1;
hid_t fapl_id = -1;
herr_t ret;
unsigned i = 0; /* for testcase loop */
unsigned n_cases = 2; /* must match `cases` array size below */
struct testcase cases[2] = {
{ 1, }, /* version 1 object header */
{ 2, }, /* version 2 object header */
};
TESTING("with modification times");
/*********
* SETUP *
*********/
if(h5_fixname(OHMIN_FILENAME_A, H5P_DEFAULT, filename, sizeof(filename)) == NULL)
TEST_ERROR
dcpl_mx_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_mx_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_mx_id, TRUE);
if(ret < 0) TEST_ERROR
dcpl_xT_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_xT_id < 0) TEST_ERROR
ret = H5Pset_obj_track_times(dcpl_xT_id, TRUE);
if(ret < 0) TEST_ERROR
dcpl_mT_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_mT_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_mT_id, TRUE);
if(ret < 0) TEST_ERROR
ret = H5Pset_obj_track_times(dcpl_mT_id, TRUE);
if(ret < 0) TEST_ERROR
dcpl_mN_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_mN_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_mN_id, TRUE);
if(ret < 0) TEST_ERROR
ret = H5Pset_obj_track_times(dcpl_mN_id, FALSE);
if(ret < 0) TEST_ERROR
dspace_id = H5Screate_simple(1, extents, extents);
if(dspace_id < 0) TEST_ERROR
dtype_id = H5Tcopy(H5T_NATIVE_INT);
if(dtype_id < 0) TEST_ERROR
for (i = 0; i < n_cases; i++) {
/* -------------- *
* per-case setup *
* -------------- */
fapl_id = H5P_DEFAULT;
if(cases[i].oh_version > 1) {
fapl_id = H5Pcreate(H5P_FILE_ACCESS);
if(fapl_id < 0) TEST_ERROR
ret = H5Pset_libver_bounds(fapl_id, H5F_LIBVER_V18, H5F_LIBVER_V110);
if(ret < 0) TEST_ERROR
}
file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id);
if(file_id < 0) TEST_ERROR
dset_xx_id = H5Dcreate( file_id, "xx", dtype_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
if(dset_xx_id < 0) TEST_ERROR
dset_mx_id = H5Dcreate(file_id, "mx", dtype_id, dspace_id, H5P_DEFAULT, dcpl_mx_id, H5P_DEFAULT);
if(dset_mx_id < 0) TEST_ERROR
dset_xT_id = H5Dcreate(file_id, "xT", dtype_id, dspace_id, H5P_DEFAULT, dcpl_xT_id, H5P_DEFAULT);
if(dset_xT_id < 0) TEST_ERROR
dset_mT_id = H5Dcreate(file_id, "mT", dtype_id, dspace_id, H5P_DEFAULT, dcpl_mT_id, H5P_DEFAULT);
if(dset_mT_id < 0) TEST_ERROR
dset_mN_id = H5Dcreate(file_id, "mN", dtype_id, dspace_id, H5P_DEFAULT, dcpl_mN_id, H5P_DEFAULT);
if(dset_mN_id < 0) TEST_ERROR
/* ----- *
* TESTS *
* ----- */
/* sanity check */
if(oh_compare(dset_mx_id, dset_xx_id) != LT) TEST_ERROR
if(oh_compare(dset_mx_id, dset_xT_id) != LT) TEST_ERROR
if(oh_compare(dset_xx_id, dset_xT_id) != EQ) TEST_ERROR
if(oh_compare(dset_mx_id, dset_mT_id) != EQ) TEST_ERROR
if(oh_compare(dset_mN_id, dset_mT_id) != LT) TEST_ERROR
if(oh_compare(dset_mT_id, dset_xT_id) != LT) TEST_ERROR
/* ----------------- *
* per-case teardown *
* ----------------- */
if(H5Dclose(dset_xx_id) < 0) TEST_ERROR
if(H5Dclose(dset_xT_id) < 0) TEST_ERROR
if(H5Dclose(dset_mx_id) < 0) TEST_ERROR
if(H5Dclose(dset_mT_id) < 0) TEST_ERROR
if(H5Dclose(dset_mN_id) < 0) TEST_ERROR
if(H5Fclose(file_id) < 0) TEST_ERROR
if((fapl_id != H5P_DEFAULT) && (H5Pclose(fapl_id) < 0))
TEST_ERROR
} /* for each version tested */
/************
* TEARDOWN *
************/
if(H5Sclose(dspace_id) < 0) TEST_ERROR
if(H5Tclose(dtype_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_xT_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_mx_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_mT_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_mN_id) < 0) TEST_ERROR
PASSED()
return SUCCEED;
error:
H5E_BEGIN_TRY {
(void)H5Sclose(dspace_id);
(void)H5Tclose(dtype_id);
(void)H5Pclose(dcpl_xT_id);
(void)H5Pclose(dcpl_mx_id);
(void)H5Pclose(dcpl_mT_id);
(void)H5Pclose(dcpl_mN_id);
(void)H5Dclose(dset_xx_id);
(void)H5Dclose(dset_xT_id);
(void)H5Dclose(dset_mx_id);
(void)H5Dclose(dset_mT_id);
(void)H5Dclose(dset_mN_id);
(void)H5Fclose(file_id);
(void)H5Pclose(fapl_id);
} H5E_END_TRY;
return FAIL;
} /* test_minimized_oh_modification_times */
/* ---------------------------------------------------------------------------
* Test minimized dataset object header with a fill value set.
* ---------------------------------------------------------------------------
*/
static herr_t
test_minimized_oh_fillvalue_backwards_compatability(void)
{
char filename[512] = "";
const hsize_t extents[1] = {64}; /* extents of dataspace */
const int fill[1] = {343}; /* fill value of dataset */
hid_t file_id = -1;
hid_t dtype_id = -1;
hid_t dspace_id = -1;
hid_t dcpl_id = -1;
hid_t fapl_id = -1;
hid_t dset_0_id = -1;
hid_t dset_1_id = -1;
herr_t ret;
/*********
* SETUP *
*********/
TESTING("with fill values and different libver support");
if(h5_fixname(OHMIN_FILENAME_A, H5P_DEFAULT, filename, sizeof(filename)) == NULL)
TEST_ERROR
dspace_id = H5Screate_simple(1, extents, extents);
if(dspace_id < 0) TEST_ERROR
dtype_id = H5Tcopy(H5T_NATIVE_INT);
if(dtype_id < 0) TEST_ERROR
dcpl_id = H5Pcreate(H5P_DATASET_CREATE);
if(dcpl_id < 0) TEST_ERROR
ret = H5Pset_dset_no_attrs_hint(dcpl_id, TRUE);
if(ret == FAIL) TEST_ERROR;
ret = H5Pset_fill_value(dcpl_id, dtype_id, fill);
if(ret == FAIL) TEST_ERROR;
fapl_id = H5Pcreate(H5P_FILE_ACCESS);
if(fapl_id < 0) TEST_ERROR
ret = H5Pset_libver_bounds(fapl_id, H5F_LIBVER_EARLIEST, H5F_LIBVER_LATEST);
if(ret == FAIL) TEST_ERROR;
file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id);
if(file_id < 0) TEST_ERROR
dset_0_id = H5Dcreate(file_id, "fullrange", dtype_id, dspace_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT);
if(dset_0_id < 0) TEST_ERROR
/* Close file and re-open with different libver bounds.
* Dataset "fullrange" must also be closed for expected reopen behavior.
*/
if(H5Fclose(file_id) < 0) TEST_ERROR;
if(H5Dclose(dset_0_id) < 0) TEST_ERROR
ret = H5Pset_libver_bounds(fapl_id, H5F_LIBVER_V18, H5F_LIBVER_LATEST);
if(ret == FAIL) TEST_ERROR;
file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id);
if(file_id < 0) TEST_ERROR
dset_1_id = H5Dcreate(file_id, "upperrange", dtype_id, dspace_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT);
if(dset_1_id < 0) TEST_ERROR
/* re-open "fullrange" dataset
*/
dset_0_id = H5Dopen2(file_id, "fullrange", H5P_DEFAULT);
if(dset_0_id < 0) TEST_ERROR
/*********
* TESTS *
*********/
/* dset not supporting pre-1.08 should be smaller? */
if(oh_compare(dset_1_id, dset_0_id) != LT) TEST_ERROR
/************
* TEARDOWN *
************/
if(H5Sclose(dspace_id) < 0) TEST_ERROR
if(H5Tclose(dtype_id) < 0) TEST_ERROR
if(H5Pclose(dcpl_id) < 0) TEST_ERROR
if(H5Pclose(fapl_id) < 0) TEST_ERROR
if(H5Dclose(dset_0_id) < 0) TEST_ERROR
if(H5Dclose(dset_1_id) < 0) TEST_ERROR
if(H5Fclose(file_id) < 0) TEST_ERROR;
PASSED()
return SUCCEED;
error:
H5E_BEGIN_TRY {
(void)H5Sclose(dspace_id);
(void)H5Tclose(dtype_id);
(void)H5Pclose(dcpl_id);
(void)H5Pclose(fapl_id);
(void)H5Dclose(dset_0_id);
(void)H5Dclose(dset_1_id);
(void)H5Fclose(file_id);
} H5E_END_TRY;
return FAIL;
} /* test_minimized_oh_fillvalue_backwards_compatability */
/********
* MAIN *
********/
/* ---------------------------------------------------------------------------
* Main function is main. Runs tests.
*
* Returns number of failed tests.
* ---------------------------------------------------------------------------
*/
int
main(void)
{
int nerrors = 0;
HDprintf("Testing minimized dataset object headers.\n");
nerrors += test_minimized_oh_attribute_addition();
nerrors += test_minimized_oh_size_comparisons();
nerrors += test_minimized_oh_with_filter();
nerrors += test_minimized_oh_modification_times();
nerrors += test_minimized_oh_fillvalue_backwards_compatability();
if(nerrors < 0)
HDprintf("***** %d MINIMIZED DATASET OHDR TEST%s FAILED! *****\n", nerrors, nerrors > 1 ? "S" : "");
else
HDprintf("All minimized dataset object header tests passed.\n");
return nerrors;
} /* main */