summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/dangle.c270
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)