diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2005-08-10 20:28:32 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2005-08-10 20:28:32 (GMT) |
commit | 0e1b41d0fd1521784128e8637b5afa8371d2779d (patch) | |
tree | 8c17410110f52e6c5b77e49d41a8c1af00a8e3da /test/trefer.c | |
parent | a8fbde5d18ea0b8e0567649571e527e9f04ab5c7 (diff) | |
download | hdf5-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.c | 129 |
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() */ |