summaryrefslogtreecommitdiffstats
path: root/test/objcopy.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/objcopy.c')
-rwxr-xr-xtest/objcopy.c131
1 files changed, 77 insertions, 54 deletions
diff --git a/test/objcopy.c b/test/objcopy.c
index 27a29d1..f9e181b 100755
--- a/test/objcopy.c
+++ b/test/objcopy.c
@@ -32,8 +32,6 @@
#include "H5Spkg.h" /* Dataspaces */
#include "H5Dprivate.h" /* Datasets (for EFL property name) */
-#include "H5Fprivate.h" /* File access */
-#include "H5Iprivate.h" /* IDs */
const char *FILENAME[] = {
@@ -99,7 +97,7 @@ const char *FILENAME[] = {
#define NAME_BUF_SIZE 1024
#define NUM_ATTRIBUTES 4
-#define ATTR_NAME_LEN 40
+#define ATTR_NAME_LEN 80
#define DIM_SIZE_1 12
#define DIM_SIZE_2 6
#define CHUNK_SIZE_1 5 /* Not an even fraction of dimension sizes, so we test copying partial chunks */
@@ -120,7 +118,8 @@ static struct {
/* Local function prototypes */
static int
-compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts, const void *buf1, const void *buf2);
+compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts,
+ const void *buf1, const void *buf2, hid_t obj_owner);
static int
compare_datasets(hid_t did, hid_t did2, hid_t pid, const void *wbuf);
static int
@@ -309,31 +308,37 @@ attach_reg_ref_attr(hid_t file_id, hid_t loc_id)
int rank = 2;
int rankr =1;
hdset_reg_ref_t ref[2];
- int data[2][9] = {{1,1,2,3,3,4,5,5,6},{1,2,2,3,4,4,5,6,6}};
- hsize_t start[2];
- hsize_t count[2];
+ int data[2][9] = {{1,1,2,3,3,4,5,5,999},{1,2,2,3,4,4,5,6,999}};
+ hsize_t start[2] = {0, 3};
+ hsize_t count[2] = {2, 3};
hsize_t coord[3][2] = {{0, 0}, {1, 6}, {0, 8}};
size_t num_points = 3;
+ /* create a 2D dataset */
if((space_id = H5Screate_simple(rank, dims, NULL)) < 0) TEST_ERROR
if((spacer_id = H5Screate_simple(rankr, dimsr, NULL)) < 0) TEST_ERROR
if((dsetv_id = H5Dcreate(file_id, dsetnamev, H5T_NATIVE_INT, space_id, H5P_DEFAULT)) < 0) TEST_ERROR
if(H5Dwrite(dsetv_id, H5T_NATIVE_INT, H5S_ALL , H5S_ALL, H5P_DEFAULT,data) < 0) TEST_ERROR
- start[0] = 0;
- start[1] = 3;
- count[0] = 2;
- count[1] = 3;
+ /* create reg_ref of block selection */
if(H5Sselect_hyperslab(space_id,H5S_SELECT_SET,start,NULL,count,NULL) < 0) TEST_ERROR
if(H5Rcreate(&ref[0], file_id, dsetnamev, H5R_DATASET_REGION, space_id) < 0) TEST_ERROR
+
+ /* create reg_ref of point selection */
if(H5Sselect_none(space_id) < 0) TEST_ERROR
if(H5Sselect_elements(space_id, H5S_SELECT_SET, num_points, (const hsize_t **)coord) < 0) TEST_ERROR
if(H5Rcreate(&ref[1], file_id, dsetnamev, H5R_DATASET_REGION, space_id) < 0) TEST_ERROR
+ /* create reg_ref attribute */
if((aid = H5Acreate(loc_id, "reg_ref_attr", H5T_STD_REF_DSETREG, spacer_id, H5P_DEFAULT)) < 0) TEST_ERROR
if(H5Awrite(aid, H5T_STD_REF_DSETREG, ref) < 0) TEST_ERROR
+ /* attach the reg_ref attribute to the dataset itself */
+ if(H5Aclose(aid) < 0) TEST_ERROR
+ if((aid = H5Acreate(dsetv_id, "reg_ref_attr", H5T_STD_REF_DSETREG, spacer_id, H5P_DEFAULT)) < 0) TEST_ERROR
+ if(H5Awrite(aid, H5T_STD_REF_DSETREG, ref) < 0) TEST_ERROR
+ if(H5Sclose(spacer_id) < 0) TEST_ERROR
if(H5Sclose(space_id) < 0) TEST_ERROR
if(H5Dclose(dsetv_id) < 0) TEST_ERROR
if(H5Aclose(aid) < 0) TEST_ERROR
@@ -343,6 +348,7 @@ attach_reg_ref_attr(hid_t file_id, hid_t loc_id)
error:
H5E_BEGIN_TRY {
+ H5Sclose(spacer_id);
H5Sclose(space_id);
H5Dclose(dsetv_id);
H5Aclose(aid);
@@ -628,7 +634,7 @@ done:
*-------------------------------------------------------------------------
*/
static int
-compare_attribute(hid_t aid, hid_t aid2, hid_t pid, const void *wbuf)
+compare_attribute(hid_t aid, hid_t aid2, hid_t pid, const void *wbuf, hid_t obj_owner)
{
hid_t sid = -1, sid2 = -1; /* Dataspace IDs */
hid_t tid = -1, tid2 = -1; /* Datatype IDs */
@@ -686,12 +692,12 @@ compare_attribute(hid_t aid, hid_t aid2, hid_t pid, const void *wbuf)
/* Check raw data read in against data written out */
if(wbuf) {
- if(!compare_data(aid, 0, pid, tid, (size_t)nelmts, wbuf, rbuf)) TEST_ERROR
- if(!compare_data(aid2, 0, pid, tid2, (size_t)nelmts, wbuf, rbuf2)) TEST_ERROR
+ if(!compare_data(aid, 0, pid, tid, (size_t)nelmts, wbuf, rbuf, obj_owner)) TEST_ERROR
+ if(!compare_data(aid2, 0, pid, tid2, (size_t)nelmts, wbuf, rbuf2, obj_owner)) TEST_ERROR
} /* end if */
/* Don't have written data, just compare data between the two attributes */
else
- if(!compare_data(aid, aid2, pid, tid, (size_t)nelmts, rbuf, rbuf2)) TEST_ERROR
+ if(!compare_data(aid, aid2, pid, tid, (size_t)nelmts, rbuf, rbuf2, obj_owner)) TEST_ERROR
/* Reclaim vlen data, if necessary */
if(H5Tdetect_class(tid, H5T_VLEN) == TRUE)
@@ -745,6 +751,10 @@ error:
* Note: This isn't very general, the attributes are assumed to be
* those written in test_copy_attach_attributes().
*
+ * Modifier: Peter Cao
+ * Wednesday, March 21, 2007
+ * Change to compare any attributes of two objects
+ *
*-------------------------------------------------------------------------
*/
static int
@@ -754,7 +764,6 @@ compare_std_attributes(hid_t oid, hid_t oid2, hid_t pid)
int num_attrs; /* Number of attributes */
int num_attrs2; /* Number of attributes */
char attr_name[ATTR_NAME_LEN]; /* Attribute name */
- int wattr_data[2]; /* Attribute buffer for writing */
unsigned cpy_flags; /* Object copy flags */
unsigned i; /* Local index variable */
@@ -781,18 +790,13 @@ compare_std_attributes(hid_t oid, hid_t oid2, hid_t pid)
/* Check the attributes are equal */
for(i = 0; i < (unsigned)num_attrs; i++) {
- sprintf(attr_name, "%d attr", i);
-
- /* Set up attribute data buffers */
- wattr_data[0] = 100 * i;
- wattr_data[1] = 200 * i;
+ if ( (aid = H5Aopen_idx(oid, i) ) < 0 ) TEST_ERROR
+ if ( H5Aget_name(aid, ATTR_NAME_LEN, attr_name ) < 0) TEST_ERROR
- /* Open the attributes */
- if((aid = H5Aopen_name(oid, attr_name)) < 0) TEST_ERROR
if((aid2 = H5Aopen_name(oid2, attr_name)) < 0) TEST_ERROR
/* Check the attributes are equal */
- if(!compare_attribute(aid, aid2, pid, wattr_data)) TEST_ERROR
+ if(!compare_attribute(aid, aid2, pid, NULL, oid)) TEST_ERROR
/* Close the attributes */
if(H5Aclose(aid) < 0) TEST_ERROR
@@ -825,7 +829,8 @@ error:
*-------------------------------------------------------------------------
*/
static int
-compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts, const void *buf1, const void *buf2)
+compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts,
+ const void *buf1, const void *buf2, hid_t obj_owner)
{
size_t elmt_size; /* Size of an element */
@@ -852,7 +857,7 @@ compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts,
if(vl_buf1->len != vl_buf2->len) TEST_ERROR
/* Check vlen data */
- if(!compare_data(parent1, parent2, pid, base_tid, vl_buf1->len, vl_buf1->p, vl_buf2->p)) TEST_ERROR
+ if(!compare_data(parent1, parent2, pid, base_tid, vl_buf1->len, vl_buf1->p, vl_buf2->p, obj_owner)) TEST_ERROR
} /* end for */
if(H5Tclose(base_tid) < 0) TEST_ERROR
@@ -883,6 +888,18 @@ compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts,
if((obj1_id = H5Rdereference(parent1, H5R_OBJECT, ref_buf1)) < 0) TEST_ERROR
if((obj2_id = H5Rdereference(parent2, H5R_OBJECT, ref_buf2)) < 0) TEST_ERROR
+ /* break the infinite loop when the ref_object points to itself */
+ if (obj_owner > 0) {
+ H5G_stat_t stat1, stat2;
+ if (H5Gget_objinfo(obj_owner, ".", 0, &stat1) < 0) TEST_ERROR
+ if (H5Gget_objinfo(obj1_id, ".", 0, &stat2) < 0) TEST_ERROR
+ if ( (stat1.objno[0] == stat2.objno[0]) && (stat1.objno[1] == stat2.objno[1]) ) {
+ if(H5Oclose(obj1_id) < 0) TEST_ERROR
+ if(H5Oclose(obj2_id) < 0) TEST_ERROR
+ return TRUE;
+ }
+ }
+
/* Check for types of objects handled */
switch(obj1_type)
{
@@ -927,6 +944,19 @@ compare_data(hid_t parent1, hid_t parent2, hid_t pid, hid_t tid, size_t nelmts,
if((obj1_id = H5Rdereference(parent1, H5R_DATASET_REGION, ref_buf1)) < 0) TEST_ERROR
if((obj2_id = H5Rdereference(parent2, H5R_DATASET_REGION, ref_buf2)) < 0) TEST_ERROR
+ /* break the infinite loop when the ref_object points to itself */
+ if (obj_owner > 0) {
+ H5G_stat_t stat1, stat2;
+ if (H5Gget_objinfo(obj_owner, ".", 0, &stat1) < 0) TEST_ERROR
+ if (H5Gget_objinfo(obj1_id, ".", 0, &stat2) < 0) TEST_ERROR
+
+ if ( (stat1.objno[0] == stat2.objno[0]) && (stat1.objno[1] == stat2.objno[1]) ) {
+ if(H5Oclose(obj1_id) < 0) TEST_ERROR
+ if(H5Oclose(obj2_id) < 0) TEST_ERROR
+ return TRUE;
+ }
+ }
+
/* Check for types of objects handled */
switch(obj1_type)
{
@@ -1080,14 +1110,8 @@ compare_datasets(hid_t did, hid_t did2, hid_t pid, const void *wbuf)
}
/* Remove external file information from the dcpls */
- /* Remove default property causes memory leak
if(H5Premove(dcpl, H5D_CRT_EXT_FILE_LIST_NAME) < 0) TEST_ERROR
if(H5Premove(dcpl2, H5D_CRT_EXT_FILE_LIST_NAME) < 0) TEST_ERROR
- */
-
- /* reset external file information from the dcpls */
- if (H5P_reset_external_file_test(dcpl) < 0) TEST_ERROR
- if (H5P_reset_external_file_test(dcpl2) < 0) TEST_ERROR
}
/* Compare the rest of the dataset creation property lists */
@@ -1135,12 +1159,12 @@ compare_datasets(hid_t did, hid_t did2, hid_t pid, const void *wbuf)
/* Check raw data read in against data written out */
if(wbuf) {
- if(!compare_data(did, 0, pid, tid, (size_t)nelmts, wbuf, rbuf)) TEST_ERROR
- if(!compare_data(did2, 0, pid, tid2, (size_t)nelmts, wbuf, rbuf2)) TEST_ERROR
+ if(!compare_data(did, 0, pid, tid, (size_t)nelmts, wbuf, rbuf, did) ) TEST_ERROR
+ if(!compare_data(did2, 0, pid, tid2, (size_t)nelmts, wbuf, rbuf2, did2) ) TEST_ERROR
} /* end if */
/* Don't have written data, just compare data between the two datasets */
else
- if(!compare_data(did, did2, pid, tid, (size_t)nelmts, rbuf, rbuf2)) TEST_ERROR
+ if(!compare_data(did, did2, pid, tid, (size_t)nelmts, rbuf, rbuf2, did)) TEST_ERROR
/* Reclaim vlen data, if necessary */
if(H5Tdetect_class(tid, H5T_VLEN) == TRUE)
@@ -1150,9 +1174,7 @@ compare_datasets(hid_t did, hid_t did2, hid_t pid, const void *wbuf)
/* Release raw data buffers */
HDfree(rbuf);
- rbuf = NULL;
HDfree(rbuf2);
- rbuf2 = NULL;
/* close the source dataspace */
if(H5Sclose(sid) < 0) TEST_ERROR
@@ -1361,9 +1383,7 @@ HDassert(0 && "Unknown type of object");
} /* end if */
/* Check if the attributes are equal */
- /* (don't check standard attributes when testing expanding references) */
- if(!(cpy_flags & H5O_COPY_EXPAND_REFERENCE_FLAG))
- if(compare_std_attributes(gid, gid2, pid) != TRUE) TEST_ERROR
+ if(compare_std_attributes(gid, gid2, pid) != TRUE) TEST_ERROR
/* Groups should be the same. :-) */
return TRUE;
@@ -3412,11 +3432,6 @@ test_copy_dataset_attr_named_dtype(hid_t fcpl_src, hid_t fcpl_dst, hid_t fapl)
if(H5Fclose(fid_src) < 0) TEST_ERROR
- /* Check that all file IDs have been closed */
- if(H5I_nmembers(H5I_FILE) != 0) TEST_ERROR
- if(H5F_sfile_assert_num(0) != 0) TEST_ERROR
-
-
/* open the source file with read-only */
if((fid_src = H5Fopen(src_filename, H5F_ACC_RDONLY, fapl)) < 0) TEST_ERROR
@@ -3954,7 +3969,7 @@ test_copy_attribute_vl(hid_t fcpl_src, hid_t fcpl_dst, hid_t fapl)
if((aid = H5Aopen_idx(did, 0)) < 0) TEST_ERROR
if((aid2 = H5Aopen_idx(did2, 0)) < 0) TEST_ERROR
- if(compare_attribute(aid, aid2, H5P_DEFAULT, NULL) != TRUE) TEST_ERROR
+ if(compare_attribute(aid, aid2, H5P_DEFAULT, NULL, did) != TRUE) TEST_ERROR
if(H5Aclose(aid) < 0) TEST_ERROR
if(H5Aclose(aid2) < 0) TEST_ERROR
@@ -7005,7 +7020,9 @@ test_copy_option(hid_t fcpl_src, hid_t fcpl_dst, hid_t fapl, unsigned flag, hboo
if(attach_reg_ref_attr(fid_src, gid_ref) < 0) TEST_ERROR
/* create a dataset of region references */
+/*
if(create_reg_ref_dataset(fid_src, gid_ref) < 0) TEST_ERROR
+*/
/* Close group holding reference objects */
if(H5Gclose(gid_ref) < 0) TEST_ERROR
@@ -7277,13 +7294,20 @@ main(void)
nerrors += test_copy_path(fcpl_src, fcpl_dst, my_fapl);
nerrors += test_copy_same_file_named_datatype(fcpl_src, my_fapl);
nerrors += test_copy_old_layout(fcpl_dst, my_fapl);
- nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_WITHOUT_ATTR_FLAG, FALSE, "H5Ocopy(): without attributes");
- nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, 0, TRUE, "H5Ocopy(): with missing groups");
- nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_EXPAND_SOFT_LINK_FLAG, FALSE, "H5Ocopy(): expand soft link");
- nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_SHALLOW_HIERARCHY_FLAG, FALSE, "H5Ocopy(): shallow group copy");
- nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_EXPAND_REFERENCE_FLAG, FALSE, "H5Ocopy(): expand object reference");
- nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_PRESERVE_NULL_FLAG, FALSE, "H5Ocopy(): preserve NULL messages");
- nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_WITHOUT_ATTR_FLAG | H5O_COPY_PRESERVE_NULL_FLAG, TRUE, "H5Ocopy(): preserve NULL messages");
+ nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_WITHOUT_ATTR_FLAG,
+ FALSE, "H5Ocopy(): without attributes");
+ nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, 0, TRUE,
+ "H5Ocopy(): with missing groups");
+ nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_EXPAND_SOFT_LINK_FLAG,
+ FALSE, "H5Ocopy(): expand soft link");
+ nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_SHALLOW_HIERARCHY_FLAG,
+ FALSE, "H5Ocopy(): shallow group copy");
+ nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_EXPAND_REFERENCE_FLAG,
+ FALSE, "H5Ocopy(): expand object reference");
+ nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_PRESERVE_NULL_FLAG,
+ FALSE, "H5Ocopy(): preserve NULL messages");
+ nerrors += test_copy_option(fcpl_src, fcpl_dst, my_fapl, H5O_COPY_WITHOUT_ATTR_FLAG |
+ H5O_COPY_PRESERVE_NULL_FLAG, TRUE, "H5Ocopy(): preserve NULL messages");
/* TODO: not implemented
nerrors += test_copy_option(my_fapl, H5O_COPY_EXPAND_EXT_LINK_FLAG, FALSE, "H5Ocopy: expand external link");
@@ -7313,4 +7337,3 @@ main(void)
error:
return 1;
} /* main */
-