diff options
Diffstat (limited to 'test/ref.c')
-rw-r--r-- | test/ref.c | 291 |
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; +} |