[svn-r9890] Purpose: Clean up tests

Description:
    + C tests' macro VERIFY casts values to 'long' for all cases.  Since
      there are no operator<< for 'long long' or int64 in VS C++ ostream,
      I casted the hsize_t/hssize_t values passed to verify_val to 'long'
      as well.  If problems arise later, this may have to be specificly
      handled with an overload - th5s.cpp
    + Added the use of InvalidActionException for when an action
      should cause an exception but didn't - th5s.cpp and tfile.cpp
    + Small changes to improve failure reports

Platforms tested:
    SunOS 5.7 (arabica)
    Linux 2.4 (eirene)
This commit is contained in:
Binh-Minh Ribler 2005-01-30 23:03:36 -05:00
parent d388057d0d
commit 31a5ef7b22
4 changed files with 165 additions and 121 deletions

View File

@ -94,12 +94,13 @@ int test_report( int nerrors, const string& testname )
*
*-------------------------------------------------------------------------
*/
void issue_fail_msg(const char* where, int line, const char* file_name)
void issue_fail_msg(const char* where, int line, const char* file_name,
const char* message)
{
if (GetTestVerbosity()>=VERBO_HI)
{
cerr << " Call to routine: " << where << " at line " << line
<< " in " << file_name << "has failed" << endl;
cerr << "--> From " << where << " at line " << line
<< " in " << file_name << " - " << message << endl << endl;
}
}

View File

@ -38,7 +38,8 @@ using std::endl;
int test_report (int, const string&);
#endif
void issue_fail_msg(const char* where, int line, const char* file_name);
void issue_fail_msg(const char* where, int line, const char* file_name,
const char* message="");
template <class Type1, class Type2>
void verify_val(Type1 x, Type2 value, const char* where, int line, const char* file_name)

View File

@ -102,35 +102,30 @@ test_file_create(void)
// Create file FILE1
file1 = new H5File (FILE1, H5F_ACC_EXCL);
/*
* try to create the same file with H5F_ACC_TRUNC. This should fail
* because file1 is the same file and is currently open.
*/
// try to create the same file with H5F_ACC_TRUNC. This should fail
// because file1 is the same file and is currently open.
try {
H5File file2 (FILE1, H5F_ACC_TRUNC); // should throw E
// Should FAIL but didn't - BMR (Note 1): a macro, with a diff
// name, that skips the comparison b/w the 1st & 2nd args would
// be more appropriate, but verify_val can be used for now;
// also, more text about what is testing would be better.
verify_val(file2.getId(), FAIL, "H5File constructor", __LINE__, __FILE__);
// Should FAIL but didn't, so throw an invalid action exception
throw InvalidActionException("H5File constructor", "Attempted to create an existing file.");
}
catch( FileIException E ) {} // do nothing, FAIL expected
// Close file file1
// Close file1
delete file1;
file1 = NULL;
/*
* Try again with H5F_ACC_EXCL. This should fail because the file already
* exists from the previous steps.
*/
// Try again with H5F_ACC_EXCL. This should fail because the file already
// exists from the previous steps.
try {
H5File file2(FILE1, H5F_ACC_EXCL); // should throw E
verify_val(file2.getId(), FAIL, "H5File constructor", __LINE__, __FILE__);
// Should FAIL but didn't, so throw an invalid action exception
throw InvalidActionException("H5File constructor", "File already exists.");
}
catch( FileIException E ) {} // do nothing, FAIL expected
catch( FileIException E ) // catching creating existing file
{} // do nothing, FAIL expected
// Test create with H5F_ACC_TRUNC. This will truncate the existing file.
file1 = new H5File (FILE1, H5F_ACC_TRUNC);
@ -141,19 +136,23 @@ test_file_create(void)
*/
try {
H5File file2 (FILE1, H5F_ACC_TRUNC); // should throw E
verify_val(file2.getId(), FAIL, "H5File constructor", __LINE__, __FILE__);
}
catch( FileIException E ) {} // do nothing, FAIL expected
/*
* Try with H5F_ACC_EXCL. This should fail too because the file already
* exists.
*/
// Should FAIL but didn't, so throw an invalid action exception
throw InvalidActionException("H5File constructor", "H5F_ACC_TRUNC attempt on an opened file.");
}
catch( FileIException E ) // catching truncating opened file
{} // do nothing, FAIL expected
// Try with H5F_ACC_EXCL. This should fail too because the file already
// exists.
try {
H5File file3 (FILE1, H5F_ACC_EXCL); // should throw E
verify_val(file3.getId(), FAIL, "H5File constructor", __LINE__, __FILE__);
// Should FAIL but didn't, so throw an invalid action exception
throw InvalidActionException("H5File constructor", "H5F_ACC_EXCL attempt on an existing file.");
}
catch( FileIException E ) {} // do nothing, FAIL expected
catch( FileIException E ) // catching H5F_ACC_EXCL on existing file
{} // do nothing, FAIL expected
// Get the file-creation template
FileCreatPropList tmpl1 = file1->getCreatePlist();
@ -174,16 +173,22 @@ test_file_create(void)
// tmpl1 is automatically closed; if error occurs, it'll be
// caught in the catch block
/* Close first file */
// Close first file
delete file1;
}
catch( PropListIException E ) {
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__);
catch (InvalidActionException E)
{
cerr << " FAILED" << endl;
cerr << " <<< " << E.getDetailMsg() << " >>>" << endl << endl;
if (file1 != NULL) // clean up
delete file1;
}
catch( FileIException E ) {
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__);
if (file1 != NULL) // clean up
delete file1;
// catch all other exceptions
catch (Exception E)
{
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
if (file1 != NULL) // clean up
delete file1;
}
// Setting this to NULL for cleaning up in failure situations
@ -198,10 +203,8 @@ test_file_create(void)
tmpl1->setSizes( F2_OFFSET_SIZE, F2_LENGTH_SIZE );
tmpl1->setSymk( F2_SYM_INTERN_K, F2_SYM_LEAF_K );
/*
* Try to create second file, with non-standard file-creation template
* params.
*/
// Try to create second file, with non-standard file-creation template
// params.
H5File file2( FILE2, H5F_ACC_TRUNC, *tmpl1 );
/* Release file-creation template */
@ -260,8 +263,10 @@ test_file_create(void)
/* Dynamically release file-creation template */
delete tmpl1;
}
catch( PropListIException E ) {
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__);
// catch all exceptions
catch (Exception E)
{
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
if (tmpl1 != NULL) // clean up
delete tmpl1;
}
@ -318,7 +323,7 @@ test_file_open(void)
} // end of try block
catch( Exception E ) {
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__);
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
}
} /* test_file_open() */
@ -368,7 +373,7 @@ test_file_size(void)
} // end of try block
catch( Exception E ) {
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__);
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
}
// use C test utility routine to close property list.
@ -459,8 +464,9 @@ test_file_name()
comp_type.getFileName();
verify_val(file_name, FILE4, "CompType::getFileName", __LINE__, __FILE__);
} // end of try block
catch (Exception E) {
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__);
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
}
} /* test_file_name() */

View File

@ -95,6 +95,12 @@ int space5_data = 7;
* Mar 2001
*
* Modifications:
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
* cases. Since there are no operator<< for 'long long'
* or int64 in VS C++ ostream, I casted the hssize_t values
* passed to verify_val to 'long' as well. If problems
* arises later, this will have to be specificly handled
* with a special routine.
*-------------------------------------------------------------------------
*/
static void
@ -121,7 +127,7 @@ test_h5s_basic(void)
// Get simple extent npoints of the dataspace sid1 and verify it
hssize_t n; /* Number of dataspace elements */
n = sid1.getSimpleExtentNpoints();
verify_val(n, SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3,
verify_val((long)n, (long)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3),
"DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
// Get the logical rank of dataspace sid1 and verify it
@ -142,7 +148,7 @@ test_h5s_basic(void)
// Get simple extent npoints of dataspace sid2 and verify it
n = sid2.getSimpleExtentNpoints();
verify_val(n, SPACE2_DIM1 * SPACE2_DIM2 * SPACE2_DIM3 * SPACE2_DIM4,
verify_val((long)n, (long)(SPACE2_DIM1 * SPACE2_DIM2 * SPACE2_DIM3 * SPACE2_DIM4),
"DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
// Get the logical rank of dataspace sid2 and verify it
@ -156,39 +162,32 @@ test_h5s_basic(void)
"DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
verify_val(HDmemcmp(tmax, max2, SPACE2_RANK * sizeof(unsigned)), 0,
"DataSpace::getSimpleExtentDims", __LINE__, __FILE__);
} // end of first try block
catch( DataSpaceIException error )
{
issue_fail_msg(error.getCFuncName(), __LINE__, __FILE__);
}
/*
* Check to be sure we can't create a simple data space that has too many
* dimensions.
*/
try {
DataSpace manydims_ds(H5S_MAX_RANK+1, dims3, NULL);
// Check to be sure we can't create a simple data space that has too
// many dimensions.
try {
DataSpace manydims_ds(H5S_MAX_RANK+1, dims3, NULL);
// Should FAIL but didn't, so issue an error message
issue_fail_msg("DataSpace constructor", __LINE__, __FILE__);
}
catch( DataSpaceIException error ) {} // do nothing, FAIL expected
// Should FAIL but didn't, so throw an invalid action exception
throw InvalidActionException("DataSpace constructor", "Library allowed overwrite of existing dataset");
}
catch( DataSpaceIException E ) // Simple data space with too many dims
{} // do nothing, exception expected
/*
* Try reading a file that has been prepared that has a dataset with a
* higher dimensionality than what the library can handle.
*
* If this test fails and the H5S_MAX_RANK variable has changed, follow
* the instructions in space_overflow.c for regenating the th5s.h5 file.
*/
char testfile[512]="";
char *srcdir = getenv("srcdir");
if (srcdir && ((strlen(srcdir) + strlen(TESTFILE.c_str()) + 1) < sizeof(testfile))){
strcpy(testfile, srcdir);
strcat(testfile, "/");
}
strcat(testfile, TESTFILE.c_str());
try { // try block for testing higher dimensionality
/*
* Try reading a file that has been prepared that has a dataset with a
* higher dimensionality than what the library can handle.
*
* If this test fails and the H5S_MAX_RANK variable has changed, follow
* the instructions in space_overflow.c for regenating the th5s.h5 file.
*/
char testfile[512]="";
char *srcdir = getenv("srcdir");
if (srcdir && ((strlen(srcdir) + strlen(TESTFILE.c_str()) + 1) < sizeof(testfile))){
strcpy(testfile, srcdir);
strcat(testfile, "/");
}
strcat(testfile, TESTFILE.c_str());
// Create file
H5File fid1(testfile, H5F_ACC_RDONLY);
@ -198,41 +197,48 @@ test_h5s_basic(void)
try {
DataSet dset1 = fid1.openDataSet( "dset" );
// but didn't, issue an error message
issue_fail_msg("H5File::openDataSet", __LINE__, __FILE__);
// Should FAIL but didn't, so throw an invalid action exception
throw InvalidActionException("H5File::openDataSet", "Opening a dataset with higher dimensionality than what the library can handle");
}
catch( FileIException error ) { } // do nothing, FAIL expected
} // end of try block for testing higher dimensionality
// catch exception thrown by H5File constructor
catch( FileIException error ) {
issue_fail_msg(error.getCFuncName(), __LINE__, __FILE__);
cerr << "***cannot open the pre-created H5S_MAX_RANK test file" <<
testfile << endl;
}
catch( FileIException E ) // catching higher dimensionality dataset
{} // do nothing, exception expected
// CHECK_I(ret, "H5Fclose"); // leave this here, later, fake a failure
// in the p_close see how this will handle it. - BMR
/* Verify that incorrect dimensions don't work */
dims1[0] = 0;
try {
DataSpace wrongdim_ds (SPACE1_RANK, dims1);
verify_val(wrongdim_ds.getId(), FAIL, "DataSpace constructor", __LINE__, __FILE__);
// Verify that incorrect dimensions don't work
dims1[0] = 0;
try {
DataSpace wrongdim_ds (SPACE1_RANK, dims1);
// Should FAIL but didn't, so throw an invalid action exception
throw InvalidActionException("DataSpace constructor", "Attempted to use incorrect dimensions");
}
catch( DataSpaceIException E ) // catching use of incorrect dimensions
{} // do nothing, exception expected
// Another incorrect dimension case
DataSpace sid3 (H5S_SIMPLE);
try {
sid3.setExtentSimple( SPACE1_RANK, dims1 );
// Should FAIL but didn't, so throw an invalid action exception
throw InvalidActionException("DataSpace::setExtentSimple", "Attempted to use incorrect dimensions");
}
catch (DataSpaceIException E) // catching use of incorrect dimensions
{} // do nothing, exception expected
} // end of outer try block
catch (InvalidActionException E)
{
cerr << " FAILED" << endl;
cerr << " <<< " << E.getDetailMsg() << " >>>" << endl << endl;
}
catch( DataSpaceIException error ) {} // do nothing; FAIL expected
// Create a simple dataspace
DataSpace sid3 (H5S_SIMPLE);
// Attempts to use incorrect dimensions, should fail
try {
sid3.setExtentSimple( SPACE1_RANK, dims1 );
// but didn't, issue an error message
issue_fail_msg("DataSpace::setExtentSimple", __LINE__, __FILE__);
// catch all other exceptions
catch (Exception E)
{
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
}
catch (DataSpaceIException error) {} // do nothing, FAIL expected
} /* test_h5s_basic() */
/*-------------------------------------------------------------------------
@ -247,6 +253,12 @@ test_h5s_basic(void)
* Mar 2001
*
* Modifications:
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
* cases. Since there are no operator<< for 'long long'
* or int64 in VS C++ ostream, I casted the hssize_t values
* passed to verify_val to 'long' as well. If problems
* arises later, this will have to be specificly handled
* with a special routine.
*-------------------------------------------------------------------------
*/
static void
@ -267,7 +279,7 @@ test_h5s_scalar_write(void)
//n = H5Sget_simple_extent_npoints(sid1);
hssize_t n; /* Number of dataspace elements */
n = sid1.getSimpleExtentNpoints();
verify_val(n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
int rank; /* Logical rank of dataspace */
rank = sid1.getSimpleExtentNdims();
@ -289,9 +301,9 @@ test_h5s_scalar_write(void)
dataset.write(&space3_data, PredType::NATIVE_UINT);
} // end of try block
catch (Exception error)
catch (Exception E)
{
issue_fail_msg(error.getCFuncName(), __LINE__, __FILE__);
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
}
} /* test_h5s_scalar_write() */
@ -307,6 +319,12 @@ test_h5s_scalar_write(void)
* Mar 2001
*
* Modifications:
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
* cases. Since there are no operator<< for 'long long'
* or int64 in VS C++ ostream, I casted the hssize_t values
* passed to verify_val to 'long' as well. If problems
* arises later, this will have to be specificly handled
* with a special routine.
*-------------------------------------------------------------------------
*/
static void
@ -329,7 +347,7 @@ test_h5s_scalar_read(void)
// Get the number of dataspace elements
hssize_t n = sid1.getSimpleExtentNpoints();
verify_val(n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
// Get the logical rank of the dataspace
int ndims = sid1.getSimpleExtentNdims();
@ -342,10 +360,10 @@ test_h5s_scalar_read(void)
dataset.read(&rdata, PredType::NATIVE_UINT);
verify_val(rdata, space3_data, "DataSet::read", __LINE__, __FILE__);
} // end of try block
catch (Exception error)
catch (Exception E)
{
// all the exceptions caused by negative returned values by C APIs
issue_fail_msg(error.getCFuncName(), __LINE__, __FILE__);
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
}
} /* test_h5s_scalar_read() */
@ -362,6 +380,12 @@ test_h5s_scalar_read(void)
* May 18, 2004
*
* Modifications:
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
* cases. Since there are no operator<< for 'long long'
* or int64 in VS C++ ostream, I casted the hssize_t values
* passed to verify_val to 'long' as well. If problems
* arises later, this will have to be specificly handled
* with a special routine.
*-------------------------------------------------------------------------
*/
static void
@ -382,7 +406,7 @@ test_h5s_null(void)
//n = H5Sget_simple_extent_npoints(sid1);
hssize_t n; /* Number of dataspace elements */
n = sid1.getSimpleExtentNpoints();
verify_val(n, 0, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
verify_val((long)n, 0, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
// Create a dataset
DataSet dataset = fid1.createDataSet("Dataset1", PredType::NATIVE_UINT,sid1);
@ -394,9 +418,9 @@ test_h5s_null(void)
dataset.read(&space5_data, PredType::NATIVE_INT);
verify_val(space5_data, 7, "DataSet::read", __LINE__, __FILE__);
} // end of try block
catch (Exception error)
catch (Exception E)
{
issue_fail_msg(error.getCFuncName(), __LINE__, __FILE__);
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
}
} /* test_h5s_null() */
@ -413,6 +437,12 @@ test_h5s_null(void)
* Mar 2001
*
* Modifications:
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
* cases. Since there are no operator<< for 'long long'
* or int64 in VS C++ ostream, I casted the hssize_t values
* passed to verify_val to 'long' as well. If problems
* arises later, this will have to be specificly handled
* with a special routine.
*-------------------------------------------------------------------------
*/
static void
@ -447,7 +477,7 @@ test_h5s_compound_scalar_write(void)
// Get the number of dataspace elements
hssize_t n = sid1.getSimpleExtentNpoints();
verify_val(n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
// Get the logical rank of the dataspace
int ndims = sid1.getSimpleExtentNdims();
@ -462,10 +492,10 @@ test_h5s_compound_scalar_write(void)
dataset.write(&space4_data, tid1);
} // end of try block
catch (Exception error)
catch (Exception E)
{
// all the exceptions caused by negative returned values by C APIs
issue_fail_msg(error.getCFuncName(), __LINE__, __FILE__);
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
}
} /* test_h5s_compound_scalar_write() */
@ -483,6 +513,12 @@ test_h5s_compound_scalar_write(void)
* Mar 2001
*
* Modifications:
* January, 2005: C tests' macro VERIFY casts values to 'long' for all
* cases. Since there are no operator<< for 'long long'
* or int64 in VS C++ ostream, I casted the hssize_t values
* passed to verify_val to 'long' as well. If problems
* arises later, this will have to be specificly handled
* with a special routine.
*-------------------------------------------------------------------------
*/
static void
@ -504,7 +540,7 @@ test_h5s_compound_scalar_read(void)
// Get the number of dataspace elements
hssize_t n = sid1.getSimpleExtentNpoints();
verify_val(n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
verify_val((long)n, 1, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
// Get the logical rank of the dataspace
int ndims = sid1.getSimpleExtentNdims();
@ -532,10 +568,10 @@ test_h5s_compound_scalar_read(void)
space4_data.c1, rdata.c2);
} /* end if */
} // end of try block
catch (Exception error)
catch (Exception E)
{
// all the exceptions caused by negative returned values by C APIs
issue_fail_msg(error.getCFuncName(), __LINE__, __FILE__);
issue_fail_msg(E.getCFuncName(), __LINE__, __FILE__, E.getCDetailMsg());
}
} /* test_h5s_compound_scalar_read() */