* Brings CMake updates from develop * Brings reduction in pedantic casts from develop * Purges UFAIL from the library (#637) * Committing clang-format changes * Purges UFAIL from the library * H5HL_insert change requested in PR Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> * Removes gratuitous (double)x.yF casts (#632) * Committing clang-format changes * Removes gratuitous (double)x.yF casts * Committing clang-format changes Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> * Committing clang-format changes * Cleans up a const warning left over from previous constification (#633) * Committing clang-format changes * Adds consts to a few global variables * Cleans up a const warning left over from previous constification Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> * Formatted source * Bring over some VOL registration changes * VOL cleanup * H5VL_request_status_t substitutions * H5F.c cleanup * Minor API tweaks from develop * Moves H5G package init/teardown to H5Gint.c * H5G cleanup * H5M cleanup * H5SM cleanup * H5T cleanup * H5R cleanup * H5Lpublic.h cleanup * H5L cleanup * H5O cleanup * H5A, H5CS, and H5AC cleanup * Moved H5A init/teardown code to H5Aint.c * Moves H5D I/O functions to H5D.c * H5D cleanup * Misc minor cleanup * H5P close cleanup * H5Tpublic.h cleanup * Fixes err_compat test * H5PLpublic.h cleanup * Updates H5Ppublic.h * H5Fpublic.h updates * H5A.c cleanup * Brings over H5Aexists and related changes * Brings CMake shell testing changes from develop * Close callback changes * H5R and H5Tcommit normalization * err_compat test works now * H5O tweaks * Updates VOL registration code * Brings over H5VL_create_object * H5Tconv.c reformatting * H5T.c tweaks * Brings datatype and reference updates from develop * Brings VOL plugin loading changes from develop * Brings event sets from develop * Brings async functions over * Tools changes * Brings over many tools changes from develop * Brings VOL flags from develop * Fixes h5dump double/float tests * Updates h5repack tests * Brings h5diff test changes from develop * Last h5dump changes * Brings test changes from develop * Committing clang-format changes * Tidied h5_testing() * Brings chunk iteration code + misc from develop * Updates vds test * Enables external link parallel test * Brings updated property lists from develop * H5G changes from develop * H5MF cleanup * Brings vfd_swmr test back into CMake * Updates threadsafe test * Updates plist test * Brings recent changes from develop * Require a C++11 compiler to build the C++ wrappers (#693) * Committing clang-format changes * Requires a C++11 compiler to build the C++ wrappers Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> * Fix H5FD_mpio_Debug="rw" can report MPI_count instead of bytes (#699) * Removes pre-C99 build and header cruft (#700) * Assumes ANSI C headers exist * Assumes stdbool.h, stdint.h, and inttypes.h are present * Assumes the C++ compiler can handle stdint.h * Removes all work-arounds for missing functionality, especially stdbool.h Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> * Updates release documents * Brings parallel changes from develop * Adds a VFD/parallel check program for the VFD SWMR shell test * Updates MANIFEST * Disable building VFD SWMR acceptance tests on CMake * Removes err.h from genall5.c * Partial cleanup of H5Cpkg.h * Fixes printf specifiers in H5Cdbg.c * Java and fortran cmake changes (#694) * OESS-98 convert plugin option to FetchContent, add tests * Fixes for pkcfg files because of plugin option * OESS-98 fix tools test for plugins * Keep doxygen comments under 100 chars long - format hint * Whitespace * HDFFV-11144 - Reclassify CMake messages * HDFFV-11099/11100 added help text * Reworked switch statement to compare string instead * Fix typo * Update CDash mode * Correct name of threadsafe * Correct option name * Undo accidental commit * Note LLVM 10 to 11 format default changes * Update format plugin * Undo clang-format version 11 changes * One more correction * Update supported platforms * Revert whitespace changes * Correct whitespace * Changes from PR#3 * HDFFV-11213 added option to control gcc10 warnings diagnostics * HDFFV-11212 Use the new references correctly in JNI utility and tests * format source * Fix typo * Add new test file * HDFFV-11212 - update test and remove unused arg * Minor non-space formatting changes * Use H5I_INVALID_ID instead of "-1" * source formatting * add missing testfile, update jni function * Undo commit of debug code * remove mislocated file * Fix h5repack test for handling of fapls and id close * Update h5diff test files usage text * HDFFV-11212 add new ref tests for JNI export dataset * src format update * Remove blank line typo * src format typo * long double requires %Lg * Another long double foramt specifer S.B. %Lg * issue with t128bit test * Windows issue with h5dump and type. * Fix review issues * refactor function nesting and fix error checks * format fixes * Remove untested functions and javadoc quiet comments * Restore TRY block. * Change string append errors to memory exception * revert to H5_JNI_FATAL_ERROR - support functions need work * Add assertion error for h5util functions * remove duplicate function * format fix * Revert HD function error handling * Update copyright comments * GH #386 java folder copyright corrections * Whitespace * GH #359 implement and fix tools 1.6 API usage * remove excessive comments * Flip inits to correct ifdef section * rework ifdef to be simpler * format issue * Reformat ifdef inits * remove static attribute * format compliance * Update names * Revert because logic relies on float not being int * Changes noticed from creating merge of #412 * Double underscore change * Correct compiler version variable used * Remove header guard underscores * Whitespace cleanup * Split format source and commit changes on repo push * remove pre-split setting * Change windows TS to use older VS. * correct window os name * HDFFV-11212 JNI export util and Javadoc * Suggested review changes * Another change found * Committing clang-format changes * HDFFV-11113 long double in tools * HDFFV-11113 add note * Disable long double tests for now * HDFFV-11228 remove arbitrary CMake warning groups. * Make each flag a string * Some Javadoc warning fixes * Updated javadoc fixes * # WARNING: head commit changed in the meantime HDFFV-11229 Fix long double usage in tools and java Changed h5dump and h5ls to just print 128-bit for long double type. Added test and file for dataset and attributes with all three float types. * Committing clang-format changes * HDFFV-11229 Add release note * HDFFV-11229 windows testfile needed * fix typo * Remove non supported message text * HDFFV-11229 - change ldouble test to check both native and general * HDFFV-11229 add second file compare * HDFFV-11229 fix reference file * HDFFV-11229 autotools check two refs * HDFFV-11229 revert back to removal of NATIVE_LDOUBLE in tools output * Committing clang-format changes * Update release note * Update attribute type of ref file * Change source of ninja for macs * try port instead of brew * Recommended is to use brew. * Undo non long double changes * remove unneeded file * Fix perl and doxygen CMake code * Add "option" command for clang options * Rework CMake add_custom to use the BYPRODUCTS argument * Add stamp files to BYPRODUCTS * Only one copy of file exists * Fix custom cmmand depends targets * Fix fortran custom command DEPENDS * Add LD_LIBRARY_PATH to tests * Add custom target for DEPENDS * Add h5detect conditionaly to generated target DEPENDS * Correct DEPENDS targets * Parallel builds need the mpi compiler for pkgconfig scripts. * install only if MPI build * Fortran target depends * Remove incorrect source attribute * doxygen adjustments * doxygen build updates * Correct version * Correct function version - function has been merged to 1.12 * Correct version string for map functions * Cleanup warnings for tools debug builds * TRILAB-227 - fix indexing for h5diff selections * Correct location of pos to index function call * TRILAB-227 Enable test * Quote subset args * Use MATCHES because of AppleClang * if blocks needed for build modes * Update list of DT platforms * VS2019 correctly displays float values * revert VS2019 change * Issue #669 remove version from pkgcfg filename * remove version from h5cc script * Java reference functions updated enabled fortran in cmake gcc action yaml file java reference test changed to correctly test refs jni reference functions that create ids changed to use jni id logging * Correct BYPRODUCTS argument * Correct more genereated files BYPRODUCTS * BYPRODUCTS must have unique locations * Fix typo Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> * Removes alternative function enter/leave macro scheme (#678) * Committing clang-format changes * Converted BEGIN_FUNC, etc. macros to FUNC_ENTER * Rips out the BEGIN_FUNC, etc. macros * Removes 'end if', etc. comments from H5HL package * Committing clang-format changes * Fixes an H5EA iterate issue * Fixes an issue in the H5FA iterator code * Further cleanup in bin/trace after macro removal * Iterator changes in H5EA and H5FA Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> * Split H5L.c internal code to H5Lint.c (#691) * Committing clang-format changes * Splits internal parts of H5L.c to H5Lint.c Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> * Clean up type size checks in configure.ac (#702) * Committing clang-format changes * C++ warning and build fixes (#707) * Committing clang-format changes * C++ build and warning updates * Fixes all warnings on C++ (with gcc 9.3) * Updates CMake and Autotools C++ builds * Undo warning clobber Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> * Removes some DEC Alpha cruft from H5detect and H5private.h (#708) * Cleans up hsize_t and haddr_t size guessing (#709) * Cleans up definitions of haddr_t and hsize_t + cruft removal * Formatted source * Updates PGI C/C++ configurations (#715) * Updates PGI C/C++ configurations Tweaks some settings and configures pgc++ to use C++11 * Updated copyright information * Adds an Intel C++ configuration file (#716) * Adds an Intel C++ configuration file * Committing clang-format changes Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> * Updates bin/trace script to correctly wrap H5TRACE macros near clang-format column limit (#719) * Removes clang-format comments from H5O.c call * Fixes bin/trace to correctly wrap lines near the clang-format limit * Removed unused variable from bin/trace * Fixes issue with ccmake that prevents building Fortran (#723) ccmake runs iteratively, and the check_fortran_source_runs macros were clobbering a single output file that did not get updated on further configure iterations Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
1056 lines
39 KiB
C++
1056 lines
39 KiB
C++
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
* Copyright by The HDF Group. *
|
|
* Copyright by the Board of Trustees of the University of Illinois. *
|
|
* All rights reserved. *
|
|
* *
|
|
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
|
* terms governing use, modification, and redistribution, is contained in *
|
|
* the COPYING file, which can be found at the root of the source code *
|
|
* distribution tree, or in https://www.hdfgroup.org/licenses. *
|
|
* If you do not have access to either file, you may request a copy from *
|
|
* help@hdfgroup.org. *
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
/*****************************************************************************
|
|
FILE
|
|
tfile.cpp - HDF5 C++ testing the file I/O features
|
|
|
|
EXTERNAL ROUTINES/VARIABLES:
|
|
These routines are in the test directory of the C library:
|
|
h5_fileaccess() -- in h5test.c, returns a file access template
|
|
|
|
***************************************************************************/
|
|
#include <iostream>
|
|
using std::cerr;
|
|
using std::endl;
|
|
|
|
#include <string>
|
|
#include "H5Cpp.h" // C++ API header file
|
|
using namespace H5;
|
|
|
|
#include "h5test.h"
|
|
#include "h5cpputil.h" // C++ utilility header file
|
|
|
|
const hsize_t F1_USERBLOCK_SIZE = 0;
|
|
const size_t F1_OFFSET_SIZE = sizeof(haddr_t);
|
|
const size_t F1_LENGTH_SIZE = sizeof(hsize_t);
|
|
const unsigned F1_SYM_LEAF_K = 4;
|
|
const unsigned F1_SYM_INTERN_K = 16;
|
|
const H5std_string FILE1("tfile1.h5");
|
|
|
|
const hsize_t F2_USERBLOCK_SIZE = 512;
|
|
const size_t F2_OFFSET_SIZE = 8;
|
|
const size_t F2_LENGTH_SIZE = 8;
|
|
const unsigned F2_SYM_LEAF_K = 8;
|
|
const unsigned F2_SYM_INTERN_K = 32;
|
|
const unsigned F2_ISTORE = 64;
|
|
const H5std_string FILE2("tfile2.h5");
|
|
|
|
const hsize_t F3_USERBLOCK_SIZE = 0;
|
|
const size_t F3_OFFSET_SIZE = F2_OFFSET_SIZE;
|
|
const size_t F3_LENGTH_SIZE = F2_LENGTH_SIZE;
|
|
const unsigned F3_SYM_LEAF_K = F2_SYM_LEAF_K;
|
|
const unsigned F3_SYM_INTERN_K = F2_SYM_INTERN_K;
|
|
const H5std_string FILE3("tfile3.h5");
|
|
|
|
const int KB = 1024;
|
|
const H5std_string FILE4("tfile4.h5");
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_file_create
|
|
*
|
|
* Purpose Test file and template creations
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (use C version)
|
|
* January, 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 hsize_t values
|
|
* passed to verify_val to 'long' as well. If problems
|
|
* arises later, this will have to be specifically handled
|
|
* with a special routine.
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_file_create()
|
|
{
|
|
// Output message about test being performed
|
|
SUBTEST("File Creation I/O");
|
|
|
|
// Test create with various sequences of H5F_ACC_EXCL and
|
|
// H5F_ACC_TRUNC flags
|
|
|
|
// Create with H5F_ACC_EXCL
|
|
// First ensure the file does not exist
|
|
remove(FILE1.c_str());
|
|
|
|
// Setting this to NULL for cleaning up in failure situations
|
|
H5File *file1 = NULL;
|
|
try {
|
|
// 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 {
|
|
H5File file2(FILE1, H5F_ACC_TRUNC); // should throw E
|
|
|
|
// Should FAIL but didn't, so throw an invalid action exception
|
|
throw InvalidActionException("H5File constructor", "Attempted to create an existing file.");
|
|
}
|
|
catch (FileIException &E) // catch truncating existing file
|
|
{
|
|
} // do nothing, FAIL expected
|
|
|
|
// 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 {
|
|
H5File file2(FILE1, H5F_ACC_EXCL); // should throw E
|
|
|
|
// Should FAIL but didn't, so throw an invalid action exception
|
|
throw InvalidActionException("H5File constructor", "File already exists.");
|
|
}
|
|
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);
|
|
|
|
// Try to create first file again. 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, 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
|
|
|
|
// 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) // catching H5F_ACC_EXCL on existing file
|
|
{
|
|
} // do nothing, FAIL expected
|
|
|
|
// Get the file-creation template
|
|
FileCreatPropList tmpl1 = file1->getCreatePlist();
|
|
|
|
hsize_t ublock = tmpl1.getUserblock();
|
|
verify_val(static_cast<long>(ublock), static_cast<long>(F1_USERBLOCK_SIZE),
|
|
"FileCreatPropList::getUserblock", __LINE__, __FILE__);
|
|
|
|
size_t parm1, parm2; // file-creation parameters
|
|
tmpl1.getSizes(parm1, parm2);
|
|
verify_val(parm1, F1_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
|
|
verify_val(parm2, F1_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
|
|
|
|
unsigned iparm1, iparm2; // file-creation parameters
|
|
tmpl1.getSymk(iparm1, iparm2);
|
|
verify_val(iparm1, F1_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
|
|
verify_val(iparm2, F1_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
|
|
|
|
// tmpl1 is automatically closed; if error occurs, it'll be
|
|
// caught in the catch block
|
|
|
|
// Close first file
|
|
delete file1;
|
|
}
|
|
catch (InvalidActionException &E) {
|
|
cerr << " *FAILED*" << endl;
|
|
cerr << " <<< " << E.getDetailMsg() << " >>>" << endl << endl;
|
|
// clean up
|
|
delete file1;
|
|
}
|
|
// catch all other exceptions
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_file_create()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
// clean up
|
|
delete file1;
|
|
}
|
|
|
|
// Setting this to NULL for cleaning up in failure situations
|
|
FileCreatPropList *tmpl1 = NULL;
|
|
try {
|
|
// Create a new file with a non-standard file-creation template
|
|
tmpl1 = new FileCreatPropList;
|
|
|
|
// Set the new file-creation parameters
|
|
tmpl1->setUserblock(F2_USERBLOCK_SIZE);
|
|
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.
|
|
H5File file2(FILE2, H5F_ACC_TRUNC, *tmpl1);
|
|
|
|
// Release file-creation template
|
|
delete tmpl1;
|
|
tmpl1 = NULL;
|
|
|
|
// Get the file-creation template
|
|
tmpl1 = new FileCreatPropList(file2.getCreatePlist());
|
|
|
|
// Get the file-creation parameters
|
|
hsize_t ublock = tmpl1->getUserblock();
|
|
verify_val(static_cast<long>(ublock), static_cast<long>(F2_USERBLOCK_SIZE),
|
|
"FileCreatPropList::getUserblock", __LINE__, __FILE__);
|
|
|
|
size_t parm1, parm2; // file-creation parameters
|
|
tmpl1->getSizes(parm1, parm2);
|
|
verify_val(parm1, F2_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
|
|
verify_val(parm2, F2_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
|
|
|
|
unsigned iparm1, iparm2; // file-creation parameters
|
|
tmpl1->getSymk(iparm1, iparm2);
|
|
verify_val(iparm1, F2_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
|
|
verify_val(iparm2, F2_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
|
|
|
|
// Clone the file-creation template
|
|
FileCreatPropList tmpl2;
|
|
tmpl2.copy(*tmpl1);
|
|
|
|
// Release file-creation template
|
|
delete tmpl1;
|
|
tmpl1 = NULL;
|
|
|
|
// Set the new file-creation parameter
|
|
tmpl2.setUserblock(F3_USERBLOCK_SIZE);
|
|
|
|
// Try to create second file, with non-standard file-creation template
|
|
// params
|
|
H5File file3(FILE3, H5F_ACC_TRUNC, tmpl2);
|
|
|
|
// Get the file-creation template
|
|
tmpl1 = new FileCreatPropList(file3.getCreatePlist());
|
|
|
|
// Get the file-creation parameters
|
|
ublock = tmpl1->getUserblock();
|
|
verify_val(static_cast<long>(ublock), static_cast<long>(F3_USERBLOCK_SIZE),
|
|
"FileCreatPropList::getUserblock", __LINE__, __FILE__);
|
|
|
|
tmpl1->getSizes(parm1, parm2);
|
|
verify_val(parm1, F3_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
|
|
verify_val(parm2, F3_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
|
|
|
|
tmpl1->getSymk(iparm1, iparm2);
|
|
verify_val(iparm1, F3_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
|
|
verify_val(iparm2, F3_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
|
|
|
|
// Release file-creation template
|
|
delete tmpl1;
|
|
PASSED();
|
|
}
|
|
// catch all exceptions
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_file_create()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
// clean up
|
|
delete tmpl1;
|
|
}
|
|
} // test_file_create()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_file_open
|
|
*
|
|
* Purpose Test file accesses
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (use C version)
|
|
* January, 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 hsize_t values
|
|
* passed to verify_val to 'long' as well. If problems
|
|
* arises later, this will have to be specifically handled
|
|
* with a special routine.
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_file_open()
|
|
{
|
|
// Output message about test being performed
|
|
SUBTEST("File Opening I/O");
|
|
|
|
try {
|
|
|
|
// Open first file
|
|
H5File file1(FILE2, H5F_ACC_RDWR);
|
|
|
|
// Get the file-creation template
|
|
FileCreatPropList tmpl1 = file1.getCreatePlist();
|
|
|
|
// Get the file-creation parameters
|
|
hsize_t ublock = tmpl1.getUserblock();
|
|
verify_val(static_cast<long>(ublock), static_cast<long>(F2_USERBLOCK_SIZE),
|
|
"FileCreatPropList::getUserblock", __LINE__, __FILE__);
|
|
|
|
size_t parm1, parm2; // file-creation parameters
|
|
tmpl1.getSizes(parm1, parm2);
|
|
verify_val(parm1, F2_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
|
|
verify_val(parm2, F2_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
|
|
|
|
unsigned iparm1, iparm2; // file-creation parameters
|
|
tmpl1.getSymk(iparm1, iparm2);
|
|
verify_val(iparm1, F2_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
|
|
verify_val(iparm2, F2_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
|
|
|
|
// Test H5File constructor with existing file id
|
|
H5File file2(file1.getId());
|
|
file1.close();
|
|
|
|
// Try truncating the file, and it should fail because the file is
|
|
// still opened with file2.
|
|
try {
|
|
H5File file3(FILE2, H5F_ACC_TRUNC); // should throw E
|
|
|
|
// Should FAIL but didn't, so throw an invalid action exception
|
|
throw InvalidActionException("H5File constructor", "Attempt truncating an opened file.");
|
|
}
|
|
catch (FileIException &E) // catching H5F_ACC_TRUNC on opened file
|
|
{
|
|
} // do nothing, FAIL expected
|
|
|
|
// Now, really close the file.
|
|
file2.close();
|
|
|
|
// Truncating should succeed now.
|
|
H5File file3(FILE2, H5F_ACC_TRUNC);
|
|
|
|
// Opening another file to file3 object, FILE2 should be closed, so
|
|
// the next attempt to truncate FILE2 should succeed.
|
|
file3.openFile(FILE1, H5F_ACC_RDONLY);
|
|
H5File file4(FILE2, H5F_ACC_TRUNC);
|
|
|
|
PASSED();
|
|
} // end of try block
|
|
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_file_open()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
} // test_file_open()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_file_size
|
|
*
|
|
* Purpose Test file size.
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Raymond Lu
|
|
* June, 2004
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_file_size()
|
|
{
|
|
// Output message about test being performed
|
|
SUBTEST("File Size");
|
|
|
|
hid_t fapl_id;
|
|
fapl_id = h5_fileaccess(); // in h5test.c, returns a file access template
|
|
|
|
try {
|
|
// Use the file access template id to create a file access prop.
|
|
// list object to pass in H5File::H5File
|
|
FileAccPropList fapl(fapl_id);
|
|
|
|
// Set to sec2 driver. Do we want to test other file drivers?
|
|
// They're not tested in C++.
|
|
// File drivers seem not implemented.
|
|
// fapl.setSec2();
|
|
|
|
// Create a file
|
|
H5File file4(FILE4, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
|
|
|
|
// Get file size
|
|
hsize_t file_size = file4.getFileSize();
|
|
|
|
// Check if file size is reasonable. It's supposed to be 2KB now.
|
|
if (file_size < 1 * KB || file_size > 4 * KB)
|
|
issue_fail_msg("test_file_size()", __LINE__, __FILE__,
|
|
"getFileSize() returned unreasonable value");
|
|
|
|
// Get the amount of free space in the file
|
|
hssize_t free_space = file4.getFreeSpace();
|
|
|
|
// Check if it's reasonable. It's 0 now.
|
|
if (free_space < 0 || free_space > 4 * KB)
|
|
issue_fail_msg("test_file_size()", __LINE__, __FILE__,
|
|
"getFreeSpace returned unreasonable value");
|
|
|
|
PASSED();
|
|
} // end of try block
|
|
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_file_size()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
|
|
// use C test utility routine to close property list.
|
|
herr_t ret = H5Pclose(fapl_id);
|
|
if (ret < 0)
|
|
issue_fail_msg("test_file_size()", __LINE__, __FILE__, "H5Pclose failed");
|
|
|
|
} // test_file_size()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_file_num
|
|
*
|
|
* Purpose Test file number.
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Quincey Koziol
|
|
* April, 2019
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_file_num()
|
|
{
|
|
// Output message about test being performed
|
|
SUBTEST("File Number");
|
|
|
|
hid_t fapl_id;
|
|
fapl_id = h5_fileaccess(); // in h5test.c, returns a file access template
|
|
|
|
try {
|
|
// Use the file access template id to create a file access prop.
|
|
// list object to pass in H5File::H5File
|
|
FileAccPropList fapl(fapl_id);
|
|
|
|
// Create two files
|
|
H5File file1(FILE1, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
|
|
H5File file2(FILE2, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
|
|
|
|
// Open the first file again
|
|
H5File file3(FILE1, H5F_ACC_RDWR);
|
|
|
|
// Get file numbers
|
|
unsigned long file_num1 = file1.getFileNum();
|
|
unsigned long file_num2 = file2.getFileNum();
|
|
unsigned long file_num3 = file3.getFileNum();
|
|
|
|
// Check file numbers
|
|
if (file_num1 == file_num2)
|
|
issue_fail_msg("test_file_num()", __LINE__, __FILE__, "getFileNum() returned wrong value");
|
|
if (file_num1 != file_num3)
|
|
issue_fail_msg("test_file_num()", __LINE__, __FILE__, "getFileNum() returned wrong value");
|
|
|
|
PASSED();
|
|
} // end of try block
|
|
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_file_num()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
|
|
// use C test utility routine to close property list.
|
|
herr_t ret = H5Pclose(fapl_id);
|
|
if (ret < 0)
|
|
issue_fail_msg("test_file_num()", __LINE__, __FILE__, "H5Pclose failed");
|
|
|
|
} // test_file_num()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_file_name
|
|
*
|
|
* Purpose Test getting file's name.
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler
|
|
* July, 2004
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
const int RANK = 2;
|
|
const int NX = 4;
|
|
const int NY = 5;
|
|
const H5std_string GROUPNAME("group");
|
|
const H5std_string DSETNAME("dataset");
|
|
const H5std_string DATTRNAME("dataset attribute");
|
|
const H5std_string FATTRNAME("file attribute");
|
|
const H5std_string DTYPENAME("compound");
|
|
|
|
// Compound datatype
|
|
typedef struct s1_t {
|
|
unsigned int a;
|
|
float b;
|
|
} s1_t;
|
|
|
|
static void
|
|
test_file_name()
|
|
{
|
|
// Output message about test being performed.
|
|
SUBTEST("File Name");
|
|
|
|
H5std_string file_name;
|
|
try {
|
|
// Create a file using default properties.
|
|
H5File file4(FILE4, H5F_ACC_TRUNC);
|
|
|
|
// Get file name from the file instance.
|
|
file_name = file4.getFileName();
|
|
verify_val(file_name, FILE4, "H5File::getFileName", __LINE__, __FILE__);
|
|
|
|
// Create a group in the root group.
|
|
Group group(file4.createGroup(GROUPNAME, 0));
|
|
|
|
// Get and verify file name via a group.
|
|
file_name = group.getFileName();
|
|
verify_val(file_name, FILE4, "Group::getFileName", __LINE__, __FILE__);
|
|
|
|
// Create the data space.
|
|
hsize_t dims[RANK] = {NX, NY};
|
|
DataSpace space(RANK, dims);
|
|
|
|
// Create a new dataset.
|
|
DataSet dataset(file4.createDataSet(DSETNAME, PredType::NATIVE_INT, space));
|
|
|
|
// Get and verify file name via a dataset.
|
|
file_name = dataset.getFileName();
|
|
verify_val(file_name, FILE4, "DataSet::getFileName", __LINE__, __FILE__);
|
|
|
|
// Create an attribute for the dataset.
|
|
Attribute attr(dataset.createAttribute(DATTRNAME, PredType::NATIVE_INT, space));
|
|
|
|
// Get and verify file name via an attribute.
|
|
file_name = attr.getFileName();
|
|
verify_val(file_name, FILE4, "Attribute::getFileName", __LINE__, __FILE__);
|
|
|
|
// Create a compound datatype.
|
|
CompType comp_type(sizeof(s1_t));
|
|
|
|
// Insert fields.
|
|
comp_type.insertMember("a", HOFFSET(s1_t, a), PredType::NATIVE_INT);
|
|
comp_type.insertMember("b", HOFFSET(s1_t, b), PredType::NATIVE_FLOAT);
|
|
|
|
// Save it on file.
|
|
comp_type.commit(file4, DTYPENAME);
|
|
|
|
// Get and verify file name via a committed datatype.
|
|
comp_type.getFileName();
|
|
verify_val(file_name, FILE4, "CompType::getFileName", __LINE__, __FILE__);
|
|
PASSED();
|
|
} // end of try block
|
|
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_file_name()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
} // test_file_name()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Function: test_file_attribute
|
|
*
|
|
* Purpose Test file attributes
|
|
*
|
|
* Return None
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
const int RANK1 = 1;
|
|
const int ATTR1_DIM1 = 3;
|
|
const H5std_string FILE5("tfattrs.h5");
|
|
const H5std_string FATTR1_NAME("file attribute 1");
|
|
const H5std_string FATTR2_NAME("file attribute 2");
|
|
int fattr_data[ATTR1_DIM1] = {512, -234, 98123}; // Test data for file attribute
|
|
int dattr_data[ATTR1_DIM1] = {256, -123, 1000}; // Test data for dataset attribute
|
|
|
|
static void
|
|
test_file_attribute()
|
|
{
|
|
int rdata[ATTR1_DIM1];
|
|
int i;
|
|
|
|
// Output message about test being performed
|
|
SUBTEST("File Attribute");
|
|
|
|
H5std_string file_name;
|
|
try {
|
|
// Create a file using default properties.
|
|
H5File file5(FILE5, H5F_ACC_TRUNC);
|
|
|
|
// Create the data space
|
|
hsize_t dims[RANK1] = {ATTR1_DIM1};
|
|
DataSpace space(RANK1, dims);
|
|
|
|
// Create two attributes for the file
|
|
Attribute fattr1(file5.createAttribute(FATTR1_NAME, PredType::NATIVE_FLOAT, space));
|
|
Attribute fattr2(file5.createAttribute(FATTR2_NAME, PredType::NATIVE_INT, space));
|
|
|
|
fattr2.write(PredType::NATIVE_INT, fattr_data);
|
|
|
|
try {
|
|
// Try to create the same attribute again (should fail)
|
|
Attribute fattr_dup(file5.createAttribute(FATTR2_NAME, PredType::NATIVE_INT, space));
|
|
// Should FAIL but didn't, so throw an invalid action exception
|
|
throw InvalidActionException("H5File createAttribute",
|
|
"Attempted to create an existing attribute.");
|
|
}
|
|
catch (AttributeIException &E) // catch creating existing attribute
|
|
{
|
|
} // do nothing, FAIL expected
|
|
|
|
// Create a new dataset
|
|
DataSet dataset(file5.createDataSet(DSETNAME, PredType::NATIVE_INT, space));
|
|
|
|
// Create an attribute for the dataset
|
|
Attribute dattr(dataset.createAttribute(DATTRNAME, PredType::NATIVE_INT, space));
|
|
|
|
// Write data to the second file attribute
|
|
dattr.write(PredType::NATIVE_INT, dattr_data);
|
|
|
|
// Test flushing out the data from the attribute object
|
|
dattr.flush(H5F_SCOPE_GLOBAL);
|
|
|
|
// Get and verify the number of all objects in the file
|
|
// Current: 1 file, 2 file attr, 1 ds, and 1 ds attr.
|
|
ssize_t num_objs = file5.getObjCount(H5F_OBJ_ALL);
|
|
verify_val(num_objs, 5, "H5File::getObjCount", __LINE__, __FILE__);
|
|
|
|
num_objs = file5.getObjCount(H5F_OBJ_GROUP);
|
|
verify_val(num_objs, 0, "H5File::getObjCount(H5F_OBJ_GROUP)", __LINE__, __FILE__);
|
|
num_objs = file5.getObjCount(H5F_OBJ_DATASET);
|
|
verify_val(num_objs, 1, "H5File::getObjCount(H5F_OBJ_DATASET)", __LINE__, __FILE__);
|
|
num_objs = file5.getObjCount(H5F_OBJ_ATTR);
|
|
verify_val(num_objs, 3, "H5File::getObjCount(H5F_OBJ_ATTR)", __LINE__, __FILE__);
|
|
num_objs = file5.getObjCount(H5F_OBJ_DATATYPE);
|
|
verify_val(num_objs, 0, "H5File::getObjCount(H5F_OBJ_DATATYPE)", __LINE__, __FILE__);
|
|
num_objs = file5.getObjCount(H5F_OBJ_FILE);
|
|
verify_val(num_objs, 1, "H5File::getObjCount(H5F_OBJ_FILE)", __LINE__, __FILE__);
|
|
|
|
// Get the file name using the attributes
|
|
H5std_string fname = fattr1.getFileName();
|
|
verify_val(fname, FILE5, "H5File::getFileName()", __LINE__, __FILE__);
|
|
|
|
fname.clear();
|
|
fname = dattr.getFileName();
|
|
verify_val(fname, FILE5, "H5File::getFileName()", __LINE__, __FILE__);
|
|
|
|
// Get the class of a file attribute's datatype
|
|
H5T_class_t atclass = fattr1.getTypeClass();
|
|
verify_val(static_cast<long>(atclass), static_cast<long>(H5T_FLOAT), "Attribute::getTypeClass()",
|
|
__LINE__, __FILE__);
|
|
|
|
// Get and verify the number of attributes attached to a file
|
|
int n_attrs = file5.getNumAttrs();
|
|
verify_val(n_attrs, 2, "H5File::getNumAttrs()", __LINE__, __FILE__);
|
|
|
|
// Get and verify the number of attributes attached to a dataset
|
|
n_attrs = 0;
|
|
n_attrs = dataset.getNumAttrs();
|
|
verify_val(n_attrs, 1, "DataSet::getNumAttrs()", __LINE__, __FILE__);
|
|
|
|
// Read back attribute's data
|
|
HDmemset(rdata, 0, sizeof(rdata));
|
|
dattr.read(PredType::NATIVE_INT, rdata);
|
|
/* Check results */
|
|
for (i = 0; i < ATTR1_DIM1; i++) {
|
|
if (rdata[i] != dattr_data[i]) {
|
|
H5_FAILED();
|
|
cerr << endl;
|
|
cerr << "element [" << i << "] is " << rdata[i] << "but should have been " << dattr_data[i]
|
|
<< endl;
|
|
}
|
|
}
|
|
PASSED();
|
|
} // end of try block
|
|
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_file_attribute()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
} // test_file_attribute()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_libver_bounds_real
|
|
*
|
|
* Purpose Verify that a file created and modified with the
|
|
* specified libver bounds has the specified object header
|
|
* versions for the right objects.
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (use C version)
|
|
* March, 2015
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
const H5std_string FILE6("tfile5.h5");
|
|
const H5std_string ROOTGROUP("/");
|
|
const H5std_string GROUP1("/G1");
|
|
const H5std_string SUBGROUP3("/G1/G3");
|
|
|
|
static void
|
|
test_libver_bounds_real(H5F_libver_t libver_create, unsigned oh_vers_create, H5F_libver_t libver_mod,
|
|
unsigned oh_vers_mod)
|
|
{
|
|
try {
|
|
|
|
/*
|
|
* Create a new file using the default creation property and access property
|
|
* with latest library version.
|
|
*/
|
|
FileAccPropList fapl;
|
|
fapl.setLibverBounds(libver_create, H5F_LIBVER_LATEST);
|
|
H5File file(FILE6, H5F_ACC_TRUNC, FileCreatPropList::DEFAULT, fapl);
|
|
|
|
/*
|
|
* Make sure the root group has the correct object header version
|
|
*/
|
|
unsigned obj_version = file.childObjVersion(ROOTGROUP);
|
|
verify_val(obj_version, oh_vers_create, "H5File::childObjVersion", __LINE__, __FILE__);
|
|
|
|
// Verify object header version another way
|
|
H5O_native_info_t ninfo;
|
|
HDmemset(&ninfo, 0, sizeof(ninfo));
|
|
file.getNativeObjinfo(ninfo, H5O_NATIVE_INFO_HDR);
|
|
verify_val(ninfo.hdr.version, oh_vers_create, "H5File::getNativeObjinfo", __LINE__, __FILE__);
|
|
|
|
/*
|
|
* Reopen the file and make sure the root group still has the correct
|
|
* version
|
|
*/
|
|
file.close();
|
|
|
|
fapl.setLibverBounds(libver_mod, H5F_LIBVER_LATEST);
|
|
|
|
file.openFile(FILE6, H5F_ACC_RDWR, fapl);
|
|
|
|
obj_version = file.childObjVersion(ROOTGROUP);
|
|
verify_val(obj_version, oh_vers_create, "H5File::childObjVersion", __LINE__, __FILE__);
|
|
|
|
/*
|
|
* Create a group named "/G1" in the file, and make sure it has the correct
|
|
* object header version
|
|
*/
|
|
Group group = file.createGroup(GROUP1);
|
|
|
|
obj_version = group.objVersion();
|
|
verify_val(obj_version, oh_vers_mod, "Group::objVersion", __LINE__, __FILE__);
|
|
|
|
// Verify object header version another way
|
|
HDmemset(&ninfo, 0, sizeof(ninfo));
|
|
group.getNativeObjinfo(ninfo, H5O_NATIVE_INFO_HDR);
|
|
verify_val(ninfo.hdr.version, oh_vers_mod, "Group::getNativeObjinfo", __LINE__, __FILE__);
|
|
|
|
group.close(); // close "/G1"
|
|
|
|
/*
|
|
* Create a group named "/G1/G3" in the file, and make sure it has the
|
|
* correct object header version
|
|
*/
|
|
group = file.createGroup(SUBGROUP3);
|
|
|
|
obj_version = group.objVersion();
|
|
verify_val(obj_version, oh_vers_mod, "Group::objVersion", __LINE__, __FILE__);
|
|
|
|
group.close(); // close "/G1/G3"
|
|
|
|
/*
|
|
* Make sure the root group still has the correct object header version
|
|
*/
|
|
obj_version = file.childObjVersion(ROOTGROUP);
|
|
verify_val(obj_version, oh_vers_create, "H5File::childObjVersion", __LINE__, __FILE__);
|
|
|
|
// Everything should be closed as they go out of scope
|
|
} // end of try block
|
|
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_libver_bounds_real()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
|
|
} /* end test_libver_bounds_real() */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
*
|
|
* Function: test_libver_bounds
|
|
*
|
|
* Purpose Verify that a file created and modified with various
|
|
* libver bounds is handled correctly.
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (use C version)
|
|
* March 2015
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_libver_bounds()
|
|
{
|
|
// Output message about test being performed
|
|
SUBTEST("Setting library version bounds");
|
|
|
|
/* Run the tests */
|
|
test_libver_bounds_real(H5F_LIBVER_EARLIEST, H5O_VERSION_1, H5F_LIBVER_LATEST, H5O_VERSION_2);
|
|
test_libver_bounds_real(H5F_LIBVER_LATEST, H5O_VERSION_2, H5F_LIBVER_EARLIEST, H5O_VERSION_2);
|
|
PASSED();
|
|
} /* end test_libver_bounds() */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_commonfg
|
|
*
|
|
* Purpose Verify that H5File works as a root group.
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (use C version)
|
|
* March, 2015
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
static void
|
|
test_commonfg()
|
|
{
|
|
// Output message about test being performed
|
|
SUBTEST("Root group");
|
|
|
|
try {
|
|
// Create a file using default properties.
|
|
H5File file4(FILE4, H5F_ACC_TRUNC);
|
|
|
|
// Try opening the root group.
|
|
Group rootgroup(file4.openGroup(ROOTGROUP));
|
|
|
|
// Create a group in the root group.
|
|
Group group(rootgroup.createGroup(GROUPNAME, 0));
|
|
|
|
// Create the data space.
|
|
hsize_t dims[RANK] = {NX, NY};
|
|
DataSpace space(RANK, dims);
|
|
|
|
// Create a new dataset.
|
|
DataSet dataset(group.createDataSet(DSETNAME, PredType::NATIVE_INT, space));
|
|
|
|
// Get and verify file name via a dataset.
|
|
H5std_string file_name = dataset.getFileName();
|
|
verify_val(file_name, FILE4, "DataSet::getFileName", __LINE__, __FILE__);
|
|
|
|
// Create an attribute for the dataset.
|
|
Attribute attr(dataset.createAttribute(DATTRNAME, PredType::NATIVE_INT, space));
|
|
|
|
// Get and verify file name via an attribute.
|
|
file_name = attr.getFileName();
|
|
verify_val(file_name, FILE4, "Attribute::getFileName", __LINE__, __FILE__);
|
|
|
|
// Create an attribute for the file via root group.
|
|
Attribute rootg_attr(rootgroup.createAttribute(FATTRNAME, PredType::NATIVE_INT, space));
|
|
|
|
// Get and verify file name via an attribute.
|
|
file_name = attr.getFileName();
|
|
verify_val(file_name, FILE4, "Attribute::getFileName", __LINE__, __FILE__);
|
|
|
|
PASSED();
|
|
} // end of try block
|
|
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_commonfg()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
|
|
} /* end test_commonfg() */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_file_info
|
|
*
|
|
* Purpose Verify that various properties in a file creation property
|
|
* lists are stored correctly in the file and can be retrieved
|
|
* when the file is re-opened.
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler
|
|
* February, 2017
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
const H5std_string FILE7("tfile7.h5");
|
|
const hsize_t FSP_SIZE_DEF = 4096;
|
|
const hsize_t FSP_SIZE512 = 512;
|
|
|
|
static void
|
|
test_file_info()
|
|
{
|
|
// Output message about test being performed
|
|
SUBTEST("File general information");
|
|
|
|
hsize_t out_threshold = 0; // Free space section threshold to get
|
|
hbool_t out_persist = FALSE; // Persist free-space read
|
|
// File space handling strategy
|
|
H5F_fspace_strategy_t out_strategy = H5F_FSPACE_STRATEGY_FSM_AGGR;
|
|
|
|
try {
|
|
// Create a file using default properties.
|
|
H5File tempfile(FILE7, H5F_ACC_TRUNC);
|
|
|
|
// Get the file's version information.
|
|
H5F_info2_t finfo;
|
|
tempfile.getFileInfo(finfo);
|
|
verify_val(static_cast<long>(finfo.super.version), 0, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
verify_val(static_cast<long>(finfo.free.version), 0, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
verify_val(static_cast<long>(finfo.sohm.version), 0, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
|
|
// Close the file.
|
|
tempfile.close();
|
|
|
|
// Create file creation property list.
|
|
FileCreatPropList fcpl;
|
|
|
|
// Retrieve file space information.
|
|
fcpl.getFileSpaceStrategy(out_strategy, out_persist, out_threshold);
|
|
|
|
// Verify file space information.
|
|
verify_val(static_cast<long>(out_strategy), static_cast<long>(H5F_FSPACE_STRATEGY_FSM_AGGR),
|
|
"H5File::getFileInfo", __LINE__, __FILE__);
|
|
verify_val(out_persist, FALSE, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
verify_val(static_cast<long>(out_threshold), 1, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
|
|
/* Retrieve file space page size */
|
|
hsize_t out_fsp_psize = fcpl.getFileSpacePagesize();
|
|
verify_val(out_fsp_psize, FSP_SIZE_DEF, "FileCreatPropList::getFileSpacePagesize", __LINE__,
|
|
__FILE__);
|
|
|
|
// Set various file information.
|
|
fcpl.setUserblock(F2_USERBLOCK_SIZE);
|
|
fcpl.setSizes(F2_OFFSET_SIZE, F2_LENGTH_SIZE);
|
|
fcpl.setSymk(F2_SYM_INTERN_K, F2_SYM_LEAF_K);
|
|
fcpl.setIstorek(F2_ISTORE);
|
|
|
|
hsize_t threshold = 5; // Free space section threshold to set
|
|
hbool_t persist = TRUE; // Persist free-space to set
|
|
H5F_fspace_strategy_t strategy = H5F_FSPACE_STRATEGY_PAGE;
|
|
|
|
fcpl.setFileSpaceStrategy(strategy, persist, threshold);
|
|
fcpl.setFileSpacePagesize(FSP_SIZE512);
|
|
|
|
// Creating a file with the non-default file creation property list
|
|
// should create a version 1 superblock
|
|
|
|
// Create file with custom file creation property list.
|
|
H5File file7(FILE7, H5F_ACC_TRUNC, fcpl);
|
|
|
|
// Close the file creation property list.
|
|
fcpl.close();
|
|
|
|
// Get the file's version information.
|
|
file7.getFileInfo(finfo);
|
|
verify_val(static_cast<long>(finfo.super.version), 2, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
verify_val(static_cast<long>(finfo.free.version), 0, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
verify_val(static_cast<long>(finfo.sohm.version), 0, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
|
|
// Close the file.
|
|
file7.close();
|
|
|
|
// Re-open the file.
|
|
file7.openFile(FILE7, H5F_ACC_RDONLY);
|
|
|
|
// Get the file's creation property list.
|
|
FileCreatPropList fcpl2 = file7.getCreatePlist();
|
|
|
|
// Get the file's version information.
|
|
file7.getFileInfo(finfo);
|
|
verify_val(static_cast<long>(finfo.super.version), 2, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
verify_val(static_cast<long>(finfo.free.version), 0, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
verify_val(static_cast<long>(finfo.sohm.version), 0, "H5File::getFileInfo", __LINE__, __FILE__);
|
|
|
|
// Retrieve the property values & check them.
|
|
hsize_t userblock = fcpl2.getUserblock();
|
|
verify_val(userblock, F2_USERBLOCK_SIZE, "FileCreatPropList::getUserblock", __LINE__, __FILE__);
|
|
|
|
size_t off_size = 0, len_size = 0;
|
|
fcpl2.getSizes(off_size, len_size);
|
|
verify_val(off_size, F2_OFFSET_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
|
|
verify_val(len_size, F2_LENGTH_SIZE, "FileCreatPropList::getSizes", __LINE__, __FILE__);
|
|
|
|
unsigned sym_ik = 0, sym_lk = 0;
|
|
fcpl2.getSymk(sym_ik, sym_lk);
|
|
verify_val(sym_ik, F2_SYM_INTERN_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
|
|
verify_val(sym_lk, F2_SYM_LEAF_K, "FileCreatPropList::getSymk", __LINE__, __FILE__);
|
|
|
|
unsigned istore_ik = fcpl2.getIstorek();
|
|
verify_val(istore_ik, F2_ISTORE, "FileCreatPropList::getIstorek", __LINE__, __FILE__);
|
|
|
|
/* ret=H5Pget_shared_mesg_nindexes(fcpl2,&nindexes);
|
|
CHECK(ret, FAIL, "H5Pget_shared_mesg_nindexes");
|
|
VERIFY(nindexes, MISC11_NINDEXES, "H5Pget_shared_mesg_nindexes");
|
|
*/
|
|
|
|
// Get and verify the file space info from the creation property list */
|
|
fcpl2.getFileSpaceStrategy(out_strategy, out_persist, out_threshold);
|
|
verify_val(static_cast<long>(out_strategy), static_cast<long>(strategy),
|
|
"FileCreatPropList::getFileSpaceStrategy", __LINE__, __FILE__);
|
|
verify_val(out_persist, persist, "FileCreatPropList::getFileSpaceStrategy", __LINE__, __FILE__);
|
|
verify_val(out_threshold, threshold, "FileCreatPropList::getFileSpaceStrategy", __LINE__, __FILE__);
|
|
|
|
out_fsp_psize = fcpl2.getFileSpacePagesize();
|
|
verify_val(out_fsp_psize, FSP_SIZE512, "FileCreatPropList::getFileSpacePagesize", __LINE__, __FILE__);
|
|
|
|
PASSED();
|
|
} // end of try block
|
|
catch (Exception &E) {
|
|
issue_fail_msg("test_filespace_info()", __LINE__, __FILE__, E.getCDetailMsg());
|
|
}
|
|
} /* test_file_info() */
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: test_file
|
|
*
|
|
* Purpose Main file testing routine
|
|
*
|
|
* Return None
|
|
*
|
|
* Programmer Binh-Minh Ribler (use C version)
|
|
* January 2001
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
extern "C" void
|
|
test_file()
|
|
{
|
|
// Output message about test being performed
|
|
MESSAGE(5, ("Testing File I/O Operations\n"));
|
|
|
|
test_file_create(); // Test file creation (also creation templates)
|
|
test_file_open(); // Test file opening
|
|
test_file_size(); // Test file size
|
|
test_file_num(); // Test file number
|
|
test_file_name(); // Test getting file's name
|
|
test_file_attribute(); // Test file attribute feature
|
|
test_libver_bounds(); // Test format version
|
|
test_commonfg(); // Test H5File as a root group
|
|
test_file_info(); // Test various file info
|
|
} // test_file()
|
|
|
|
/*-------------------------------------------------------------------------
|
|
* Function: cleanup_file
|
|
*
|
|
* Purpose Cleanup temporary test files
|
|
*
|
|
* Return none
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
#endif
|
|
void
|
|
cleanup_file()
|
|
{
|
|
HDremove(FILE1.c_str());
|
|
HDremove(FILE2.c_str());
|
|
HDremove(FILE3.c_str());
|
|
HDremove(FILE4.c_str());
|
|
HDremove(FILE5.c_str());
|
|
HDremove(FILE6.c_str());
|
|
HDremove(FILE7.c_str());
|
|
} // cleanup_file
|