diff options
Diffstat (limited to 'test/dangle.c')
-rw-r--r-- | test/dangle.c | 270 |
1 files changed, 223 insertions, 47 deletions
diff --git a/test/dangle.c b/test/dangle.c index 8425caa..1f0acae 100644 --- a/test/dangle.c +++ b/test/dangle.c @@ -29,34 +29,7 @@ const char *FILENAME[] = { #define DSETNAME "Dataset" #define GROUPNAME "Group" #define TYPENAME "Type" - - -/*------------------------------------------------------------------------- - * Function: get_file_size - * - * Purpose: Get the current size of a file (in bytes) - * - * Return: Success: Size of file in bytes (could be 0) - * Failure: 0 - * - * Programmer: Quincey Koziol - * Saturday, March 22, 2003 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static off_t -get_file_size(const char *filename) -{ - h5_stat_t sb; - - /* Get the file's statistics */ - if (HDstat(filename, &sb)>=0) - return(sb.st_size); - - return(0); -} /* end get_file_size() */ +#define ATTRNAME "Attribute" /*------------------------------------------------------------------------- @@ -76,21 +49,30 @@ get_file_size(const char *filename) *------------------------------------------------------------------------- */ static int -test_dangle_dataset(void) +test_dangle_dataset(H5F_close_degree_t degree) { char filename[1024]; off_t file_size; /* Size of file */ hid_t fid; /* File ID */ + hid_t fapl; /* File access property list */ hid_t dsid; /* Dataset ID */ hid_t sid; /* Dataspace ID */ - TESTING("dangling dataset IDs"); + TESTING(" dangling dataset IDs"); if(H5open()<0) TEST_ERROR; + /* Create file access property list */ + if((fapl=H5Pcreate(H5P_FILE_ACCESS))<0) + TEST_ERROR; + + /* Set file close degree */ + if(H5Pset_fclose_degree(fapl,degree)<0) + TEST_ERROR; + h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof filename); - if((fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) + if((fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR; if((sid = H5Screate (H5S_SCALAR))<0) @@ -102,6 +84,12 @@ test_dangle_dataset(void) if(H5Dclose(dsid)<0) TEST_ERROR; + /* Try creating duplicate dataset */ + H5E_BEGIN_TRY { + if((dsid = H5Dcreate (fid, DSETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT))>=0) + TEST_ERROR; + } H5E_END_TRY; + if((dsid = H5Dopen (fid, DSETNAME))<0) TEST_ERROR; @@ -111,13 +99,23 @@ test_dangle_dataset(void) if(H5Sclose(sid)<0) TEST_ERROR; - if(H5Fclose(fid)<0) + if(degree==H5F_CLOSE_SEMI) { + H5E_BEGIN_TRY { + if(H5Fclose(fid)>=0) + TEST_ERROR; + } H5E_END_TRY; + } /* end if */ + else + if(H5Fclose(fid)<0) + TEST_ERROR; + + if(H5Pclose(fapl)<0) TEST_ERROR; if(H5close()<0) TEST_ERROR; - if((file_size=get_file_size(filename))==0) + if((file_size=h5_get_file_size(filename))==0) TEST_ERROR; /* Clean up temporary file */ @@ -148,20 +146,29 @@ error: *------------------------------------------------------------------------- */ static int -test_dangle_group(void) +test_dangle_group(H5F_close_degree_t degree) { char filename[1024]; off_t file_size; /* Size of file */ hid_t fid; /* File ID */ + hid_t fapl; /* File access property list */ hid_t gid; /* Group ID */ - TESTING("dangling group IDs"); + TESTING(" dangling group IDs"); if(H5open()<0) TEST_ERROR; + /* Create file access property list */ + if((fapl=H5Pcreate(H5P_FILE_ACCESS))<0) + TEST_ERROR; + + /* Set file close degree */ + if(H5Pset_fclose_degree(fapl,degree)<0) + TEST_ERROR; + h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof filename); - if((fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) + if((fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR; if((gid = H5Gcreate (fid, GROUPNAME, 0))<0) @@ -170,19 +177,35 @@ test_dangle_group(void) if(H5Gclose(gid)<0) TEST_ERROR; + /* Try creating duplicate group */ + H5E_BEGIN_TRY { + if((gid = H5Gcreate (fid, GROUPNAME, 0))>=0) + TEST_ERROR; + } H5E_END_TRY; + if((gid = H5Gopen (fid, GROUPNAME))<0) TEST_ERROR; if((gid = H5Gopen (fid, GROUPNAME))<0) TEST_ERROR; - if(H5Fclose(fid)<0) + if(degree==H5F_CLOSE_SEMI) { + H5E_BEGIN_TRY { + if(H5Fclose(fid)>=0) + TEST_ERROR; + } H5E_END_TRY; + } /* end if */ + else + if(H5Fclose(fid)<0) + TEST_ERROR; + + if(H5Pclose(fapl)<0) TEST_ERROR; if(H5close()<0) TEST_ERROR; - if((file_size=get_file_size(filename))==0) + if((file_size=h5_get_file_size(filename))==0) TEST_ERROR; /* Clean up temporary file */ @@ -213,20 +236,29 @@ error: *------------------------------------------------------------------------- */ static int -test_dangle_datatype(void) +test_dangle_datatype(H5F_close_degree_t degree) { char filename[1024]; off_t file_size; /* Size of file */ hid_t fid; /* File ID */ + hid_t fapl; /* File access property list */ hid_t tid; /* Datatype ID */ - TESTING("dangling datatype IDs"); + TESTING(" dangling named datatype IDs"); if(H5open()<0) TEST_ERROR; + /* Create file access property list */ + if((fapl=H5Pcreate(H5P_FILE_ACCESS))<0) + TEST_ERROR; + + /* Set file close degree */ + if(H5Pset_fclose_degree(fapl,degree)<0) + TEST_ERROR; + h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof filename); - if((fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) + if((fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR; if((tid = H5Tcopy (H5T_NATIVE_INT))<0) @@ -238,19 +270,147 @@ test_dangle_datatype(void) if(H5Tclose(tid)<0) TEST_ERROR; + /* Try creating duplicate named datatype */ + if((tid = H5Tcopy (H5T_NATIVE_INT))<0) + TEST_ERROR; + H5E_BEGIN_TRY { + if(H5Tcommit(fid,TYPENAME,tid)>=0) + TEST_ERROR; + } H5E_END_TRY; + if(H5Tclose(tid)<0) + TEST_ERROR; + if((tid = H5Topen (fid, TYPENAME))<0) TEST_ERROR; if((tid = H5Topen (fid, TYPENAME))<0) TEST_ERROR; - if(H5Fclose(fid)<0) + if(degree==H5F_CLOSE_SEMI) { + H5E_BEGIN_TRY { + if(H5Fclose(fid)>=0) + TEST_ERROR; + } H5E_END_TRY; + } /* end if */ + else + if(H5Fclose(fid)<0) + TEST_ERROR; + + if(H5Pclose(fapl)<0) + TEST_ERROR; + + if(H5close()<0) + TEST_ERROR; + + if((file_size=h5_get_file_size(filename))==0) + TEST_ERROR; + + /* Clean up temporary file */ + HDremove(filename); + + PASSED(); + return 0; + +error: + return 1; +} + + +/*------------------------------------------------------------------------- + * Function: test_dangle_attribute + * + * Purpose: Check for dangling attribute IDs causing problems on library + * shutdown + * + * Return: Success: zero + * Failure: non-zero + * + * Programmer: Quincey Koziol + * Wednesday, June 18, 2003 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_dangle_attribute(H5F_close_degree_t degree) +{ + char filename[1024]; + off_t file_size; /* Size of file */ + hid_t fid; /* File ID */ + hid_t fapl; /* File access property list */ + hid_t dsid; /* Dataset ID */ + hid_t sid; /* Dataspace ID */ + hid_t aid; /* Attribute ID */ + + TESTING(" dangling attribute IDs"); + + if(H5open()<0) + TEST_ERROR; + + /* Create file access property list */ + if((fapl=H5Pcreate(H5P_FILE_ACCESS))<0) + TEST_ERROR; + + /* Set file close degree */ + if(H5Pset_fclose_degree(fapl,degree)<0) + TEST_ERROR; + + h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof filename); + if((fid = H5Fcreate (filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) + TEST_ERROR; + + if((sid = H5Screate (H5S_SCALAR))<0) + TEST_ERROR; + + if((dsid = H5Dcreate (fid, DSETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT))<0) + TEST_ERROR; + + /* Create an attribute on the dataset */ + if((aid = H5Acreate (dsid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT))<0) + TEST_ERROR; + + /* Don't worry about writing the attribute - it will have a fill value */ + + /* Close the attribute on the dataset */ + if(H5Aclose (aid)<0) + TEST_ERROR; + + /* Try creating duplicate attribute */ + H5E_BEGIN_TRY { + if((aid = H5Acreate (dsid, ATTRNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT))>=0) + TEST_ERROR; + } H5E_END_TRY; + + if((aid = H5Aopen_name (dsid, ATTRNAME))<0) + TEST_ERROR; + + if((aid = H5Aopen_name (dsid, ATTRNAME))<0) + TEST_ERROR; + + if(H5Dclose(dsid)<0) + TEST_ERROR; + + if(H5Sclose(sid)<0) + TEST_ERROR; + + if(degree==H5F_CLOSE_SEMI) { + H5E_BEGIN_TRY { + if(H5Fclose(fid)>=0) + TEST_ERROR; + } H5E_END_TRY; + } /* end if */ + else + if(H5Fclose(fid)<0) + TEST_ERROR; + + if(H5Pclose(fapl)<0) TEST_ERROR; if(H5close()<0) TEST_ERROR; - if((file_size=get_file_size(filename))==0) + if((file_size=h5_get_file_size(filename))==0) TEST_ERROR; /* Clean up temporary file */ @@ -284,10 +444,26 @@ main(void) { int nerrors=0; - /* Run tests */ - nerrors += test_dangle_dataset(); - nerrors += test_dangle_group(); - nerrors += test_dangle_datatype(); + /* Run tests w/weak file close */ + puts("Testing dangling objects with weak file close:"); + nerrors += test_dangle_dataset(H5F_CLOSE_WEAK); + nerrors += test_dangle_group(H5F_CLOSE_WEAK); + nerrors += test_dangle_datatype(H5F_CLOSE_WEAK); + nerrors += test_dangle_attribute(H5F_CLOSE_WEAK); + + /* Run tests w/semi file close */ + puts("Testing dangling objects with semi file close:"); + nerrors += test_dangle_dataset(H5F_CLOSE_SEMI); + nerrors += test_dangle_group(H5F_CLOSE_SEMI); + nerrors += test_dangle_datatype(H5F_CLOSE_SEMI); + nerrors += test_dangle_attribute(H5F_CLOSE_SEMI); + + /* Run tests w/strong file close */ + puts("Testing dangling objects with strong file close:"); + nerrors += test_dangle_dataset(H5F_CLOSE_STRONG); + nerrors += test_dangle_group(H5F_CLOSE_STRONG); + nerrors += test_dangle_datatype(H5F_CLOSE_STRONG); + nerrors += test_dangle_attribute(H5F_CLOSE_STRONG); /* Check for errors */ if (nerrors) |