Merge branch 'develop' into hdf5_1_10_merge

This commit is contained in:
M. Scot Breitenfeld 2018-03-09 16:57:54 -06:00
commit a5d95ec083
18 changed files with 1025 additions and 173 deletions

View File

@ -143,24 +143,6 @@ install (
COMPONENT libraries
)
#-----------------------------------------------------------------------------
# Create pkgconfig files
#-----------------------------------------------------------------------------
#foreach (libs ${LINK_LIBS})
# set (LIBS "${LIBS} -l${libs}")
#endforeach ()
#foreach (libs ${HDF5_LIBRARIES_TO_EXPORT})
# set (HDF5LIBS "${HDF5LIBS} -l${libs}")
#endforeach ()
#configure_file (
# ${HDF_RESOURCES_DIR}/libhdf5.pc.in
# ${HDF5_BINARY_DIR}/CMakeFiles/libhdf5.pc @ONLY
#)
#install (
# FILES ${HDF5_BINARY_DIR}/CMakeFiles/libhdf5.pc
# DESTINATION ${HDF5_INSTALL_LIB_DIR}/pkgconfig
#)
#-----------------------------------------------------------------------------
# Configure the HDF518_Examples.cmake file and the examples
#-----------------------------------------------------------------------------

View File

@ -2441,6 +2441,7 @@
#test files for h5repack
./tools/test/h5repack/testfiles/README
./tools/test/h5repack/testfiles/bounds_latest_latest.h5
./tools/test/h5repack/testfiles/h5repack_aggr.h5
./tools/test/h5repack/testfiles/h5repack_attr.h5
./tools/test/h5repack/testfiles/h5repack_attr_refs.h5
@ -3083,6 +3084,8 @@
./config/cmake/HDF5Macros.cmake
./config/cmake/HDF5UseFortran.cmake
./config/cmake/jrunTest.cmake
./config/cmake/libh5cc.in
./config/cmake/libhdf5.pc.in
./config/cmake/libhdf5.settings.cmake.in
./config/cmake/mccacheinit.cmake
./config/cmake/patch.xml

View File

@ -139,3 +139,50 @@ if (HDF5_EXPORTED_TARGETS)
INCLUDES DESTINATION include
)
endif ()
#-----------------------------------------------------------------------------
# Create pkgconfig files
#-----------------------------------------------------------------------------
set (_PKG_CONFIG_PREFIX ${CMAKE_INSTALL_PREFIX})
set (_PKG_CONFIG_EXEC_PREFIX \${prefix})
set (_PKG_CONFIG_LIBDIR \${exec_prefix}/lib)
set (_PKG_CONFIG_INCLUDEDIR \${prefix}/include)
set (_PKG_CONFIG_LIBNAME "${HDF5_CPP_LIB_CORENAME}")
set (_PKG_CONFIG_VERSION "${HDF5_PACKAGE_VERSION}")
set (_PKG_CONFIG_LIBS_PRIVATE)
set (_PKG_CONFIG_LIBS "${_PKG_CONFIG_LIBS} -l${HDF5_CPP_LIB_CORENAME}")
if (BUILD_SHARED_LIBS)
set (_PKG_CONFIG_SH_LIBS "${_PKG_CONFIG_SH_LIBS} -l${HDF5_CPP_LIB_CORENAME}")
endif ()
set (_PKG_CONFIG_REQUIRES "${HDF5_LIB_CORENAME}")
set (_PKG_CONFIG_REQUIRES_PRIVATE "${HDF5_LIB_CORENAME}")
configure_file (
${HDF_RESOURCES_DIR}/libhdf5.pc.in
${HDF5_BINARY_DIR}/CMakeFiles/${HDF5_CPP_LIB_CORENAME}-${HDF5_PACKAGE_VERSION}.pc
@ONLY
)
install (
FILES ${HDF5_BINARY_DIR}/CMakeFiles/${HDF5_CPP_LIB_CORENAME}-${HDF5_PACKAGE_VERSION}.pc
DESTINATION ${HDF5_INSTALL_LIB_DIR}/pkgconfig
COMPONENT cpplibraries
)
if (NOT WIN32)
set (_PKG_CONFIG_COMPILER ${CMAKE_CXX_COMPILER})
configure_file (
${HDF_RESOURCES_DIR}/libh5cc.in
${HDF5_BINARY_DIR}/CMakeFiles/h5c++
@ONLY
)
install (
FILES ${HDF5_BINARY_DIR}/CMakeFiles/h5c++
DESTINATION ${HDF5_INSTALL_BIN_DIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
COMPONENT cpplibraries
)
endif ()

32
config/cmake/libh5cc.in Executable file
View File

@ -0,0 +1,32 @@
#! /bin/sh
##
# 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.
##
prg=$0
if [ ! -e "$prg" ]; then
case $prg in
(*/*) exit 1;;
(*) prg=$(command -v -- "$prg") || exit;;
esac
fi
dir=$(
cd -P -- "$(dirname -- "$prg")/.." && pwd -P
) || exit
prg=$dir/$(basename -- "$prg") || exit
printf '%s\n' "$prg"
printf 'dir is %s\n' "$dir"
export PKG_CONFIG_PATH=$dir/lib/pkgconfig
@_PKG_CONFIG_COMPILER@ `pkg-config --define-variable=prefix=$dir --cflags --libs @_PKG_CONFIG_LIBNAME@-@_PKG_CONFIG_VERSION@` $@

14
config/cmake/libhdf5.pc.in Executable file
View File

@ -0,0 +1,14 @@
prefix=@_PKG_CONFIG_PREFIX@
exec_prefix=@_PKG_CONFIG_EXEC_PREFIX@
libdir=@_PKG_CONFIG_LIBDIR@
includedir=@_PKG_CONFIG_INCLUDEDIR@
Name: @_PKG_CONFIG_LIBNAME@
Description: HDF5 (Hierarchical Data Format 5) Software Library
Version: @_PKG_CONFIG_VERSION@
Cflags: -I${includedir}
Libs: -L${libdir} @_PKG_CONFIG_SH_LIBS@
Requires: @_PKG_CONFIG_REQUIRES@
Libs.private: @_PKG_CONFIG_LIBS_PRIVATE@ @_PKG_CONFIG_LIBS@
Requires.private: @_PKG_CONFIG_REQUIRES_PRIVATE@

View File

@ -69,3 +69,50 @@ if (HDF5_EXPORTED_TARGETS)
INCLUDES DESTINATION include
)
endif ()
#-----------------------------------------------------------------------------
# Create pkgconfig files
#-----------------------------------------------------------------------------
set (_PKG_CONFIG_PREFIX ${CMAKE_INSTALL_PREFIX})
set (_PKG_CONFIG_EXEC_PREFIX \${prefix})
set (_PKG_CONFIG_LIBDIR \${exec_prefix}/lib)
set (_PKG_CONFIG_INCLUDEDIR \${prefix}/include)
set (_PKG_CONFIG_LIBNAME "${HDF5_HL_CPP_LIB_CORENAME}")
set (_PKG_CONFIG_VERSION "${HDF5_PACKAGE_VERSION}")
set (_PKG_CONFIG_LIBS_PRIVATE)
set (_PKG_CONFIG_LIBS "${_PKG_CONFIG_LIBS} -l${HDF5_HL_CPP_LIB_CORENAME}")
if (BUILD_SHARED_LIBS)
set (_PKG_CONFIG_SH_LIBS "${_PKG_CONFIG_SH_LIBS} -l${HDF5_HL_CPP_LIB_CORENAME}")
endif ()
set (_PKG_CONFIG_REQUIRES "${HDF5_HL_LIB_CORENAME}")
set (_PKG_CONFIG_REQUIRES_PRIVATE "${HDF5_HL_LIB_CORENAME}")
configure_file (
${HDF_RESOURCES_DIR}/libhdf5.pc.in
${HDF5_BINARY_DIR}/CMakeFiles/${HDF5_HL_CPP_LIB_CORENAME}-${HDF5_PACKAGE_VERSION}.pc
@ONLY
)
install (
FILES ${HDF5_BINARY_DIR}/CMakeFiles/${HDF5_HL_CPP_LIB_CORENAME}-${HDF5_PACKAGE_VERSION}.pc
DESTINATION ${HDF5_INSTALL_LIB_DIR}/pkgconfig
COMPONENT hlcpplibraries
)
if (NOT WIN32)
set (_PKG_CONFIG_COMPILER ${CMAKE_CXX_COMPILER})
configure_file (
${HDF_RESOURCES_DIR}/libh5cc.in
${HDF5_BINARY_DIR}/CMakeFiles/h5hlc++
@ONLY
)
install (
FILES ${HDF5_BINARY_DIR}/CMakeFiles/h5hlc++
DESTINATION ${HDF5_INSTALL_BIN_DIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
COMPONENT hlcpplibraries
)
endif ()

View File

@ -88,3 +88,49 @@ if (HDF5_EXPORTED_TARGETS)
INCLUDES DESTINATION include
)
endif ()
#-----------------------------------------------------------------------------
# Create pkgconfig files
#-----------------------------------------------------------------------------
set (_PKG_CONFIG_PREFIX ${CMAKE_INSTALL_PREFIX})
set (_PKG_CONFIG_EXEC_PREFIX \${prefix})
set (_PKG_CONFIG_LIBDIR \${exec_prefix}/lib)
set (_PKG_CONFIG_INCLUDEDIR \${prefix}/include)
set (_PKG_CONFIG_LIBNAME "${HDF5_HL_LIB_CORENAME}")
set (_PKG_CONFIG_VERSION "${HDF5_PACKAGE_VERSION}")
set (_PKG_CONFIG_LIBS_PRIVATE)
set (_PKG_CONFIG_LIBS "${_PKG_CONFIG_LIBS} -l${HDF5_HL_LIB_CORENAME}")
if (BUILD_SHARED_LIBS)
set (_PKG_CONFIG_SH_LIBS "${_PKG_CONFIG_SH_LIBS} -l${HDF5_HL_LIB_CORENAME}")
endif ()
set (_PKG_CONFIG_REQUIRES "${HDF5_LIB_CORENAME}")
set (_PKG_CONFIG_REQUIRES_PRIVATE "${HDF5_LIB_CORENAME}")
configure_file (
${HDF_RESOURCES_DIR}/libhdf5.pc.in
${HDF5_BINARY_DIR}/CMakeFiles/${HDF5_HL_LIB_CORENAME}-${HDF5_PACKAGE_VERSION}.pc
@ONLY
)
install (
FILES ${HDF5_BINARY_DIR}/CMakeFiles/${HDF5_HL_LIB_CORENAME}-${HDF5_PACKAGE_VERSION}.pc
DESTINATION ${HDF5_INSTALL_LIB_DIR}/pkgconfig
COMPONENT hllibraries
)
if (NOT WIN32)
set (_PKG_CONFIG_COMPILER ${CMAKE_C_COMPILER})
configure_file (
${HDF_RESOURCES_DIR}/libh5cc.in
${HDF5_BINARY_DIR}/CMakeFiles/h5chl
@ONLY
)
install (
FILES ${HDF5_BINARY_DIR}/CMakeFiles/h5chl
DESTINATION ${HDF5_INSTALL_BIN_DIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
COMPONENT hllibraries
)
endif ()

View File

@ -54,6 +54,16 @@ New Features
Configuration:
-------------
- CMake
Add pkg-config file generation
Added pkg-config file generation for the C, C++, HL, and HL C++ libraries.
In addition, builds on linux will create h5cXXX scripts that use the pkg-config
files. This is a limited implementation of a script like autotools h5cc.
(ADB - 2018/03/08, HDFFV-4359)
- CMake
Refactor use of CMAKE_BUILD_TYPE for new variable, which understands
@ -298,6 +308,12 @@ Bug Fixes since HDF5-1.10.1 release
parallel library.
(ADB - 2018/03/6, HDFFV-10414)
- Utility function can not handle lowercase Windows drive letters
Added call to toupper function for drive letter.
(ADB - 2017/12/18, HDFFV-10307)
- filter plugin handling in H5PL.c and H5Z.c
It was discovered that the dynamic loading process used by

View File

@ -991,3 +991,51 @@ if (HDF5_EXPORTED_TARGETS)
INCLUDES DESTINATION include
)
endif ()
#-----------------------------------------------------------------------------
# Create pkgconfig files
#-----------------------------------------------------------------------------
set (_PKG_CONFIG_PREFIX ${CMAKE_INSTALL_PREFIX})
set (_PKG_CONFIG_EXEC_PREFIX \${prefix})
set (_PKG_CONFIG_LIBDIR \${exec_prefix}/lib)
set (_PKG_CONFIG_INCLUDEDIR \${prefix}/include)
set (_PKG_CONFIG_LIBNAME "${HDF5_LIB_CORENAME}")
set (_PKG_CONFIG_VERSION "${HDF5_PACKAGE_VERSION}")
foreach (libs ${LINK_LIBS} ${LINK_COMP_LIBS})
set (_PKG_CONFIG_LIBS_PRIVATE "${_PKG_CONFIG_LIBS_PRIVATE} -l${libs}")
endforeach ()
set (_PKG_CONFIG_LIBS "${_PKG_CONFIG_LIBS} -l${HDF5_LIB_CORENAME}")
if (BUILD_SHARED_LIBS)
set (_PKG_CONFIG_SH_LIBS "${_PKG_CONFIG_SH_LIBS} -l${HDF5_LIB_CORENAME}")
endif ()
set (_PKG_CONFIG_REQUIRES)
set (_PKG_CONFIG_REQUIRES_PRIVATE)
configure_file (
${HDF_RESOURCES_DIR}/libhdf5.pc.in
${HDF5_BINARY_DIR}/CMakeFiles/${HDF5_LIB_CORENAME}-${HDF5_PACKAGE_VERSION}.pc
@ONLY
)
install (
FILES ${HDF5_BINARY_DIR}/CMakeFiles/${HDF5_LIB_CORENAME}-${HDF5_PACKAGE_VERSION}.pc
DESTINATION ${HDF5_INSTALL_LIB_DIR}/pkgconfig
COMPONENT libraries
)
if (NOT WIN32)
set (_PKG_CONFIG_COMPILER ${CMAKE_C_COMPILER})
configure_file (
${HDF_RESOURCES_DIR}/libh5cc.in
${HDF5_BINARY_DIR}/CMakeFiles/h5cc
@ONLY
)
install (
FILES ${HDF5_BINARY_DIR}/CMakeFiles/h5cc
DESTINATION ${HDF5_INSTALL_BIN_DIR}
PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
COMPONENT libraries
)
endif ()

View File

@ -740,12 +740,12 @@ H5F_gc_ref(const H5F_t *f)
/*-------------------------------------------------------------------------
* Function: H5F_get_fc_degree
* Function: H5F_get_fc_degree
*
* Purpose: Retrieve the 'file close degree' for the file.
* Purpose: Retrieve the 'file close degree' for the file.
*
* Return: Success: Non-negative, the 'file close degree'
* Failure: (can't happen)
* Return: Success: Non-negative, the 'file close degree'
* Failure: (can't happen)
*-------------------------------------------------------------------------
*/
H5F_close_degree_t

View File

@ -47,6 +47,8 @@ static herr_t H5O__layout_reset(void *_mesg);
static herr_t H5O__layout_free(void *_mesg);
static herr_t H5O__layout_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh,
void *_mesg);
static herr_t H5O__layout_pre_copy_file(H5F_t *file_src, const void *mesg_src,
hbool_t *deleted, const H5O_copy_t *cpy_info, void *udata);
static void *H5O__layout_copy_file(H5F_t *file_src, void *mesg_src,
H5F_t *file_dst, hbool_t *recompute_size, unsigned *mesg_flags,
H5O_copy_t *cpy_info, void *udata, hid_t dxpl_id);
@ -69,7 +71,7 @@ const H5O_msg_class_t H5O_MSG_LAYOUT[1] = {{
NULL, /* link method */
NULL, /* set share method */
NULL, /* can share method */
NULL, /* pre copy native value to file */
H5O__layout_pre_copy_file, /* pre copy native value to file */
H5O__layout_copy_file, /* copy native value to file */
NULL, /* post copy native value to file */
NULL, /* get creation index */
@ -99,7 +101,7 @@ H5FL_DEFINE(H5O_layout_t);
*/
static void *
H5O__layout_decode(H5F_t *f, hid_t H5_ATTR_UNUSED dxpl_id, H5O_t H5_ATTR_UNUSED *open_oh,
unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags,
unsigned H5_ATTR_UNUSED mesg_flags, unsigned H5_ATTR_UNUSED *ioflags,
size_t H5_ATTR_UNUSED p_size, const uint8_t *p)
{
H5O_layout_t *mesg = NULL;
@ -1055,6 +1057,42 @@ done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O__layout_delete() */
/*-------------------------------------------------------------------------
* Function: H5O__layout_pre_copy_file
*
* Purpose: Perform any necessary actions before copying message between
* files.
*
* Return: Success: Non-negative
* Failure: Negative
*
* Programmer: Vailin Choi; Dec 2017
*
*-------------------------------------------------------------------------
*/
static herr_t
H5O__layout_pre_copy_file(H5F_t H5_ATTR_UNUSED *file_src, const void *mesg_src,
hbool_t H5_ATTR_UNUSED *deleted, const H5O_copy_t *cpy_info, void H5_ATTR_UNUSED *udata)
{
const H5O_layout_t *layout_src = (const H5O_layout_t *)mesg_src; /* Source layout */
herr_t ret_value = SUCCEED; /* Return value */
FUNC_ENTER_NOAPI_NOINIT
/* check args */
HDassert(cpy_info);
HDassert(cpy_info->file_dst);
/* Check to ensure that the version of the message to be copied does not exceed
the message version allowed by the destination file's high bound */
if(layout_src->version > H5O_layout_ver_bounds[H5F_HIGH_BOUND(cpy_info->file_dst)])
HGOTO_ERROR(H5E_OHDR, H5E_BADRANGE, FAIL, "layout message version out of bounds")
done:
FUNC_LEAVE_NOAPI(ret_value)
} /* end H5O__layout_pre_copy_file() */
/*-------------------------------------------------------------------------
* Function: H5O__layout_copy_file

View File

@ -750,10 +750,10 @@ test_compact_io(hid_t fapl)
hsize_t dims[2];
int wbuf[16][8], rbuf[16][8];
char filename[FILENAME_BUF_SIZE];
H5F_libver_t low, high; /* File format bounds */
H5F_t *fp; /* Internal file pointer */
H5D_t *dsetp; /* Internal dataset pointer */
int i, j, n;
H5F_libver_t low, high; /* File format bounds */
H5F_t *fp; /* Internal file pointer */
H5D_t *dsetp; /* Internal dataset pointer */
int i, j, n; /* Indices */
herr_t ret; /* Generic return value */
TESTING("compact dataset I/O");

View File

@ -18,7 +18,7 @@
* Purpose: Tests the datatype interface (H5T)
*/
#include "h5test.h"
#include "testhdf5.h"
#include "H5srcdir.h"
#include "H5Iprivate.h" /* For checking that datatype id's don't leak */
@ -46,6 +46,16 @@
#define H5T_FRIEND /*suppress error about including H5Tpkg */
#include "H5Tpkg.h"
#endif
/* Use in version bound test */
#define H5F_FRIEND /*suppress error about including H5Fpkg */
#define H5F_TESTING
#include "H5Fpkg.h" /* File access */
/* Use in version bound test */
#define H5O_FRIEND /*suppress error about including H5Opkg */
#include "H5Opkg.h" /* Object headers */
#define SET_ALIGNMENT(TYPE,VAL) \
H5T_NATIVE_##TYPE##_ALIGN_g=MAX(H5T_NATIVE_##TYPE##_ALIGN_g, VAL)
@ -92,7 +102,15 @@ typedef enum dtype_t {
INT_SCHAR, INT_UCHAR, INT_SHORT, INT_USHORT, INT_INT, INT_UINT,
INT_LONG, INT_ULONG, INT_LLONG, INT_ULLONG, FLT_FLOAT, FLT_DOUBLE,
FLT_LDOUBLE, OTHER
} dtype_t;
} dtype_t; /* This doesn't seem to be used anywhere... -BMR */
typedef enum {
E1_RED,
E1_GREEN,
E1_BLUE,
E1_ORANGE,
E1_YELLOW
} color_t;
/* Constant for size of conversion buffer for int <-> float exception test */
#define CONVERT_SIZE 4
@ -1678,7 +1696,7 @@ test_compound_9(void)
{
typedef struct cmpd_struct {
int i1;
char* str;
const char* str;
int i2;
} cmpd_struct;
@ -2526,7 +2544,7 @@ test_compound_14(void)
typedef struct cmpd_struct_1 {
char c1;
char c2;
char* str;
const char* str;
} cmpd_struct_1;
typedef struct cmpd_struct_2 {
@ -3299,7 +3317,7 @@ test_compound_18(void)
/* Create compound datatype, but don't insert fields */
tid = H5Tcreate(H5T_COMPOUND, (size_t)8);
assert(tid > 0);
HDassert(tid > 0);
/* Attempt to create file with compound datatype that has no fields */
/* Create File */
@ -3308,7 +3326,7 @@ test_compound_18(void)
/* Create a dataspace to use */
sid = H5Screate_simple(1, &dim, NULL);
assert(sid > 0);
HDassert(sid > 0);
/* Create a dataset with the bad compound datatype */
H5E_BEGIN_TRY {
@ -3321,7 +3339,7 @@ test_compound_18(void)
/* Create a group */
gid = H5Gcreate2(file, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
assert(gid > 0);
HDassert(gid > 0);
/* Create an attribute with the bad compound datatype */
H5E_BEGIN_TRY {
@ -4672,7 +4690,7 @@ test_conv_enum_2(void)
/* Destination enum type */
dsttype = H5Tenum_create(H5T_NATIVE_INT);
assert(H5Tget_size(dsttype) > H5Tget_size(srctype));
HDassert(H5Tget_size(dsttype) > H5Tget_size(srctype));
for (i=0; i<8; i++)
H5Tenum_insert(dsttype, mname[i], &i);
@ -6682,7 +6700,7 @@ error:
} /* end test_named_indirect_reopen() */
static void create_del_obj_named_test_file(const char *filename, hid_t fapl,
hbool_t new_format)
H5F_libver_t low, H5F_libver_t high)
{
hid_t file; /* File ID */
hid_t type; /* Datatype ID */
@ -6692,93 +6710,97 @@ static void create_del_obj_named_test_file(const char *filename, hid_t fapl,
hid_t fcpl; /* File creation property list ID */
hid_t my_fapl; /* Copy of file access property list ID */
hid_t dcpl; /* Dataset creation property list ID */
unsigned use_at_least_v18;/* Whether to use old or new format */
herr_t status; /* Generic return value */
/* Make copy of FAPL */
my_fapl = H5Pcopy(fapl);
assert(my_fapl > 0);
HDassert(my_fapl > 0);
if(new_format) {
/* Use latest version of file format */
status = H5Pset_libver_bounds(my_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST);
assert(status >= 0);
} /* end if */
/* Use low/high version of file format */
status = H5Pset_libver_bounds(my_fapl, low, high);
HDassert(status >= 0);
/* Set new format flag. Note: the case high < low should be caught in the caller */
use_at_least_v18 = 0;
if (low >= H5F_LIBVER_V18)
use_at_least_v18 = 1;
/* Create a file creation property list (used for the root group's creation property list) */
fcpl = H5Pcreate(H5P_FILE_CREATE);
assert(fcpl > 0);
HDassert(fcpl > 0);
if(new_format) {
if(use_at_least_v18) {
/* Use dense link storage for all links in root group */
status = H5Pset_link_phase_change(fcpl, 0, 0);
assert(status >= 0);
HDassert(status >= 0);
} /* end if */
/* Create file with attribute that uses committed datatype */
file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, my_fapl);
assert(file > 0);
HDassert(file > 0);
/* Close FCPL */
status = H5Pclose(fcpl);
assert(status >= 0);
HDassert(status >= 0);
/* Close FAPL */
status = H5Pclose(my_fapl);
assert(status >= 0);
HDassert(status >= 0);
/* Create datatype to commit */
type = H5Tvlen_create(H5T_NATIVE_INT);
assert(type > 0);
HDassert(type > 0);
/* Commit datatype */
status = H5Tcommit2(file, DEL_OBJ_NAMED_NAMED_DTYPE, type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
assert(status >= 0);
HDassert(status >= 0);
/* Create scalar dataspace */
space = H5Screate(H5S_SCALAR);
assert(space > 0);
HDassert(space > 0);
/* Create a dataset creation property list */
dcpl = H5Pcreate(H5P_DATASET_CREATE);
assert(dcpl > 0);
HDassert(dcpl > 0);
if(new_format) {
if(use_at_least_v18) {
/* Use dense attribute storage for all attributes on dataset */
status = H5Pset_attr_phase_change(dcpl, 0, 0);
assert(status >= 0);
HDassert(status >= 0);
} /* end if */
/* Create dataset */
dset = H5Dcreate2(file, DEL_OBJ_NAMED_DATASET, type, space, H5P_DEFAULT, dcpl, H5P_DEFAULT);
assert(dset > 0);
HDassert(dset > 0);
/* Close DCPL */
status = H5Pclose(dcpl);
assert(status >= 0);
HDassert(status >= 0);
/* Close dataset */
status = H5Dclose(dset);
assert(status >= 0);
HDassert(status >= 0);
/* Create attribute */
attr = H5Acreate_by_name(file, DEL_OBJ_NAMED_DATASET, DEL_OBJ_NAMED_ATTRIBUTE, type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
assert(attr > 0);
HDassert(attr > 0);
/* Close dataspace */
status = H5Sclose(space);
assert(status >= 0);
HDassert(status >= 0);
/* Close datatype */
status = H5Tclose(type);
assert(status >= 0);
HDassert(status >= 0);
/* Close attribute */
status = H5Aclose(attr);
assert(status >= 0);
HDassert(status >= 0);
/* Close file */
status = H5Fclose(file);
assert(status >= 0);
HDassert(status >= 0);
} /* end create_del_obj_named_test_file() */
@ -6803,7 +6825,7 @@ test_delete_obj_named(hid_t fapl)
hid_t attr = -1; /* Attribute ID */
hid_t dset = -1; /* Dataset ID */
hid_t fapl2 = -1; /* File access property list ID */
unsigned new_format; /* Whether to use old or new format */
H5F_libver_t low, high; /* File format bounds */
char filename[1024], filename2[1024];
TESTING("deleting objects that use named datatypes");
@ -6813,47 +6835,54 @@ test_delete_obj_named(hid_t fapl)
h5_fixname(FILENAME[8], fapl, filename, sizeof filename);
h5_fixname(FILENAME[9], fapl2, filename2, sizeof filename2);
/* Loop over old & new format files */
for(new_format = FALSE; new_format <= TRUE; new_format++) {
/* Create test file, with attribute that uses committed datatype */
create_del_obj_named_test_file(filename, fapl, new_format);
/* Loop through all valid the combinations of low/high library format bounds,
to test delete objects that use named datatypes through different file IDs */
for(low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) {
for(high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) {
/* Test deleting dataset opened through different file ID */
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if((filea2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
/* Skip invalid low/high combination */
if ((high == H5F_LIBVER_EARLIEST) || (low > high))
continue;
if((dset = H5Dopen2(filea1, DEL_OBJ_NAMED_DATASET, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
if(H5Dclose(dset) < 0) FAIL_STACK_ERROR
/* Create test file, with attribute that uses committed datatype */
create_del_obj_named_test_file(filename, fapl, low, high);
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
/* Test deleting dataset opened through different file ID */
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if((filea2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if((fileb = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) FAIL_STACK_ERROR
if((dset = H5Dopen2(filea1, DEL_OBJ_NAMED_DATASET, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
if(H5Dclose(dset) < 0) FAIL_STACK_ERROR
if(H5Ldelete(filea2, DEL_OBJ_NAMED_DATASET, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea2) < 0) FAIL_STACK_ERROR
if(H5Fclose(fileb) < 0) FAIL_STACK_ERROR
if((fileb = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) FAIL_STACK_ERROR
if(H5Ldelete(filea2, DEL_OBJ_NAMED_DATASET, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
/* Create test file, with attribute that uses committed datatype */
create_del_obj_named_test_file(filename, fapl, new_format);
if(H5Fclose(filea2) < 0) FAIL_STACK_ERROR
if(H5Fclose(fileb) < 0) FAIL_STACK_ERROR
/* Test deleting attribute opened through different file ID */
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if((filea2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
/* Create test file, with attribute that uses committed datatype */
create_del_obj_named_test_file(filename, fapl, low, high);
if((attr = H5Aopen_by_name(filea1, DEL_OBJ_NAMED_DATASET, DEL_OBJ_NAMED_ATTRIBUTE, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
if(H5Aclose(attr) < 0) FAIL_STACK_ERROR
/* Test deleting attribute opened through different file ID */
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if((filea2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
if((attr = H5Aopen_by_name(filea1, DEL_OBJ_NAMED_DATASET, DEL_OBJ_NAMED_ATTRIBUTE, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
if(H5Aclose(attr) < 0) FAIL_STACK_ERROR
if((fileb = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
if(H5Adelete_by_name(filea2, DEL_OBJ_NAMED_DATASET, DEL_OBJ_NAMED_ATTRIBUTE, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
if((fileb = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea2) < 0) FAIL_STACK_ERROR
if(H5Fclose(fileb) < 0) FAIL_STACK_ERROR
} /* end for */
if(H5Adelete_by_name(filea2, DEL_OBJ_NAMED_DATASET, DEL_OBJ_NAMED_ATTRIBUTE, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea2) < 0) FAIL_STACK_ERROR
if(H5Fclose(fileb) < 0) FAIL_STACK_ERROR
} /* end high */
} /* end low */
if(H5Pclose(fapl2) < 0) FAIL_STACK_ERROR
@ -6898,7 +6927,7 @@ test_delete_obj_named_fileid(hid_t fapl)
hid_t attr = -1; /* Attribute ID */
hid_t dset = -1; /* Dataset ID */
hid_t fapl2 = -1; /* File access property list ID */
unsigned new_format; /* Whether to use old or new format */
H5F_libver_t low, high; /* File format bounds */
char filename[1024], filename2[1024];
TESTING("deleting objects that use named datatypes");
@ -6908,108 +6937,115 @@ test_delete_obj_named_fileid(hid_t fapl)
h5_fixname(FILENAME[8], fapl, filename, sizeof filename);
h5_fixname(FILENAME[9], fapl2, filename2, sizeof filename2);
/* Loop over old & new format files */
for(new_format = FALSE; new_format <= TRUE; new_format++) {
/* Create test file, with attribute that uses committed datatype */
create_del_obj_named_test_file(filename, fapl, new_format);
/* Loop through all the combinations of low/high library format bounds */
for(low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) {
for(high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) {
/* Test getting file ID for dataset opened through different file ID */
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
/* Skip invalid low/high combination */
if ((high == H5F_LIBVER_EARLIEST) || (low > high))
continue;
if((filea2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
/* Create test file, with attribute that uses committed datatype */
create_del_obj_named_test_file(filename, fapl, low, high);
if((dset = H5Dopen2(filea1, DEL_OBJ_NAMED_DATASET, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
/* Test getting file ID for dataset opened through different file ID */
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
/* Verify file ID from dataset matches correct file */
dset_fid = H5Iget_file_id(dset);
if(dset_fid != filea1) TEST_ERROR
H5Fclose(dset_fid);
if((filea2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
/* Verify file ID from datatype (from dataset) matches correct file */
type = H5Dget_type(dset);
type_fid = H5Iget_file_id(type);
if(type_fid != filea1) TEST_ERROR
H5Fclose(type_fid);
H5Tclose(type);
if((dset = H5Dopen2(filea1, DEL_OBJ_NAMED_DATASET, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
if(H5Dclose(dset) < 0) FAIL_STACK_ERROR
/* Verify file ID from dataset matches correct file */
dset_fid = H5Iget_file_id(dset);
if(dset_fid != filea1) TEST_ERROR
H5Fclose(dset_fid);
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
/* Verify file ID from datatype (from dataset) matches correct file */
type = H5Dget_type(dset);
type_fid = H5Iget_file_id(type);
if(type_fid != filea1) TEST_ERROR
H5Fclose(type_fid);
H5Tclose(type);
if((fileb = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) FAIL_STACK_ERROR
if(H5Dclose(dset) < 0) FAIL_STACK_ERROR
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
if((dset = H5Dopen2(filea1, DEL_OBJ_NAMED_DATASET, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
if((fileb = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) FAIL_STACK_ERROR
/* Verify file ID from dataset matches correct file */
dset_fid = H5Iget_file_id(dset);
if(dset_fid != filea1) TEST_ERROR
H5Fclose(dset_fid);
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
/* Verify file ID from datatype (from dataset) matches correct file */
type = H5Dget_type(dset);
type_fid = H5Iget_file_id(type);
if(type_fid != filea1) TEST_ERROR
H5Fclose(type_fid);
H5Tclose(type);
if((dset = H5Dopen2(filea1, DEL_OBJ_NAMED_DATASET, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
if(H5Dclose(dset) < 0) FAIL_STACK_ERROR
/* Verify file ID from dataset matches correct file */
dset_fid = H5Iget_file_id(dset);
if(dset_fid != filea1) TEST_ERROR
H5Fclose(dset_fid);
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea2) < 0) FAIL_STACK_ERROR
if(H5Fclose(fileb) < 0) FAIL_STACK_ERROR
/* Verify file ID from datatype (from dataset) matches correct file */
type = H5Dget_type(dset);
type_fid = H5Iget_file_id(type);
if(type_fid != filea1) TEST_ERROR
H5Fclose(type_fid);
H5Tclose(type);
if(H5Dclose(dset) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea2) < 0) FAIL_STACK_ERROR
if(H5Fclose(fileb) < 0) FAIL_STACK_ERROR
/* Create test file, with attribute that uses committed datatype */
create_del_obj_named_test_file(filename, fapl, new_format);
/* Create test file, with attribute that uses committed datatype */
create_del_obj_named_test_file(filename, fapl, low, high);
/* Test getting file ID for attribute opened through different file ID */
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if((filea2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
/* Test getting file ID for attribute opened through different file ID */
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if((filea2 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if((attr = H5Aopen_by_name(filea1, DEL_OBJ_NAMED_DATASET, DEL_OBJ_NAMED_ATTRIBUTE, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
if((attr = H5Aopen_by_name(filea1, DEL_OBJ_NAMED_DATASET, DEL_OBJ_NAMED_ATTRIBUTE, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
/* Verify file ID from dataset matches correct file */
attr_fid = H5Iget_file_id(attr);
if(attr_fid != filea1) TEST_ERROR
H5Fclose(attr_fid);
/* Verify file ID from dataset matches correct file */
attr_fid = H5Iget_file_id(attr);
if(attr_fid != filea1) TEST_ERROR
H5Fclose(attr_fid);
/* Verify file ID from datatype (from dataset) matches correct file */
type = H5Aget_type(attr);
type_fid = H5Iget_file_id(type);
if(type_fid != filea1) TEST_ERROR
H5Fclose(type_fid);
H5Tclose(type);
/* Verify file ID from datatype (from dataset) matches correct file */
type = H5Aget_type(attr);
type_fid = H5Iget_file_id(type);
if(type_fid != filea1) TEST_ERROR
H5Fclose(type_fid);
H5Tclose(type);
if(H5Aclose(attr) < 0) FAIL_STACK_ERROR
if(H5Aclose(attr) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
if((fileb = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) FAIL_STACK_ERROR
if((fileb = H5Fcreate(filename2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) FAIL_STACK_ERROR
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if((filea1 = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) FAIL_STACK_ERROR
if((attr = H5Aopen_by_name(filea1, DEL_OBJ_NAMED_DATASET, DEL_OBJ_NAMED_ATTRIBUTE, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
if((attr = H5Aopen_by_name(filea1, DEL_OBJ_NAMED_DATASET, DEL_OBJ_NAMED_ATTRIBUTE, H5P_DEFAULT, H5P_DEFAULT)) < 0) FAIL_STACK_ERROR
/* Verify file ID from dataset matches correct file */
attr_fid = H5Iget_file_id(attr);
if(attr_fid != filea1) TEST_ERROR
H5Fclose(attr_fid);
/* Verify file ID from dataset matches correct file */
attr_fid = H5Iget_file_id(attr);
if(attr_fid != filea1) TEST_ERROR
H5Fclose(attr_fid);
/* Verify file ID from datatype (from dataset) matches correct file */
type = H5Aget_type(attr);
type_fid = H5Iget_file_id(type);
if(type_fid != filea1) TEST_ERROR
H5Fclose(type_fid);
H5Tclose(type);
/* Verify file ID from datatype (from dataset) matches correct file */
type = H5Aget_type(attr);
type_fid = H5Iget_file_id(type);
if(type_fid != filea1) TEST_ERROR
H5Fclose(type_fid);
H5Tclose(type);
if(H5Aclose(attr) < 0) FAIL_STACK_ERROR
if(H5Aclose(attr) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea2) < 0) FAIL_STACK_ERROR
if(H5Fclose(fileb) < 0) FAIL_STACK_ERROR
} /* end for */
if(H5Fclose(filea1) < 0) FAIL_STACK_ERROR
if(H5Fclose(filea2) < 0) FAIL_STACK_ERROR
if(H5Fclose(fileb) < 0) FAIL_STACK_ERROR
} /* end high */
} /* end low */
if(H5Pclose(fapl2) < 0) FAIL_STACK_ERROR
@ -7018,12 +7054,15 @@ test_delete_obj_named_fileid(hid_t fapl)
error:
H5E_BEGIN_TRY {
H5Tclose(attr);
H5Aclose(attr);
H5Tclose(type);
H5Dclose(dset);
H5Pclose(fapl2);
H5Fclose(filea1);
H5Fclose(filea2);
H5Fclose(fileb);
H5Fclose(attr_fid);
H5Fclose(type_fid);
} H5E_END_TRY;
return 1;
} /* end test_delete_obj_named_fileid() */
@ -7388,7 +7427,369 @@ error:
return 1;
}
/*-------------------------------------------------------------------------
* Function: verify_version
*
* Purpose: Utility function to verify the datatype versions of nested
* datatype.
*
* Description:
* Verify the datatype message version
* --H5T_COMPOUND, H5T_ENUM, H5T_ARRAY:
* the library will set version according to low_bound
* --H5T_ARRAY:
* the earliest version the library will set is 2
* --H5T_INTEGER, H5T_FLOAT, H5T_TIME, H5T_STRING, H5T_BITFIELD,
* H5T_OPAQUE, H5T_REFERENCE:
* the library will only use basic version
*
*************************************************************************/
static herr_t verify_version(hid_t dtype, H5F_libver_t low, unsigned *highest_version)
{
hid_t base_dtype = -1;
hid_t mem_dtype = -1;
H5T_t *dtypep = NULL; /* Internal structure of a datatype */
H5T_class_t type_cls = H5T_NO_CLASS; /* Temporary var for datatype class */
int nmembers = 0;
unsigned i;
herr_t ret = SUCCEED; /* Generic return value */
dtypep = (H5T_t *)H5I_object(dtype);
if (dtypep == NULL) TEST_ERROR
/* Carry out the verification according to the class of the datatype.
For compound datatype, its members will be verified, recursively.
For array datatype, its element datatype will be verified, recursively.*/
type_cls = dtypep->shared->type;
switch (type_cls)
{
case H5T_ARRAY:
{
H5T_t *base_dtypep = NULL; /* Internal structure of a datatype */
if (low == H5F_LIBVER_EARLIEST)
VERIFY(dtypep->shared->version, H5O_DTYPE_VERSION_2, "H5O_dtype_ver_bounds");
else
VERIFY(dtypep->shared->version, H5O_dtype_ver_bounds[low], "H5O_dtype_ver_bounds");
/* Get the base datatype of this array type */
base_dtype = H5Tget_super(dtype);
CHECK(base_dtype, FAIL, "H5Tget_super");
/* Get the base type's internal structure for version */
base_dtypep = (H5T_t *)H5I_object(base_dtype);
if (base_dtypep == NULL) TEST_ERROR
/* Reset highest version if this datatype has higher version than
its outer type */
if (*highest_version < base_dtypep->shared->version)
*highest_version = base_dtypep->shared->version;
/* Verify the base datatype recursively */
ret = verify_version(base_dtype, low, highest_version);
/* Close the member datatype before checking for failure */
if ((H5Tclose(base_dtype)) < 0) TEST_ERROR
/* Check if verify_version fails */
if (ret < 0) TEST_ERROR
break;
}
case H5T_COMPOUND:
{
H5T_t *mem_dtypep = NULL; /* Internal structure of a datatype */
/* Get the number of members of this compound type */
if ((nmembers = H5Tget_nmembers(dtype)) < 0) TEST_ERROR
/* Go through all its member datatypes */
for (i = 0; i < (unsigned)nmembers; i++)
{
/* Get the member datatype to verify it recursively */
mem_dtype = H5Tget_member_type(dtype, i);
if (mem_dtype < 0) TEST_ERROR
/* Get the member type's internal structure for version */
mem_dtypep = (H5T_t *)H5I_object(mem_dtype);
if (mem_dtypep == NULL) TEST_ERROR
/* Reset highest version if this datatype has higher version than
its outer type */
if (*highest_version < mem_dtypep->shared->version)
*highest_version = mem_dtypep->shared->version;
/* Verify the datatype recursively */
ret = verify_version(mem_dtype, low, highest_version);
/* Close the member datatype before checking for failure */
if ((H5Tclose(mem_dtype)) < 0) TEST_ERROR
/* Check if verify_version fails */
if (ret < 0) TEST_ERROR
}
/* If this compound datatype contains a datatype of higher version, it
will be promoted to that version, thus, verify with highest version */
if (*highest_version > H5O_dtype_ver_bounds[low])
VERIFY(dtypep->shared->version, *highest_version, "verify_version");
else
VERIFY(dtypep->shared->version, H5O_dtype_ver_bounds[low], "verify_version");
break;
}
case H5T_ENUM:
VERIFY(dtypep->shared->version, H5O_dtype_ver_bounds[low], "verify_version");
break;
case H5T_VLEN:
case H5T_FLOAT:
case H5T_INTEGER:
VERIFY(dtypep->shared->version, H5O_dtype_ver_bounds[H5F_LIBVER_EARLIEST], "verify_version");
break;
case H5T_NCLASSES:
case H5T_NO_CLASS:
case H5T_TIME:
case H5T_STRING:
case H5T_BITFIELD:
case H5T_OPAQUE:
case H5T_REFERENCE:
default:
TEST_ERROR
} /* end switch */
error:
H5E_BEGIN_TRY {
H5Tclose(base_dtype);
H5Tclose(mem_dtype);
} H5E_END_TRY;
return ret;
} /* end of verify_version */
/*-------------------------------------------------------------------------
* Function: test_versionbounds
*
* Purpose: Tests version bounds.
*
* Description:
* This function creates a datatype for a dataset as followed:
* outer_arr_type
* outer_cmp_type
* inner_cmp_type
* inner_arr_type
* simple_cmp_type
* H5T_NATIVE_INT
* H5T_ARRAY of H5T_NATIVE_CHAR
* vlen_floattype
* enum_type
* It then loops through all valid combination of the library version
* bounds to verify each datatype's version.
*
* Return: Success: 0
* Failure: number of errors
*
*-------------------------------------------------------------------------
*/
#define VERFNAME "tverbounds_dtype.h5"
#define VERDSNAME "dataset 1"
#define ARRAY_RANK 1
#define ARRAY_LEN 10
static int
test_versionbounds(void)
{
typedef struct { /* Struct for the simple compound type */
int single_int;
char char_arr[ARRAY_LEN];
} simple_cmp_t;
typedef struct { /* Struct for the inner compound type */
simple_cmp_t inner_arr[ARRAY_LEN];
hvl_t vlen_float;
} inner_cmp_t;
typedef struct { /* Struct for the outer compound type */
inner_cmp_t inner_cmp;
color_t enum_color;
} outer_cmp_t;
hid_t file = -1; /* File ID */
hid_t space = -1; /* Dataspace ID */
hid_t dset = -1; /* Dataset ID */
hid_t fcpl = -1; /* File creation property list ID */
hid_t fapl = -1; /* Copy of file access property list ID */
hid_t dcpl = -1; /* Dataset creation property list ID */
hid_t dset_dtype = -1; /* Dataset's datatype */
hid_t arr_chartype = -1; /* Array of characters datatype */
hid_t vlen_floattype = -1; /* Vlen of float datatype */
hid_t enum_type = -1; /* Enumeration datatype */
hid_t outer_cmp_type = -1; /* Outer compound datatype */
hid_t inner_cmp_type = -1; /* Inner compound datatype */
hid_t simple_cmp_type = -1;/* Simple cmpd dtype, contains no other cmpd */
hid_t outer_arr_type = -1; /* Outermost array datatype */
hid_t inner_arr_type = -1; /* Inner array datatype */
H5F_t *filep = NULL; /* Pointer to internal structure of a file */
H5T_t *dtypep = NULL; /* Pointer to internal structure of a datatype */
hsize_t arr_dim[] = {ARRAY_LEN}; /* Length of the array */
H5F_libver_t low, high; /* File format bounds */
unsigned highest_version; /* Highest version in nested datatypes */
color_t enum_val; /* Enum type index */
herr_t ret = 0; /* Generic return value */
TESTING("version bounds with nested datatypes");
/* Create a file access property list */
if ((fapl = H5Pcreate(H5P_FILE_ACCESS)) < 0) TEST_ERROR
/* Create a file creation property list */
if ((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) TEST_ERROR
/* Create a scalar dataspace */
if ((space = H5Screate(H5S_SCALAR)) < 0) TEST_ERROR
/* Create a dataset creation property list */
if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
/* Create an array datatype of chars */
arr_chartype = H5Tarray_create2(H5T_NATIVE_CHAR, ARRAY_RANK, arr_dim);
if (arr_chartype < 0) TEST_ERROR
/* Create the simple compound datatype that has an integer and an
array of chars */
simple_cmp_type = H5Tcreate(H5T_COMPOUND, sizeof(simple_cmp_t));
if (simple_cmp_type < 0) TEST_ERROR
/* Insert integer field */
ret = H5Tinsert(simple_cmp_type, "single_int", HOFFSET(simple_cmp_t, single_int), H5T_NATIVE_INT);
if (ret < 0) TEST_ERROR
/* Insert array field */
ret = H5Tinsert(simple_cmp_type, "char_arr", HOFFSET(simple_cmp_t, char_arr), arr_chartype);
if (ret < 0) TEST_ERROR
/* Create an array datatype containing simple compound datatype */
inner_arr_type = H5Tarray_create2(simple_cmp_type, ARRAY_RANK, arr_dim);
if (inner_arr_type < 0) TEST_ERROR
/* Create a VL datatype of floats */
vlen_floattype = H5Tvlen_create(H5T_NATIVE_FLOAT);
if (vlen_floattype < 0) TEST_ERROR
/* Create the innermost compound datatype that houses inner_arr_type and vlen_floattype */
inner_cmp_type = H5Tcreate(H5T_COMPOUND, sizeof(inner_cmp_t));
if (inner_cmp_type < 0) TEST_ERROR
/* Insert integer field */
ret = H5Tinsert(inner_cmp_type, "inner_arr", HOFFSET(inner_cmp_t, inner_arr), inner_arr_type);
if (ret < 0) TEST_ERROR
/* Insert integer field */
ret = H5Tinsert(inner_cmp_type, "vlen_float", HOFFSET(inner_cmp_t, vlen_float), vlen_floattype);
if (ret < 0) TEST_ERROR
/* Create a enumerate datatype */
enum_type = H5Tcreate(H5T_ENUM, sizeof(color_t));
if (enum_type < 0) TEST_ERROR
enum_val = E1_RED;
ret = H5Tenum_insert(enum_type, "RED", &enum_val);
if (ret < 0) TEST_ERROR
enum_val++;
ret = H5Tenum_insert(enum_type, "GREEN", &enum_val);
if (ret < 0) TEST_ERROR
enum_val++;
ret = H5Tenum_insert(enum_type, "BLUE", &enum_val);
if (ret < 0) TEST_ERROR
enum_val++;
ret = H5Tenum_insert(enum_type, "ORANGE", &enum_val);
if (ret < 0) TEST_ERROR
enum_val++;
ret = H5Tenum_insert(enum_type, "YELLOW", &enum_val);
if (ret < 0) TEST_ERROR
/* Create the outer compound datatype that contains the inner compound datatype and the enum datatype */
outer_cmp_type = H5Tcreate(H5T_COMPOUND, sizeof(outer_cmp_t));
if (ret < 0) TEST_ERROR
/* Insert integer field */
ret = H5Tinsert(outer_cmp_type, "inner_cmp", HOFFSET(outer_cmp_t, inner_cmp), inner_cmp_type);
if (ret < 0) TEST_ERROR
/* Insert enum field */
ret = H5Tinsert(outer_cmp_type, "enum_color", HOFFSET(outer_cmp_t, enum_color), enum_type);
if (ret < 0) TEST_ERROR
/* Create an array datatype containing the outer compound datatype */
if ((outer_arr_type = H5Tarray_create2(outer_cmp_type, ARRAY_RANK, arr_dim)) < 0)
TEST_ERROR
/* Loop through all the combinations of low/high library format bounds,
skipping invalid combinations */
/* Create the file, create and write to a dataset with compound datatype */
/* Verify the dataset's datatype and its members */
for(low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) {
for(high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) {
/* Set version bounds */
H5E_BEGIN_TRY {
ret = H5Pset_libver_bounds(fapl, low, high);
} H5E_END_TRY;
if (ret < 0) /* Invalid low/high combinations */
continue;
/* Create a file */
file = H5Fcreate(VERFNAME, H5F_ACC_TRUNC, fcpl, fapl);
if (file < 0) TEST_ERROR
/* Get the internal file pointer if the create succeeds */
if ((filep = (H5F_t *)H5I_object(file)) == NULL) TEST_ERROR
/* Create dataset using the array type */
dset = H5Dcreate2(file, VERDSNAME, outer_arr_type, space, H5P_DEFAULT, dcpl, H5P_DEFAULT);
if (dset < 0) TEST_ERROR
/* Get the dataset's datatype */
if ((dset_dtype = H5Dget_type(dset)) < 0) TEST_ERROR
/* Get the version of this datatype */
dtypep = (H5T_t *)H5I_object(dset_dtype);
if (dtypep == NULL) TEST_ERROR
highest_version = dtypep->shared->version;
/* Verify version of the datatype recursevily */
ret = verify_version(dset_dtype, low, &highest_version);
/* Close the dataset's datatype */
if (H5Tclose(dset_dtype) < 0) TEST_ERROR
/* Close dataset and file */
if (H5Dclose(dset) < 0) TEST_ERROR
if (H5Fclose(file) < 0) TEST_ERROR
} /* for high */
} /* for low */
/* Close dataspace and property lists */
if (H5Sclose(space) < 0) TEST_ERROR
if (H5Pclose(fcpl) < 0) TEST_ERROR
if (H5Pclose(fapl) < 0) TEST_ERROR
PASSED();
return 0;
error:
H5E_BEGIN_TRY {
H5Dclose(dset);
H5Sclose(space);
H5Tclose(dset_dtype);
H5Pclose(dcpl);
H5Pclose(fcpl);
H5Pclose(fapl);
H5Fclose(file);
} H5E_END_TRY;
return 1;
} /* end test_versionbounds() */
/*-------------------------------------------------------------------------
@ -7411,7 +7812,7 @@ int
main(void)
{
long nerrors = 0;
hid_t fapl = -1;
hid_t fapl = -1;
/* Set the random # seed */
HDsrandom((unsigned)HDtime(NULL));
@ -7428,7 +7829,6 @@ main(void)
nerrors += test_detect();
nerrors += test_compound_1();
nerrors += test_query();
nerrors += test_transient(fapl);
nerrors += test_named(fapl);
nerrors += test_encode();
@ -7473,6 +7873,7 @@ main(void)
nerrors += test_opaque();
nerrors += test_set_order();
nerrors += test_utf_ascii_conv();
nerrors += test_versionbounds();
if(nerrors) {
printf("***** %lu FAILURE%s! *****\n",

View File

@ -14271,10 +14271,10 @@ main(void)
FALSE, "H5Ocopy(): expand soft link");
nerrors += test_copy_option(fcpl_src, fcpl_dst, src_fapl, dst_fapl,
H5O_COPY_EXPAND_EXT_LINK_FLAG,
FALSE, "H5Ocopy: expand external link");
FALSE, "H5Ocopy(): expand external link");
nerrors += test_copy_option(fcpl_src, fcpl_dst, src_fapl, dst_fapl,
H5O_COPY_EXPAND_SOFT_LINK_FLAG | H5O_COPY_EXPAND_EXT_LINK_FLAG,
FALSE, "H5Ocopy: expand soft and external links");
FALSE, "H5Ocopy(): expand soft and external links");
nerrors += test_copy_option(fcpl_src, fcpl_dst, src_fapl, dst_fapl,
H5O_COPY_SHALLOW_HIERARCHY_FLAG,
FALSE, "H5Ocopy(): shallow group copy");

View File

@ -42,9 +42,24 @@
#include "H5Opkg.h" /* Object header */
#include "H5Bprivate.h"
#include "H5Sprivate.h"
#include "H5Iprivate.h"
#include "H5Pprivate.h"
/*
* This file needs to access private information from the H5S package.
* This file also needs to access the dataspace testing code.
*/
#define H5S_FRIEND /*suppress error about including H5Spkg */
#include "H5Spkg.h" /* Dataspaces */
/*
* This file needs to access private information from the H5O package.
* This file also needs to access the dataspace testing code.
*/
#define H5O_FRIEND /*suppress error about including H5Opkg */
#define H5O_TESTING
#include "H5Opkg.h" /* Object header */
#define TESTFILE "th5s.h5"
#define DATAFILE "th5s1.h5"
#define NULLFILE "th5s2.h5"

View File

@ -53,6 +53,7 @@
# Copy all the HDF5 files from the source directory into the test directory
# --------------------------------------------------------------------
set (LIST_HDF5_TEST_FILES
${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/bounds_latest_latest.h5
${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_attr.h5
${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_attr_refs.h5
${HDF5_TOOLS_TEST_H5REPACK_SOURCE_DIR}/testfiles/h5repack_deflate.h5
@ -582,6 +583,62 @@
endif ()
endmacro ()
# VERIFY_SUPERBLOCK
macro (ADD_H5_VERIFY_SUPERBLOCK testname testfile lowbound highbound superblock)
if (NOT HDF5_ENABLE_USING_MEMCHECKER)
add_test (
NAME H5REPACK_VERIFY_SUPERBLOCK-${testname}-clear-objects
COMMAND ${CMAKE_COMMAND}
-E remove
testfiles/out-${testname}.${testfile}
testfiles/${testfile}-${testname}-v.out
testfiles/${testfile}-${testname}-v.out.err
)
if (NOT "${last_test}" STREQUAL "")
set_tests_properties (H5REPACK_VERIFY_SUPERBLOCK-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
endif ()
add_test (
NAME H5REPACK_VERIFY_SUPERBLOCK-${testname}
COMMAND $<TARGET_FILE:h5repack> -j;${lowbound};-k;${highbound} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
)
set_tests_properties (H5REPACK_VERIFY_SUPERBLOCK-${testname} PROPERTIES DEPENDS H5REPACK_VERIFY_SUPERBLOCK-${testname}-clear-objects)
add_test (
NAME H5REPACK_VERIFY_SUPERBLOCK-${testname}_DMP
COMMAND "${CMAKE_COMMAND}"
-D "TEST_PROGRAM=$<TARGET_FILE:h5dump>"
-D "TEST_ARGS:STRING=-H;-B;out-${testname}.${testfile}"
-D "TEST_FOLDER=${PROJECT_BINARY_DIR}/testfiles"
-D "TEST_OUTPUT=${testfile}-${testname}-v.out"
-D "TEST_EXPECT=${resultcode}"
-D "TEST_FILTER:STRING=SUPERBLOCK_VERSION ${superblock}"
-D "TEST_REFERENCE=SUPERBLOCK_VERSION ${superblock}"
-P "${HDF_RESOURCES_EXT_DIR}/grepTest.cmake"
)
set_tests_properties (H5REPACK_VERIFY_SUPERBLOCK-${testname}_DMP PROPERTIES DEPENDS H5REPACK_VERIFY_SUPERBLOCK-${testname})
endif ()
endmacro ()
macro (ADD_H5_VERIFY_INVALIDBOUNDS testname resultcode lowbound highbound)
add_test (
NAME ADD_H5_VERIFY_INVALIDBOUNDS-h5repack-${testname}-clear-objects
COMMAND ${CMAKE_COMMAND}
-E remove
testfiles/out-${testname}.${testfile}
)
if (NOT "${last_test}" STREQUAL "")
set_tests_properties (ADD_H5_VERIFY_INVALIDBOUNDS-h5repack-${testname}-clear-objects PROPERTIES DEPENDS ${last_test})
endif ()
add_test (
NAME ADD_H5_VERIFY_INVALIDBOUNDS-h5repack-${testname}
COMMAND $<TARGET_FILE:h5repack> -j;${lowbound};-k;${highbound} ${PROJECT_BINARY_DIR}/testfiles/${testfile} ${PROJECT_BINARY_DIR}/testfiles/out-${testname}.${testfile}
)
set_tests_properties (
ADD_H5_VERIFY_INVALIDBOUNDS-h5repack-${testname} PROPERTIES
DEPENDS ADD_H5_VERIFY_INVALIDBOUNDS-h5repack-${testname}-clear-objects
WILL_FAIL "true"
)
endmacro ()
macro (ADD_H5_TEST_META testname testfile)
# Remove any output file left over from previous test run
add_test (
@ -1370,6 +1427,18 @@
endif ()
ADD_H5_VERIFY_VDS (vds_conti ${TESTTYPE} 0 ${FILEV4} vds_dset CONTIGUOUS -l vds_dset:CONTI)
##############################################################################
### V E R S I O N B O U N D S T E S T S
##############################################################################
# -j 0 -k 2, superblock will be 0
ADD_H5_VERIFY_SUPERBLOCK (SB_IS_0 h5repack_layout.h5 0 2 0)
# -j 1 -k 2, superblock will be 2
ADD_H5_VERIFY_SUPERBLOCK (SB_IS_2 h5repack_layout.h5 1 2 2)
# -j 2 -k 2, superblock will be 3
ADD_H5_VERIFY_SUPERBLOCK (SB_IS_3 h5repack_layout.h5 2 2 3)
# -j 0 -k 1, file cannot be opened
ADD_H5_VERIFY_INVALIDBOUNDS (latest_latest_invalid bounds_latest_latest.h5 0 1)
##############################################################################
### P L U G I N T E S T S
##############################################################################

View File

@ -82,6 +82,7 @@ test -d $TESTDIR || mkdir $TESTDIR
# Comment '#' without space can be used.
# --------------------------------------------------------------------
LIST_HDF5_TEST_FILES="
$SRC_H5REPACK_TESTFILES/bounds_latest_latest.h5
$SRC_H5REPACK_TESTFILES/h5repack_attr.h5
$SRC_H5REPACK_TESTFILES/h5repack_attr_refs.h5
$SRC_H5REPACK_TESTFILES/h5repack_deflate.h5
@ -340,8 +341,8 @@ VERIFY_LAYOUT_DSET()
fi
# clean up tmp files
rm -f $outfile
rm -f $layoutfile
# rm -f $outfile
# rm -f $layoutfile
}
#------------------------------------------
@ -513,6 +514,87 @@ VERIFY_LAYOUT_ALL()
rm -f $layoutfile
}
#--------------------------------------------------------------
# Verifying superblock of a file with different version bounds
VERIFY_SUPERBLOCK()
{
lowbound=$1
highbound=$2
superblock=$3
infile=$4
layoutfile=verbounds-low$lowbound-high$highbound.$4
outfile=out-verbounds-low$lowbound-high$highbound.$infile
expectedsuperblock="SUPERBLOCK_VERSION $superblock"
shift
shift
shift
shift
TESTING $H5REPACK $@
(
cd $TESTDIR
$RUNSERIAL $H5REPACK_BIN -j $lowbound -k $highbound $infile $outfile
)
RET=$?
if [ $RET != 0 ] ; then
echo "*FAILED*"
nerrors="`expr $nerrors + 1`"
else
echo " PASSED"
DIFFTEST $infile $outfile
fi
#---------------------------------
# check the layout from a dataset
VERIFY "superblock"
(
cd $TESTDIR
$RUNSERIAL $H5DUMP_BIN -H -B $outfile > $layoutfile
)
$GREP "$expectedsuperblock" $TESTDIR/$layoutfile > /dev/null
if [ $? -eq 0 ]; then
echo " PASSED"
else
echo " FAILED"
nerrors="`expr $nerrors + 1`"
fi
# clean up tmp files
rm -f $outfile
rm -f $layoutfile
} # end of VERIFY_SUPERBLOCK
#------------------------------------------------------------------
# Verifying that a latest file cannot be opened with earlier bounds
VERIFY_INVALIDBOUNDS()
{
lowbound=$1
highbound=$2
infile=$3
outfile=out-verbounds-low$lowbound-high$highbound.$infile
#--------------------------------------
# check for failure with invalid bounds
TESTING $H5REPACK $@
(
cd $TESTDIR
$RUNSERIAL $H5REPACK_BIN -j $lowbound -k $highbound $infile $outfile
)
RET=$?
if [ $RET != 0 ] ; then
echo " PASSED"
else
echo "*FAILED*"
nerrors="`expr $nerrors + 1`"
fi
# clean up tmp files
rm -f $outfile
} # end of VERIFY_INVALIDBOUNDS
# same as TOOLTEST, but it uses the old syntax -i input_file -o output_file
#
TOOLTEST0()
@ -1365,6 +1447,18 @@ else
VERIFY_LAYOUT_VDS vds_conti 4_vds.h5 vds_dset CONTIGUOUS -l vds_dset:CONTI
fi
#########################################################
# Testing version bounds
#########################################################
# -j 0 -k 2, superblock will be 0
VERIFY_SUPERBLOCK 0 2 0 h5repack_layout.h5 -j 0 -k 2 h5repack_layout.h5
# -j 1 -k 2, superblock will be 2
VERIFY_SUPERBLOCK 1 2 2 h5repack_layout.h5 -j 1 -k 2 h5repack_layout.h5
# -j 2 -k 2, superblock will be 3
VERIFY_SUPERBLOCK 2 2 3 h5repack_layout.h5 -j 2 -k 2 h5repack_layout.h5
# -j 0 -k 1, file cannot be opened
VERIFY_INVALIDBOUNDS 0 1 bounds_latest_latest.h5
# Clean up temporary files/directories
CLEAN_TESTFILES_AND_TESTDIR

Binary file not shown.