summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--MANIFEST1
-rw-r--r--src/H5F.c2
-rw-r--r--src/H5Fint.c24
-rw-r--r--src/H5Fprivate.h4
-rw-r--r--src/H5Fpublic.h3
-rw-r--r--src/H5VLnative.c23
-rw-r--r--src/H5VLpublic.h3
-rw-r--r--src/H5trace.c3
-rw-r--r--test/Makefile.am2
-rw-r--r--test/ohdr.c863
-rw-r--r--test/ohdr_mindset.c944
11 files changed, 906 insertions, 966 deletions
diff --git a/MANIFEST b/MANIFEST
index c2d801a..d840e73 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -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
diff --git a/src/H5F.c b/src/H5F.c
index 123a107..3325ed5 100644
--- a/src/H5F.c
+++ b/src/H5F.c
@@ -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
diff --git a/src/H5Fint.c b/src/H5Fint.c
index b212657..46ed62a 100644
--- a/src/H5Fint.c
+++ b/src/H5Fint.c
@@ -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() */
+
diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h
index 788bac2..b9ed163 100644
--- a/src/H5Fprivate.h
+++ b/src/H5Fprivate.h
@@ -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 */
diff --git a/src/H5Fpublic.h b/src/H5Fpublic.h
index 3795a68..36143a7 100644
--- a/src/H5Fpublic.h
+++ b/src/H5Fpublic.h
@@ -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;
diff --git a/src/H5VLnative.c b/src/H5VLnative.c
index 2b0f01f..0d82f38 100644
--- a/src/H5VLnative.c
+++ b/src/H5VLnative.c
@@ -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);
diff --git a/src/H5VLpublic.h b/src/H5VLpublic.h
index 5e5c6b0..5de36c8 100644
--- a/src/H5VLpublic.h
+++ b/src/H5VLpublic.h
@@ -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 */
diff --git a/src/H5trace.c b/src/H5trace.c
index 6bb6f02..9a13193 100644
--- a/src/H5trace.c
+++ b/src/H5trace.c
@@ -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;
diff --git a/test/Makefile.am b/test/Makefile.am
index cb2156e..8ed10a4 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -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 \
diff --git a/test/ohdr.c b/test/ohdr.c
index cca7e7e..85ac1db 100644
--- a/test/ohdr.c
+++ b/test/ohdr.c
@@ -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 */
diff --git a/test/ohdr_mindset.c b/test/ohdr_mindset.c
deleted file mode 100644
index 5970a6d..0000000
--- a/test/ohdr_mindset.c
+++ /dev/null
@@ -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 */
-
-