diff options
-rw-r--r-- | test/tsohm.c | 183 |
1 files changed, 181 insertions, 2 deletions
diff --git a/test/tsohm.c b/test/tsohm.c index 94fd128..47c087e 100644 --- a/test/tsohm.c +++ b/test/tsohm.c @@ -23,6 +23,14 @@ #include "testhdf5.h" +/* + * This file needs to access private information from the H5F package. + * This file also needs to access the file testing code. + */ +#define H5F_PACKAGE +#define H5F_TESTING +#include "H5Fpkg.h" /* File access */ + /* Default SOHM values */ #define DEF_NUM_INDEXES 0 const unsigned def_type_flags[H5O_SHMESG_MAX_NINDEXES] = {0,0,0,0,0,0}; @@ -150,6 +158,10 @@ typedef struct size2_helper_struct { /* Number of dimensions in extend_dset test */ #define EXTEND_NDIMS 2 +/* Dimensions for external_dtype test */ +#define NX 10 +#define NY 10 + /* Helper function prototypes */ static hid_t make_dtype_1(void); static hid_t make_dtype_2(void); @@ -3784,6 +3796,174 @@ test_sohm_extend_dset(void) } +/*------------------------------------------------------------------------- + * Function: test_sohm_external_dtype + * + * Purpose: When a datatype is a SOHM type in one file, test that the + * second file using the same datatype actually save it in + * the file, too. + * + * Programmer: Raymond Lu + * 13 October, 2008 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static void +test_sohm_external_dtype(void) +{ + typedef struct s1_t { + int a; + int b; + } s1_t; + s1_t *s_ptr, *orig; + hid_t fcpl, file1, file2; + hid_t dataset1, dataset2; + hid_t s1_tid, dset1_tid, dset2_tid, space; + hsize_t dims[2] = {NX, NY}; + H5T_class_t dtype_class; + size_t dmsg_count; + unsigned x, i; + herr_t ret; + + fcpl = H5Pcreate(H5P_FILE_CREATE); + CHECK_I(fcpl, "H5Pcreate"); + + /* Set up index values for sohm */ + ret = H5Pset_shared_mesg_nindexes(fcpl, TEST_NUM_INDEXES); + CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); + + for(x=0; x<TEST_NUM_INDEXES; ++x) + { + ret = H5Pset_shared_mesg_index(fcpl, x, test_type_flags[x], test_minsizes[x]); + CHECK_I(ret, "H5Pset_shared_mesg_index"); + } + + ret = H5Pset_shared_mesg_phase_change(fcpl, TEST_L2B, TEST_B2L); + CHECK_I(ret, "H5Pset_shared_mesg_phase_change"); + + /* Create the data space */ + space = H5Screate_simple(2, dims, NULL); + CHECK_I(space, "H5Screate_simple"); + + /* Create a data type for s1_t */ + s1_tid = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); + CHECK_I(s1_tid, "H5Tcreate"); + + ret = H5Tinsert(s1_tid, "a", HOFFSET(s1_t,a), H5T_NATIVE_INT); + CHECK_I(ret, "H5Tinsert"); + + ret = H5Tinsert (s1_tid, "b", HOFFSET(s1_t,b), H5T_NATIVE_INT); + CHECK_I(ret, "H5Tinsert"); + + /* Create the first file for this test */ + file1 = H5Fcreate(FILENAME_SRC, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT); + CHECK_I(file1, "H5Fcreate"); + + /* Check on datatype storage status. It should be zero now. */ + ret = H5F_get_sohm_mesg_count_test(file1, H5O_DTYPE_ID, &dmsg_count); + CHECK(ret, FAIL, "H5F_get_sohm_mesg_count_test"); + VERIFY(dmsg_count, 0, "H5F_get_sohm_mesg_count_test"); + + /* Create data set */ + dataset1 = H5Dcreate2(file1, "dataset_1", s1_tid, space, H5P_DEFAULT, H5P_DEFAULT, + H5P_DEFAULT); + CHECK_I(dataset1, "H5Dcreate2"); + + /* Check on datatype storage status. It should be 1 now. */ + ret = H5F_get_sohm_mesg_count_test(file1, H5O_DTYPE_ID, &dmsg_count); + CHECK(ret, FAIL, "H5F_get_sohm_mesg_count_test"); + VERIFY(dmsg_count, 1, "H5F_get_sohm_mesg_count_test"); + + /* Retieve the dataset's datatype */ + dset1_tid = H5Dget_type(dataset1); + CHECK_I(dset1_tid, "H5Dget_type"); + + /* Allocate space and initialize data */ + orig = (s1_t*)malloc(NX * NY * sizeof(s1_t)); + for(i=0; i<NX*NY; i++) { + s_ptr = (s1_t*)orig + i; + s_ptr->a = i*3 + 1; + s_ptr->b = i*3 + 2; + } + + /* Write the data to the dataset1 */ + ret = H5Dwrite(dataset1, s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, orig); + CHECK_I(ret, "H5Dwrite"); + + ret = H5Dclose(dataset1); + CHECK_I(ret, "H5Dclose"); + + /* Create the second file for this test */ + file2 = H5Fcreate(FILENAME_DST, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT); + CHECK_I(file2, "H5Fcreate"); + + /* Check on datatype storage status. It should be zero now. */ + ret = H5F_get_sohm_mesg_count_test(file2, H5O_DTYPE_ID, &dmsg_count); + CHECK(ret, FAIL, "H5F_get_sohm_mesg_count_test"); + VERIFY(dmsg_count, 0, "H5F_get_sohm_mesg_count_test"); + + /* Create a data set using the datatype of the dataset in the first file. */ + dataset2 = H5Dcreate2(file2, "dataset_2", dset1_tid, space, H5P_DEFAULT, H5P_DEFAULT, + H5P_DEFAULT); + CHECK_I(dataset2, "H5Dcreate2"); + + /* Check on datatype storage status. It should be 1 now. */ + ret = H5F_get_sohm_mesg_count_test(file2, H5O_DTYPE_ID, &dmsg_count); + CHECK(ret, FAIL, "H5F_get_sohm_mesg_count_test"); + VERIFY(dmsg_count, 1, "H5F_get_sohm_mesg_count_test"); + + /* Write the data to the dataset2 */ + ret = H5Dwrite(dataset2, s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, orig); + CHECK_I(ret, "H5Dwrite"); + + ret = H5Dclose(dataset2); + CHECK_I(ret, "H5Dclose"); + + /* Close file 1 and the dataset's datatype in file 1. Verify that the datatype in + * file 2 is still accessible. */ + ret = H5Tclose(dset1_tid); + CHECK_I(ret, "H5Tclose"); + + ret = H5Fclose(file1); + CHECK_I(ret, "H5Fclose"); + + /* Open the dataset in file 2 */ + dataset2 = H5Dopen2(file2, "dataset_2", H5P_DEFAULT); + CHECK_I(dataset2, "H5Dopen2"); + + /* Retieve the dataset's datatype */ + dset2_tid = H5Dget_type(dataset2); + CHECK_I(dset2_tid, "H5Dget_type"); + + /* Verify the datatype is compound */ + dtype_class = H5Tget_class(dset2_tid); + VERIFY(dtype_class, H5T_COMPOUND, "H5Tget_class"); + + ret = H5Tclose(dset2_tid); + CHECK_I(ret, "H5Tclose"); + + ret = H5Dclose(dataset2); + CHECK_I(ret, "H5Dclose"); + + /* Finishing test and release resources */ + ret = H5Sclose(space); + CHECK_I(ret, "H5Sclose"); + + ret = H5Tclose(s1_tid); + CHECK_I(ret, "H5Tclose"); + + ret = H5Pclose(fcpl); + CHECK_I(ret, "H5Pclose"); + + ret = H5Fclose(file2); + CHECK_I(ret, "H5Fclose"); + + free(orig); +} + + /**************************************************************** ** ** test_sohm(): Main Shared Object Header Message testing routine. @@ -3808,11 +3988,10 @@ test_sohm(void) #ifndef H5_CANNOT_OPEN_TWICE /* On VMS this test fails since it tries to open target file the second time */ test_sohm_extlink(); /* Test SOHMs when external links are used */ - #endif /* H5_CANNOT_OPEN_TWICE */ test_sohm_extend_dset(); /* Test extending shared datasets */ - + test_sohm_external_dtype(); /* Test using datatype in another file */ } /* test_sohm() */ |