summaryrefslogtreecommitdiffstats
path: root/test/trefer.c
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2005-08-10 20:28:32 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2005-08-10 20:28:32 (GMT)
commit0e1b41d0fd1521784128e8637b5afa8371d2779d (patch)
tree8c17410110f52e6c5b77e49d41a8c1af00a8e3da /test/trefer.c
parenta8fbde5d18ea0b8e0567649571e527e9f04ab5c7 (diff)
downloadhdf5-0e1b41d0fd1521784128e8637b5afa8371d2779d.zip
hdf5-0e1b41d0fd1521784128e8637b5afa8371d2779d.tar.gz
hdf5-0e1b41d0fd1521784128e8637b5afa8371d2779d.tar.bz2
[svn-r11229] Purpose:
Big fix Description: A group opened by dereferencing a object reference would not work for H5Giterate(), due to the local heap & B-tree information not being cached. Solution: Get the local heap & B-tree info & point to that structure instead of the group entry for the group. Platforms tested: FreeBSD 4.11 (sleipnir) Too minor to require h5committest
Diffstat (limited to 'test/trefer.c')
-rw-r--r--test/trefer.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/test/trefer.c b/test/trefer.c
index cf2e99b..fe592f4 100644
--- a/test/trefer.c
+++ b/test/trefer.c
@@ -56,6 +56,7 @@ typedef struct s1_t {
#define GROUPNAME "/group"
#define GROUPNAME2 "group2"
+#define GROUPNAME3 "group3"
#define DSETNAME "/dset"
#define NAME_SIZE 16
@@ -1016,6 +1017,133 @@ test_reference_group_query(void)
/****************************************************************
**
+** test_deref_iter_op(): Iterator callback for test_reference_group_iterate()
+** test.
+**
+****************************************************************/
+static herr_t
+test_deref_iter_op(hid_t UNUSED group, const char *name, void *op_data)
+{
+ int *count = (int *)op_data; /* Pointer to name counter */
+ herr_t ret_value;
+
+ /* Simple check for correct names */
+ if(*count == 0) {
+ if(HDstrcmp(name, GROUPNAME2) == 0)
+ ret_value = 0;
+ else
+ ret_value = -1;
+ } /* end if */
+ else if(*count == 1) {
+ if(HDstrcmp(name, GROUPNAME3) == 0)
+ ret_value = 0;
+ else
+ ret_value = -1;
+ } /* end if */
+ else
+ ret_value = -1;
+
+ (*count)++;
+
+ return(ret_value);
+} /* end test_deref_iter_op() */
+
+/****************************************************************
+**
+** test_reference_group_iterate(): Test H5R (reference) object reference code.
+** Tests for correct behavior of iteration routines on dereferenced group
+**
+****************************************************************/
+static void
+test_reference_group_iterate(void)
+{
+ hid_t fid = -1; /* File ID */
+ hid_t gid = -1, gid2 = -1; /* Group IDs */
+ hid_t did; /* Dataset ID */
+ hid_t sid; /* Dataspace ID */
+ hobj_ref_t wref; /* Reference to write */
+ hobj_ref_t rref; /* Reference to read */
+ int count = 0; /* Count within iterated group */
+ herr_t ret;
+
+ /* Create file with a group and a dataset containing an object reference to the group */
+ fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ CHECK(fid, FAIL, "H5Fcreate");
+
+ /* Create group to refer to */
+ gid = H5Gcreate(fid, GROUPNAME, (size_t)0);
+ CHECK(gid, FAIL, "H5Gcreate");
+
+ /* Create nested groups */
+ gid2 = H5Gcreate(gid, GROUPNAME2, (size_t)0);
+ CHECK(gid2, FAIL, "H5Gcreate");
+ ret = H5Gclose(gid2);
+ CHECK(ret, FAIL, "H5Gclose");
+
+ gid2 = H5Gcreate(gid, GROUPNAME3, (size_t)0);
+ CHECK(gid2, FAIL, "H5Gcreate");
+ ret = H5Gclose(gid2);
+ CHECK(ret, FAIL, "H5Gclose");
+
+ ret = H5Gclose(gid);
+ CHECK(ret, FAIL, "H5Gclose");
+
+ /* Create dataspace to use for dataset */
+ sid = H5Screate(H5S_SCALAR);
+ CHECK(sid, FAIL, "H5Screate");
+
+ /* Create dataset */
+ did = H5Dcreate(fid, DSETNAME, H5T_STD_REF_OBJ, sid, H5P_DEFAULT);
+ CHECK(did, FAIL, "H5Dcreate");
+
+ /* Create reference to group */
+ ret = H5Rcreate(&wref, fid, GROUPNAME, H5R_OBJECT, -1);
+ CHECK(ret, FAIL, "H5Rcreate");
+
+ /* Write reference to disk */
+ ret = H5Dwrite(did, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wref);
+ CHECK(ret, FAIL, "H5Dwrite");
+
+ /* Close objects */
+ ret = H5Dclose(did);
+ CHECK(ret, FAIL, "H5Dclose");
+ ret = H5Sclose(sid);
+ CHECK(ret, FAIL, "H5Sclose");
+ ret = H5Fclose(fid);
+ CHECK(ret, FAIL, "H5Fclose");
+
+
+ /* Re-open file */
+ fid = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT);
+ CHECK(fid, FAIL, "H5Fopen");
+
+ /* Re-open dataset */
+ did = H5Dopen(fid, DSETNAME);
+ CHECK(did, FAIL, "H5Dopen");
+
+ /* Read in the reference */
+ ret = H5Dread(did, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rref);
+ CHECK(ret, FAIL, "H5Dread");
+
+ /* Dereference to get the group */
+ gid = H5Rdereference(did, H5R_OBJECT, &rref);
+ CHECK(gid, FAIL, "H5Rdereference");
+
+ /* Iterate through objects in dereferenced group */
+ ret = H5Giterate(gid, ".", NULL, test_deref_iter_op, &count);
+ CHECK(ret, FAIL, "H5Giterate");
+
+ /* Close objects */
+ ret = H5Dclose(did);
+ CHECK(ret, FAIL, "H5Dclose");
+ ret = H5Gclose(gid);
+ CHECK(ret, FAIL, "H5Gclose");
+ ret = H5Fclose(fid);
+ CHECK(ret, FAIL, "H5Fclose");
+} /* test_reference_group_iterate() */
+
+/****************************************************************
+**
** test_reference(): Main H5R reference testing routine.
**
****************************************************************/
@@ -1030,6 +1158,7 @@ test_reference(void)
test_reference_region_1D(); /* Test H5R dataset region reference code for 1-D datasets */
test_reference_obj_deleted(); /* Test H5R object reference code for deleted objects */
test_reference_group_query(); /* Test queries on dereferenced groups */
+ test_reference_group_iterate(); /* Test iterations on dereferenced groups */
} /* test_reference() */