summaryrefslogtreecommitdiffstats
path: root/test/ref.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/ref.c')
-rw-r--r--test/ref.c291
1 files changed, 291 insertions, 0 deletions
diff --git a/test/ref.c b/test/ref.c
new file mode 100644
index 0000000..0a874b4
--- /dev/null
+++ b/test/ref.c
@@ -0,0 +1,291 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the files COPYING and Copyright.html. COPYING can be found at the root *
+ * of the source code distribution tree; Copyright.html can be found at the *
+ * root level of an installed copy of the electronic HDF5 document set and *
+ * is linked from the top-level documents page. It can also be found at *
+ * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "h5test.h"
+
+/* The file structure tested is as follows:
+ * /
+ * Group1
+ * Dataset1
+ * Dataset2
+ * Group2
+ * Dataset4
+ * Hard link to group1
+ * Datatset5
+ * Datatype1
+ *
+ * The purpose of the hard link to make sure that the reference lookup code
+ * does not infinite loop when looking for Dataset3.
+ */
+
+#define FILE1 "trefer1.h5"
+#define FILE2 "trefer2.h5"
+
+/* 1-D dataset with fixed dimensions */
+#define SPACE1_NAME "Space1"
+#define SPACE1_RANK 1
+#define SPACE1_DIM1 8
+
+/* 2-D dataset with fixed dimensions */
+#define SPACE2_NAME "Space2"
+#define SPACE2_RANK 2
+#define SPACE2_DIM1 10
+#define SPACE2_DIM2 10
+
+int
+main(void) {
+ hid_t fid1, fid2; /* HDF5 File IDs */
+ hid_t dataset; /* Dataset ID */
+ hid_t group, group2; /* Group ID */
+ hid_t sid1, sid2; /* Dataspace ID */
+ hid_t tid1; /* Datatype ID */
+ hid_t ref;
+ hsize_t dims1[] = {SPACE1_DIM1};
+ hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2};
+ hsize_t start[SPACE2_RANK]; /* Starting location of hyperslab */
+ hsize_t stride[SPACE2_RANK]; /* Stride of hyperslab */
+ hsize_t count[SPACE2_RANK]; /* Element count of hyperslab */
+ hsize_t block[SPACE2_RANK]; /* Block size of hyperslab */
+
+ hobj_ref_t *wbuf; /* buffer to write to disk */
+ int *tu32; /* Temporary pointer to int data */
+ int i; /* counting variables */
+ const char *write_comment="Foo!"; /* Comments for group */
+ herr_t ret; /* Generic return value */
+ char buf[100] = {0};
+
+/* Compound datatype */
+typedef struct s1_t {
+ unsigned int a;
+ unsigned int b;
+ float c;
+} s1_t;
+
+ /* Allocate write buffers */
+ wbuf=(hobj_ref_t *)malloc(sizeof(hobj_ref_t)*SPACE1_DIM1);
+ tu32=malloc(sizeof(int)*SPACE1_DIM1);
+
+ /* Create file */
+ fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ fid2 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ /* Create dataspace for datasets */
+ sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL);
+ sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL);
+
+ /* Create a group */
+ group=H5Gcreate(fid1,"Group1",-1);
+
+ /* Set group's comment */
+ ret=H5Gset_comment(group,".",write_comment);
+
+ /* Create a single dataset inside the second file, which will be mounted
+ * and used to mask objects in the first file */
+ dataset=H5Dcreate(fid2,"Dataset1",H5T_STD_U32LE,sid1,H5P_DEFAULT);
+ ret = H5Dclose(dataset);
+
+ /* Create a dataset (inside Group1) */
+ dataset=H5Dcreate(group,"Dataset1",H5T_STD_U32LE,sid1,H5P_DEFAULT);
+
+ for(i=0; i < SPACE1_DIM1; i++)
+ tu32[i] = i*3;
+
+ /* Write selection to disk */
+ ret=H5Dwrite(dataset,H5T_NATIVE_INT,H5S_ALL,H5S_ALL,H5P_DEFAULT,tu32);
+
+ /* Close Dataset */
+ ret = H5Dclose(dataset);
+
+ /* Create another dataset (inside Group1) */
+ dataset=H5Dcreate(group,"Dataset2",H5T_NATIVE_UCHAR,sid1,H5P_DEFAULT);
+
+ /* Close Dataset */
+ ret = H5Dclose(dataset);
+
+ /* Create a datatype to refer to */
+ tid1 = H5Tcreate (H5T_COMPOUND, sizeof(s1_t));
+
+ /* Insert fields */
+ ret=H5Tinsert (tid1, "a", HOFFSET(s1_t,a), H5T_NATIVE_INT);
+
+ ret=H5Tinsert (tid1, "b", HOFFSET(s1_t,b), H5T_NATIVE_INT);
+
+ ret=H5Tinsert (tid1, "c", HOFFSET(s1_t,c), H5T_NATIVE_FLOAT);
+
+ /* Save datatype for later */
+ ret=H5Tcommit (group, "Datatype1", tid1);
+
+ /* Close datatype */
+ ret = H5Tclose(tid1);
+
+ /* Create a new group in group1 */
+ group2=H5Gcreate(group,"Group2",-1);
+
+ /* Create a hard link to group1 in group2 */
+ if(H5Glink(fid1, H5G_LINK_HARD, "/Group1", "/Group1/Group2/Link")<0)
+ H5_FAILED();
+
+ /* Create dataset in that group */
+ dataset=H5Dcreate(group2,"Dataset4",H5T_NATIVE_UCHAR,sid1,H5P_DEFAULT);
+
+ /* Close Dataset */
+ ret = H5Dclose(dataset);
+
+ /* Close group */
+ ret = H5Gclose(group);
+ ret = H5Gclose(group2);
+
+ /* Open up that hard link and make a new dataset there */
+ group = H5Gopen(fid1, "/Group1/Group2/Link");
+ dataset=H5Dcreate(group,"Dataset5",H5T_NATIVE_UCHAR,sid1,H5P_DEFAULT);
+
+ ret = H5Dclose(dataset);
+ ret = H5Gclose(group);
+
+ /* Open up that hard link and make a new dataset region there */
+ group = H5Gopen(fid1, "/Group1/Group2/Link");
+ dataset=H5Dcreate(group,"Dataset6",H5T_STD_REF_DSETREG,sid1,H5P_DEFAULT);
+ start[0]=2; start[1]=2;
+ stride[0]=1; stride[1]=1;
+ count[0]=6; count[1]=6;
+ block[0]=1; block[1]=1;
+ ret = H5Sselect_hyperslab(sid2,H5S_SELECT_SET,start,stride,count,block);
+
+
+ ret = H5Dclose(dataset);
+ ret = H5Gclose(group);
+
+
+
+ /* Create a dataset to store references */
+ dataset=H5Dcreate(fid1,"Dataset3",H5T_STD_REF_OBJ,sid1,H5P_DEFAULT);
+
+ /* Create reference to dataset */
+ ret = H5Rcreate(&wbuf[0],fid1,"/Dataset3",H5R_OBJECT,-1);
+
+ /* Create reference to dataset */
+ ret = H5Rcreate(&wbuf[1],fid1,"/Group1/Dataset2",H5R_OBJECT,-1);
+
+ /* Create reference to group */
+ ret = H5Rcreate(&wbuf[2],fid1,"/Group1",H5R_OBJECT,-1);
+
+ /* Create reference to named datatype */
+ ret = H5Rcreate(&wbuf[3],fid1,"/Group1/Datatype1",H5R_OBJECT,-1);
+
+ ret = H5Rcreate(&wbuf[4],fid1,"/Group1/Group2/Dataset4",H5R_OBJECT,-1);
+ ret = H5Rcreate(&wbuf[5],fid1,"/Group1/Group2",H5R_OBJECT,-1);
+ ret = H5Rcreate(&wbuf[6],fid1,"/Group1/Group2/Link/Dataset5",H5R_OBJECT,-1);
+ ret = H5Rcreate(&wbuf[7],fid1,"/Group1/Group2/Link/Dataset6",H5R_DATASET_REGION,sid2);
+
+ /* Write selection to disk */
+ ret=H5Dwrite(dataset,H5T_STD_REF_OBJ,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf);
+
+ TESTING("Getting path to normal dataset in root group");
+ i = H5Iget_name(H5Rdereference(dataset, H5R_OBJECT , &wbuf[0]), (char*)buf, 100);
+ if( (strcmp(buf, "/Dataset3")== 0) && (i == 10) )
+ PASSED()
+ else
+ H5_FAILED()
+
+ memset(buf, 0, 100);
+ TESTING("Getting path to dataset in /Group1");
+ i = H5Iget_name(H5Rdereference(dataset, H5R_OBJECT , &wbuf[1]), (char*)buf, 100);
+ if( (strcmp(buf, "/Group1/Dataset2")== 0) && (i == 17) )
+ PASSED()
+ else
+ H5_FAILED()
+
+ memset(buf, 0, 100);
+ TESTING("Getting path to /Group1");
+ i = H5Iget_name(H5Rdereference(dataset, H5R_OBJECT , &wbuf[2]), (char*)buf, 100);
+ if( (strcmp(buf, "/Group1")== 0) && (i == 8) )
+ PASSED()
+ else
+ H5_FAILED()
+
+ memset(buf, 0, 100);
+ TESTING("Getting path to datatype in /Group1");
+ i = H5Iget_name(H5Rdereference(dataset, H5R_OBJECT , &wbuf[3]), (char*)buf, 100);
+ if( (strcmp(buf, "/Group1/Datatype1")== 0) && (i == 18) )
+ PASSED()
+ else
+ H5_FAILED()
+
+ memset(buf, 0, 100);
+ TESTING("Getting path to dataset in nested group");
+ i = H5Iget_name(H5Rdereference(dataset, H5R_OBJECT , &wbuf[4]), (char*)buf, 100);
+ if( (strcmp(buf, "/Group1/Group2/Dataset4")== 0) && (i == 24) )
+ PASSED()
+ else
+ H5_FAILED()
+
+ memset(buf, 0, 100);
+ TESTING("Getting path to nested group");
+ i = H5Iget_name(H5Rdereference(dataset, H5R_OBJECT , &wbuf[5]), (char*)buf, 100);
+ if( (strcmp(buf, "/Group1/Group2")== 0) && (i == 15) )
+ PASSED()
+ else
+ H5_FAILED()
+ memset(buf, 0, 100);
+
+ TESTING("Getting path to dataset created via hard link");
+ i = H5Iget_name(H5Rdereference(dataset, H5R_OBJECT , &wbuf[6]), (char*)buf, 100);
+ if( (strcmp(buf, "/Group1/Dataset5")== 0) && (i == 17) )
+ PASSED()
+ else
+ H5_FAILED()
+
+ TESTING("Getting path to dataset region");
+ i = H5Iget_name(H5Rdereference(dataset, H5R_DATASET_REGION , &wbuf[7]), (char*)buf, 100);
+ if( (strcmp(buf, "/Group1/Dataset6")== 0) && (i == 17) )
+ PASSED()
+ else
+ H5_FAILED()
+
+ /* Now we mount fid2 at /Group2 and look for dataset4. It shouldn't be found */
+ H5Fmount(fid1, "/Group1/Group2", fid2, H5P_DEFAULT);
+
+ TESTING("Getting path to dataset hidden by a mounted file");
+ i = H5Iget_name(H5Rdereference(dataset, H5R_OBJECT , &wbuf[4]), (char*)buf, 100);
+ if(i==0)
+ PASSED()
+ else
+ H5_FAILED()
+
+ /* Now we try unlinking dataset2 from the file and searching for it. It shouldn't be found */
+ ref = H5Rdereference(dataset, H5R_OBJECT , &wbuf[1]);
+ H5Gunlink(fid1, "/Group1/Dataset2");
+
+ TESTING("Getting path to a dataset that has been unlinked");
+ i = H5Iget_name(ref, (char*)buf, 100);
+ if(i==0)
+ PASSED()
+ else
+ H5_FAILED()
+
+
+ /* Close disk dataspace */
+ ret = H5Sclose(sid1);
+ ret = H5Sclose(sid2);
+
+ /* Close Dataset */
+ ret = H5Dclose(dataset);
+
+ /* Close file */
+ ret = H5Fclose(fid1);
+ ret = H5Fclose(fid2);
+ free(wbuf);
+ free(tu32);
+ return 0;
+}