Files
hdf5/test/version_bounds_1_10.c
2020-08-18 13:45:50 -07:00

346 lines
12 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://support.hdfgroup.org/ftp/HDF5/releases. *
* If you do not have access to either file, you may request a copy from *
* help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/***********************************************************
*
* Test program: version_bounds_1_10.c
*
* Test 1.10 compatibility with version bounds for files
* generated by gen_bounds.c in develop branch.
*
*
* The following tests are for testing datasets with references
* and selections respectively:
* --test_ref_bounds()
* --test_sel_bounds()
*
*************************************************************/
#include "h5test.h"
#include "H5srcdir.h"
/* File names used in test_ref_bounds() */
#define FILENAME_REF_E_L "bounds_ref_earliest_latest.h5"
#define FILENAME_REF_L_L "bounds_ref_latest_latest.h5"
#define FILENAME_REF_V112_V112 "bounds_ref_v112_v112.h5"
#define FILENAME_REF_V110_V110 "bounds_ref_v110_v110.h5"
#define FILENAME_REF_V18_V18 "bounds_ref_v18_v18.h5"
/* Dataset names used in test_ref_bounds() */
#define REVISED_REFS_DSET "Revised_refs_dset"
#define OLD_REF_OBJ_DSET "Old_ref_object_dset"
#define OLD_REF_REG_DSET "Old_ref_region_dset"
/* File names used in test_sel_bounds() */
#define FILENAME_SEL_E_L "bounds_sel_earliest_latest.h5"
#define FILENAME_SEL_L_L "bounds_sel_latest_latest.h5"
#define FILENAME_SEL_V112_V112 "bounds_sel_v112_v112.h5"
#define FILENAME_SEL_V110_V110 "bounds_sel_v110_v110.h5"
/* Dataset names used in test_sel_bounds() */
#define SEL_EX_REG_DSET "Sel_ex32_reg_dset"
#define SEL_EX_IRR_DSET "Sel_ex32_irr_dset"
#define SEL_EX_PT_DSET "Sel_ex32_pt_dset"
/***********************************************************************
*
* Used by test_sel_bounds() to verify:
* --the dataset "dset_name" can be opened (or not)"
* --the selection in "dset_name" can be accessed (or not)"
*
***********************************************************************/
static herr_t
test_sel_check(hid_t fid, const char *dset_name, int should_open, int should_access)
{
hid_t did = H5I_INVALID_HID;
hid_t sid = H5I_INVALID_HID;
hdset_reg_ref_t ref_rbuf[1]; /* The buffer for the reference */
/* Open and read the referenced dataset */
H5E_BEGIN_TRY {
did = H5Dopen2(fid, dset_name, H5P_DEFAULT);
} H5E_END_TRY;
if(should_open && (H5I_INVALID_HID == did))
FAIL_PUTS_ERROR("*** Should have been able to open the dataset ***");
if(!should_open && (H5I_INVALID_HID != did))
FAIL_PUTS_ERROR("*** Should NOT have been able to open the dataset ***");
if(did != H5I_INVALID_HID) {
if(H5Dread(did, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, ref_rbuf) < 0)
TEST_ERROR
/* Open access to the region reference from the dataset's dataspace */
H5E_BEGIN_TRY {
sid = H5Rget_region(did, H5R_DATASET_REGION, &ref_rbuf[0]);
} H5E_END_TRY;
if(should_access && (H5I_INVALID_HID == sid))
FAIL_PUTS_ERROR("*** Should have been able to open the dataspace ***");
if(!should_access && (H5I_INVALID_HID != sid))
FAIL_PUTS_ERROR("*** Should NOT have been able to open the dataspace ***");
if(H5Dclose(did) < 0)
TEST_ERROR
if(should_access && H5Sclose(sid) < 0)
TEST_ERROR
}
return SUCCEED;
error:
H5E_BEGIN_TRY {
H5Dclose(did);
H5Sclose(sid);
} H5E_END_TRY;
return FAIL;
} /* test_sel_check() */
/***********************************************************************
* test_sel_bounds():
* This routine will be used to read in the following test files
* generated by gen_bounds.c in develop branch:
* (1) FILENAME_SEL_E_L--"bounds_sel_earliest_latest.h5"
* (2) FILENAME_SEL_L_L--"bounds_sel_latest_latest.h5"
* (3) FILENAME_SEL_V110_V110--"bounds_sel_v110_v110.h5"
* (4) FILENAME_SEL_V112_V112--"bounds_sel_v112_v112.h5"
* See detailed description of datasets created in those files in
* gen_bounds.c in develop branch.
*
*
* This test verifies the following:
* File #1, #3:
* a) dataset SEL_EX_REG_DSET--"Sel_ex32_reg_dset"
* --if existed, succeed to open and read the dataset; also,
* succeed to access the selection
* b) dataset SEL_EX_IRR_DSET--"Sel_ex32_irr_dset"
* --if existed, succeed to open and read the dataset but fail to
* access the selection due to hyperslab selection version 3
* c) dataset SEL_EX_PT_DSET--"Sel_ex32_pt_dset"
* --if existed, succeed to open and read the dataset but fail to
* access the selection due to point selection version 2
*
* Files #2, #4:
* a) dataset SEL_EX_REG_DSET--"Sel_ex32_reg_dset"
* --if existed, succeed to open the datasets but fail to access
* the selection due to hyperslab selection version 3
* b) dataset SEL_EX_IRR_DSET--"Sel_ex32_irr_dset"
* --if existed, succeed to open the datasets but fail to access
* the selection due to hyperslab selection version 3
* c) dataset SEL_EX_PT_DSET--"Sel_ex32_pt_dset"
* --if existed, succeed to open the datasets but fail to access
* the selection due to point selection version 2
*
***********************************************************************/
static herr_t
test_sel_bounds(const char *filename)
{
hid_t fid = H5I_INVALID_HID;
const char *path;
htri_t exists;
HDprintf("Test file: %s\n", filename);
TESTING("selection version bounds");
path = H5_get_srcdir_filename(filename);
if(H5I_INVALID_HID == (fid = H5Fopen(path, H5F_ACC_RDONLY, H5P_DEFAULT)))
TEST_ERROR
if(!HDstrcmp(filename, FILENAME_SEL_E_L) ||
!HDstrcmp(filename, FILENAME_SEL_V110_V110)) {
if((exists = H5Lexists(fid, SEL_EX_REG_DSET, H5P_DEFAULT)) < 0)
TEST_ERROR
if(exists && test_sel_check(fid, SEL_EX_REG_DSET, TRUE, TRUE) < 0)
goto error;
if((exists = H5Lexists(fid, SEL_EX_IRR_DSET, H5P_DEFAULT)) < 0)
TEST_ERROR
if(exists && test_sel_check(fid, SEL_EX_IRR_DSET, TRUE, FALSE) < 0)
goto error;
if((exists = H5Lexists(fid, SEL_EX_PT_DSET, H5P_DEFAULT)) < 0)
TEST_ERROR
if(exists && test_sel_check(fid, SEL_EX_PT_DSET, TRUE, FALSE) < 0)
goto error;
}
else {
if((exists = H5Lexists(fid, SEL_EX_REG_DSET, H5P_DEFAULT)) < 0)
TEST_ERROR
if(exists && test_sel_check(fid, SEL_EX_REG_DSET, TRUE, FALSE) < 0)
goto error;
if((exists = H5Lexists(fid, SEL_EX_IRR_DSET, H5P_DEFAULT)) < 0)
TEST_ERROR
if(exists && test_sel_check(fid, SEL_EX_IRR_DSET, TRUE, FALSE) < 0)
goto error;
if((exists = H5Lexists(fid, SEL_EX_PT_DSET, H5P_DEFAULT)) < 0)
TEST_ERROR
if(test_sel_check(fid, SEL_EX_PT_DSET, TRUE, FALSE) < 0)
goto error;
}
if(H5Fclose(fid) < 0)
TEST_ERROR
PASSED();
return SUCCEED;
error:
H5E_BEGIN_TRY {
H5Fclose(fid);
} H5E_END_TRY;
return FAIL;
} /* test_sel_bounds() */
/***********************************************************************
*
* Used by test_ref_bounds() to verify:
* --the dataset "dset_name" can be opened (or not)
*
***********************************************************************/
static herr_t
test_ref_check(hid_t fid, const char *dset_name, hbool_t should_open)
{
hid_t did = H5I_INVALID_HID; /* Dataset ID */
H5E_BEGIN_TRY {
did = H5Dopen2(fid, dset_name, H5P_DEFAULT);
} H5E_END_TRY;
if(should_open && (H5I_INVALID_HID == did))
FAIL_PUTS_ERROR("*** Should have been able to open the dataset ***");
if(!should_open && (H5I_INVALID_HID != did))
FAIL_PUTS_ERROR("*** Should NOT have been able to open the dataset ***");
if(should_open && H5Dclose(did) < 0)
TEST_ERROR
return SUCCEED;
error:
return FAIL;
} /* test_ref_check() */
/***********************************************************************
* test_ref_bounds():
* This routine will be used to read in the following test files
* generated by gen_bounds.c in develop branch:
* (1) FILENAME_REF_E_L--"bounds_ref_earliest_latest.h5"
* (2) FILENAME_REF_L_L--"bounds_ref_latest_latest.h5"
* (3) FILENAME_REF_V112_V112--"bounds_ref_v112_v112.h5"
* (4) FILENAME_REF_V110_V110--"bounds_ref_v110_v110.h5"
* (5) FILENAME_REF_V18_V18--"bounds_ref_v18_v18.h5"
* See detailed description of datasets created in those files in
* gen_bounds.c in develop branch.
*
*
* This test verifies the following:
* Files #1 to #5:
* a) dataset REVISED_REFS_DSET--"Revised_refs_dset"
* --if existed, fail to open this dataset due to datatype message version 4
* b) dataset OLD_REF_OBJ_DSET--"Old_ref_object_dset"
* --if existed, succeed to open the dataset
* c) dataset OLD_REF_REG_DSET--"Old_ref_region_dset"
* --if existed, succeed to open the dataset
*
***********************************************************************/
static herr_t
test_ref_bounds(const char *filename)
{
const char *path;
hid_t fid = H5I_INVALID_HID;
htri_t exists;
HDprintf("Test file: %s\n", filename);
TESTING("reference version bounds");
path = H5_get_srcdir_filename(filename);
if(H5I_INVALID_HID == (fid = H5Fopen(path, H5F_ACC_RDONLY, H5P_DEFAULT)))
TEST_ERROR
if((exists = H5Lexists(fid, REVISED_REFS_DSET, H5P_DEFAULT)) < 0)
TEST_ERROR
if(exists && test_ref_check(fid, REVISED_REFS_DSET, FALSE) < 0)
goto error;
if((exists = H5Lexists(fid, OLD_REF_OBJ_DSET, H5P_DEFAULT)) < 0)
TEST_ERROR
if(exists && test_ref_check(fid, OLD_REF_OBJ_DSET, TRUE) < 0)
goto error;
if((exists = H5Lexists(fid, OLD_REF_REG_DSET, H5P_DEFAULT)) < 0)
TEST_ERROR
if(exists && test_ref_check(fid, OLD_REF_REG_DSET, TRUE) < 0)
goto error;
if(H5Fclose(fid) < 0)
TEST_ERROR
PASSED();
return SUCCEED;
error:
H5E_BEGIN_TRY {
H5Fclose(fid);
} H5E_END_TRY;
return FAIL;
} /* test_ref_bounds() */
/*************************************************************************
**
** Main routine to test version bounds with 1.10 library
**
*************************************************************************/
int
main(void)
{
int nerrors = 0;
h5_reset();
HDprintf("Testing reference and selection version bounds.\n");
/* Verify the reference datasets in the test files */
nerrors += test_ref_bounds(FILENAME_REF_E_L) < 0 ? 1 : 0;
nerrors += test_ref_bounds(FILENAME_REF_L_L) < 0 ? 1 : 0;
nerrors += test_ref_bounds(FILENAME_REF_V112_V112) < 0 ? 1 : 0;
nerrors += test_ref_bounds(FILENAME_REF_V110_V110) < 0 ? 1 : 0;
nerrors += test_ref_bounds(FILENAME_REF_V18_V18) < 0 ? 1 : 0;
/* Verify the selections of reference datasets in the test files */
nerrors += test_sel_bounds(FILENAME_SEL_E_L) < 0 ? 1 : 0;
nerrors += test_sel_bounds(FILENAME_SEL_L_L) < 0 ? 1 : 0;
nerrors += test_sel_bounds(FILENAME_SEL_V112_V112) < 0 ? 1 : 0;
nerrors += test_sel_bounds(FILENAME_SEL_V110_V110) < 0 ? 1 : 0;
if(nerrors) {
HDprintf("***** %d Reference and selection version bounds TEST%s FAILED! *****\n",
nerrors, nerrors > 1 ? "S" : "");
return EXIT_FAILURE;
}
HDprintf("All reference and selection version bounds tests passed.\n");
return EXIT_SUCCESS;
}