[svn-r7054] Purpose:

Improved tests

Description:
    Added test for dangling attributes.

    Also added code to test with weak, semi & strong file close degrees for
all tests.

Platforms tested:
    FreeBSD 4.8 (sleipnir)
    h5committest
This commit is contained in:
Quincey Koziol 2003-06-18 15:42:39 -05:00
parent 4e3716dd66
commit f15b2278d6

View File

@ -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=get_file_size(filename))==0)
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=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)