diff options
Diffstat (limited to 'test')
37 files changed, 3328 insertions, 68890 deletions
diff --git a/test/API/CMakeLists.txt b/test/API/CMakeLists.txt index e90a4c8..6f6af47 100644 --- a/test/API/CMakeLists.txt +++ b/test/API/CMakeLists.txt @@ -9,7 +9,6 @@ # help@hdfgroup.org. # - cmake_minimum_required (VERSION 3.18) project (HDF5_TEST_API C) @@ -26,16 +25,15 @@ configure_file( ) #------------------------------------------------------------------------------ -# Compile kwsys library and setup TestDriver +# Compile kwsys library and setup TestDriver if requested #------------------------------------------------------------------------------ if (HDF5_TEST_API_ENABLE_DRIVER) add_subdirectory (driver) endif () #------------------------------------------------------------------------------ -# Define for API tests +# Variables, definitions, etc. for API tests #------------------------------------------------------------------------------ - set (HDF5_API_TESTS attribute dataset @@ -54,22 +52,22 @@ if (HDF5_TEST_API_ENABLE_ASYNC) ) endif () -# Ported HDF5 tests +# Extra HDF5 tests to run. Each entry in the list +# must be a CMake target name for a test executable +# that was added elsewhere in the project set (HDF5_API_TESTS_EXTRA testhdf5 ) # List of files generated by the HDF5 API tests which -# should be cleaned up in case the test failed to remove -# them +# we should attempt to clean up in case the tests failed +# to remove them +# TODO: Run h5delete tool with appropriate env. vars for +# connectors to remove these files set (HDF5_API_TESTS_FILES + # Test file used by main tests H5_api_test.h5 - H5_api_async_test.h5 - H5_api_async_test_0.h5 - H5_api_async_test_1.h5 - H5_api_async_test_2.h5 - H5_api_async_test_3.h5 - H5_api_async_test_4.h5 + # 'file' tests test_file.h5 invalid_params_file.h5 excl_flag_file.h5 @@ -90,6 +88,7 @@ set (HDF5_API_TESTS_FILES file_size.h5 file_info.h5 double_group_open.h5 + # 'link' tests ext_link_file.h5 ext_link_file_2.h5 ext_link_file_3.h5 @@ -97,7 +96,15 @@ set (HDF5_API_TESTS_FILES ext_link_file_ping_pong_1.h5 ext_link_file_ping_pong_2.h5 ext_link_invalid_params_file.h5 + # 'object' tests object_copy_test_file.h5 + # 'async' tests + H5_api_async_test.h5 + H5_api_async_test_0.h5 + H5_api_async_test_1.h5 + H5_api_async_test_2.h5 + H5_api_async_test_3.h5 + H5_api_async_test_4.h5 ) #----------------------------------------------------------------------------- @@ -136,19 +143,20 @@ target_compile_definitions ( PRIVATE "$<$<CONFIG:Developer>:${HDF5_DEVELOPER_DEFS}>" ) -if (NOT BUILD_SHARED_LIBS) - TARGET_C_PROPERTIES (h5_api_test STATIC) +# Always prefer linking the shared HDF5 library by default +if (BUILD_SHARED_LIBS) + TARGET_C_PROPERTIES (h5_api_test SHARED) target_link_libraries ( h5_api_test PRIVATE - ${HDF5_TEST_LIB_TARGET} + ${HDF5_TEST_LIBSH_TARGET} ) else () - TARGET_C_PROPERTIES (h5_api_test SHARED) + TARGET_C_PROPERTIES (h5_api_test STATIC) target_link_libraries ( h5_api_test PRIVATE - ${HDF5_TEST_LIBSH_TARGET} + ${HDF5_TEST_LIB_TARGET} ) endif () set_target_properties ( @@ -161,109 +169,6 @@ if (HDF5_ENABLE_FORMATTERS) clang_format (HDF5_TEST_h5_api_test_FORMAT h5_api_test) endif () -if (HDF5_TEST_API_INSTALL) - install ( - TARGETS - h5_api_test - EXPORT - ${HDF5_EXPORTED_TARGETS} - DESTINATION - ${HDF5_INSTALL_BIN_DIR} - PERMISSIONS - OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE - COMPONENT - tests - ) -endif () - -#----------------------------------------------------------------------------- -# Build the ported HDF5 test executables -#----------------------------------------------------------------------------- -foreach (api_test_extra ${HDF5_API_TESTS_EXTRA}) - unset (HDF5_API_TEST_EXTRA_SRCS) - - set (HDF5_API_TEST_EXTRA_SRCS - ${HDF5_API_TEST_EXTRA_SRCS} - ${CMAKE_CURRENT_SOURCE_DIR}/${api_test_extra}.c - ) - - if (${api_test_extra} STREQUAL "testhdf5") - set (HDF5_API_TEST_EXTRA_SRCS - ${HDF5_API_TEST_EXTRA_SRCS} - ${CMAKE_CURRENT_SOURCE_DIR}/tarray.c - ${CMAKE_CURRENT_SOURCE_DIR}/tattr.c - ${CMAKE_CURRENT_SOURCE_DIR}/tchecksum.c - ${CMAKE_CURRENT_SOURCE_DIR}/tconfig.c - ${CMAKE_CURRENT_SOURCE_DIR}/tcoords.c - ${CMAKE_CURRENT_SOURCE_DIR}/tfile.c - ${CMAKE_CURRENT_SOURCE_DIR}/tgenprop.c - ${CMAKE_CURRENT_SOURCE_DIR}/th5o.c - ${CMAKE_CURRENT_SOURCE_DIR}/th5s.c - ${CMAKE_CURRENT_SOURCE_DIR}/tid.c - ${CMAKE_CURRENT_SOURCE_DIR}/titerate.c - ${CMAKE_CURRENT_SOURCE_DIR}/tmisc.c - ${CMAKE_CURRENT_SOURCE_DIR}/trefer.c - ${CMAKE_CURRENT_SOURCE_DIR}/tselect.c - ${CMAKE_CURRENT_SOURCE_DIR}/ttime.c - ${CMAKE_CURRENT_SOURCE_DIR}/tunicode.c - ${CMAKE_CURRENT_SOURCE_DIR}/tvlstr.c - ${CMAKE_CURRENT_SOURCE_DIR}/tvltypes.c - ) - endif () - - add_executable (h5_api_test_${api_test_extra} ${HDF5_API_TEST_EXTRA_SRCS}) - target_include_directories ( - h5_api_test_${api_test_extra} - PRIVATE - "${HDF5_SRC_INCLUDE_DIRS}" - "${HDF5_TEST_SRC_DIR}" - "${HDF5_TEST_API_SRC_DIR}" - "${HDF5_SRC_BINARY_DIR}" - "${HDF5_TEST_BINARY_DIR}" - ) - target_compile_options ( - h5_api_test_${api_test_extra} - PRIVATE - "${HDF5_CMAKE_C_FLAGS}" - ) - target_compile_definitions ( - h5_api_test_${api_test_extra} - PRIVATE - "$<$<CONFIG:Developer>:${HDF5_DEVELOPER_DEFS}>" - ) - if (NOT BUILD_SHARED_LIBS) - TARGET_C_PROPERTIES (h5_api_test_${api_test_extra} STATIC) - target_link_libraries (h5_api_test_${api_test_extra} PRIVATE ${HDF5_TEST_LIB_TARGET}) - else () - TARGET_C_PROPERTIES (h5_api_test_${api_test_extra} SHARED) - target_link_libraries (h5_api_test_${api_test_extra} PRIVATE ${HDF5_TEST_LIBSH_TARGET}) - endif () - set_target_properties ( - h5_api_test_${api_test_extra} - PROPERTIES - FOLDER test/API - ) - # Add Target to clang-format - if (HDF5_ENABLE_FORMATTERS) - clang_format (HDF5_TEST_h5_api_test_${api_test_extra}_FORMAT h5_api_test_${api_test_extra}) - endif () - - if (HDF5_TEST_API_INSTALL) - install ( - TARGETS - h5_api_test_${api_test_extra} - EXPORT - ${HDF5_EXPORTED_TARGETS} - DESTINATION - ${HDF5_INSTALL_BIN_DIR} - PERMISSIONS - OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE - COMPONENT - tests - ) - endif () -endforeach () - #----------------------------------------------------------------------------- # Add tests if HDF5 serial testing is enabled #----------------------------------------------------------------------------- @@ -293,6 +198,7 @@ if (HDF5_TEST_SERIAL) ) endif () + # Add main API tests to test suite set (last_api_test "") foreach (api_test ${HDF5_API_TESTS}) add_test ( @@ -309,17 +215,6 @@ if (HDF5_TEST_SERIAL) set (last_api_test "h5_api_test_${api_test}") endforeach () - foreach (hdf5_test ${HDF5_API_TESTS_EXTRA}) - add_test ( - NAME "h5_api_test_${hdf5_test}" - COMMAND $<TARGET_FILE:h5_api_test_driver> - --server ${HDF5_TEST_API_SERVER} - --client $<TARGET_FILE:h5_api_test_${hdf5_test}> - --serial - ${HDF5_TEST_API_DRIVER_EXTRA_FLAGS} - ) - endforeach () - # Hook external tests to same test suite foreach (ext_api_test ${HDF5_API_EXT_SERIAL_TESTS}) add_test ( @@ -332,93 +227,99 @@ if (HDF5_TEST_SERIAL) ) endforeach () - # Add tests for each external VOL connector that was built - foreach (external_vol_tgt ${HDF5_EXTERNAL_VOL_TARGETS}) - # Determine environment variables that need to be set for testing - set (vol_test_env "") - set (vol_plugin_paths "${CMAKE_BINARY_DIR}/${HDF5_INSTALL_BIN_DIR}") - - get_target_property (vol_test_string "${external_vol_tgt}" HDF5_VOL_NAME) - list (APPEND vol_test_env "HDF5_VOL_CONNECTOR=${vol_test_string}") - - get_target_property (vol_lib_targets "${external_vol_tgt}" HDF5_VOL_TARGETS) - foreach (lib_target ${vol_lib_targets}) - get_target_property (lib_target_output_dir "${lib_target}" LIBRARY_OUTPUT_DIRECTORY) - if (NOT "${lib_target_output_dir}" STREQUAL "lib_target_output_dir-NOTFOUND" - AND NOT "${lib_target_output_dir}" STREQUAL "" - AND NOT "${lib_target_output_dir}" STREQUAL "${CMAKE_BINARY_DIR}/${HDF5_INSTALL_BIN_DIR}") - set (vol_plugin_paths "${vol_plugin_paths}${CMAKE_SEP}${lib_target_output_dir}") - endif () - endforeach () - - list (APPEND vol_test_env "HDF5_PLUGIN_PATH=${vol_plugin_paths}") - - # Add main API tests - set (last_api_test "") - foreach (api_test ${HDF5_API_TESTS}) - add_test ( - NAME "${external_vol_tgt}-h5_api_test_${api_test}" - COMMAND $<TARGET_FILE:h5_api_test_driver> - --server ${HDF5_TEST_API_SERVER} - --client $<TARGET_FILE:h5_api_test> "${api_test}" - --serial - ${HDF5_TEST_API_DRIVER_EXTRA_FLAGS} - ) - set_tests_properties ( - "${external_vol_tgt}-h5_api_test_${api_test}" - PROPERTIES - ENVIRONMENT - "${vol_test_env}" - WORKING_DIRECTORY - "${HDF5_TEST_BINARY_DIR}/${external_vol_tgt}" - DEPENDS - "${last_api_test}" - ) - - set (last_api_test "${external_vol_tgt}-h5_api_test_${api_test}") - endforeach () - - # Add any extra HDF5 tests - foreach (hdf5_test ${HDF5_API_TESTS_EXTRA}) - add_test ( - NAME "${external_vol_tgt}-h5_api_test_${hdf5_test}" - COMMAND $<TARGET_FILE:h5_api_test_driver> - --server ${HDF5_TEST_API_SERVER} - --client $<TARGET_FILE:h5_api_test_${hdf5_test}> - --serial - ${HDF5_TEST_API_DRIVER_EXTRA_FLAGS} - ) - set_tests_properties ( - "${external_vol_tgt}-h5_api_test_${hdf5_test}" - PROPERTIES - ENVIRONMENT - "${vol_test_env}" - WORKING_DIRECTORY - "${HDF5_TEST_BINARY_DIR}/${external_vol_tgt}" - ) + if (BUILD_SHARED_LIBS) + # Add tests for each external VOL connector that was built, + # but only if executables that were linked to a shared HDF5 + # library are available, since static executables will cause + # issues when VOL connectors are loaded dynamically + foreach (external_vol_tgt ${HDF5_EXTERNAL_VOL_TARGETS}) + # Determine environment variables that need to be set for testing + set (vol_test_env "") + set (vol_plugin_paths "${CMAKE_BINARY_DIR}/${HDF5_INSTALL_BIN_DIR}") + + get_target_property (vol_test_string "${external_vol_tgt}" HDF5_VOL_NAME) + list (APPEND vol_test_env "HDF5_VOL_CONNECTOR=${vol_test_string}") + + get_target_property (vol_lib_targets "${external_vol_tgt}" HDF5_VOL_TARGETS) + foreach (lib_target ${vol_lib_targets}) + get_target_property (lib_target_output_dir "${lib_target}" LIBRARY_OUTPUT_DIRECTORY) + if (NOT "${lib_target_output_dir}" STREQUAL "lib_target_output_dir-NOTFOUND" + AND NOT "${lib_target_output_dir}" STREQUAL "" + AND NOT "${lib_target_output_dir}" STREQUAL "${CMAKE_BINARY_DIR}/${HDF5_INSTALL_BIN_DIR}") + set (vol_plugin_paths "${vol_plugin_paths}${CMAKE_SEP}${lib_target_output_dir}") + endif () + endforeach () + + list (APPEND vol_test_env "HDF5_PLUGIN_PATH=${vol_plugin_paths}") + + # Add main API tests to test suite + set (last_api_test "") + foreach (api_test ${HDF5_API_TESTS}) + add_test ( + NAME "${external_vol_tgt}-h5_api_test_${api_test}" + COMMAND $<TARGET_FILE:h5_api_test_driver> + --server ${HDF5_TEST_API_SERVER} + --client $<TARGET_FILE:h5_api_test> "${api_test}" + --serial + ${HDF5_TEST_API_DRIVER_EXTRA_FLAGS} + ) + set_tests_properties ( + "${external_vol_tgt}-h5_api_test_${api_test}" + PROPERTIES + ENVIRONMENT + "${vol_test_env}" + WORKING_DIRECTORY + "${HDF5_TEST_BINARY_DIR}/${external_vol_tgt}" + DEPENDS + "${last_api_test}" + ) + + set (last_api_test "${external_vol_tgt}-h5_api_test_${api_test}") + endforeach () + + # Add any extra HDF5 tests to test suite + foreach (hdf5_test ${HDF5_API_TESTS_EXTRA}) + add_test ( + NAME "${external_vol_tgt}-h5_api_test_${hdf5_test}" + COMMAND $<TARGET_FILE:h5_api_test_driver> + --server ${HDF5_TEST_API_SERVER} + --client $<TARGET_FILE:${hdf5_test}> + --serial + ${HDF5_TEST_API_DRIVER_EXTRA_FLAGS} + ) + set_tests_properties ( + "${external_vol_tgt}-h5_api_test_${hdf5_test}" + PROPERTIES + ENVIRONMENT + "${vol_test_env}" + WORKING_DIRECTORY + "${HDF5_TEST_BINARY_DIR}/${external_vol_tgt}" + ) + endforeach () + + # Hook external tests to same test suite + foreach (ext_api_test ${HDF5_API_EXT_SERIAL_TESTS}) + add_test ( + NAME "${external_vol_tgt}-h5_api_ext_test_${ext_api_test}" + COMMAND $<TARGET_FILE:h5_api_test_driver> + --server ${HDF5_TEST_API_SERVER} + --client $<TARGET_FILE:${ext_api_test}> + --serial + ${HDF5_TEST_API_DRIVER_EXTRA_FLAGS} + ) + set_tests_properties ( + "${external_vol_tgt}-h5_api_ext_test_${ext_api_test}" + PROPERTIES + ENVIRONMENT + "${vol_test_env}" + WORKING_DIRECTORY + "${HDF5_TEST_BINARY_DIR}/${external_vol_tgt}" + ) + endforeach () endforeach () - - # Hook external tests to same test suite - foreach (ext_api_test ${HDF5_API_EXT_SERIAL_TESTS}) - add_test ( - NAME "${external_vol_tgt}-h5_api_ext_test_${ext_api_test}" - COMMAND $<TARGET_FILE:h5_api_test_driver> - --server ${HDF5_TEST_API_SERVER} - --client $<TARGET_FILE:${ext_api_test}> - --serial - ${HDF5_TEST_API_DRIVER_EXTRA_FLAGS} - ) - set_tests_properties ( - "${external_vol_tgt}-h5_api_ext_test_${ext_api_test}" - PROPERTIES - ENVIRONMENT - "${vol_test_env}" - WORKING_DIRECTORY - "${HDF5_TEST_BINARY_DIR}/${external_vol_tgt}" - ) - endforeach () - endforeach () + endif () else () + # Add main API tests to test suite set (last_api_test "") foreach (api_test ${HDF5_API_TESTS}) add_test ( @@ -431,70 +332,117 @@ if (HDF5_TEST_SERIAL) set (last_api_test "h5_api_test_${api_test}") endforeach () - foreach (hdf5_test ${HDF5_API_TESTS_EXTRA}) + # Hook external tests to same test suite + foreach (ext_api_test ${HDF5_API_EXT_SERIAL_TESTS}) add_test ( - NAME "h5_api_test_${hdf5_test}" - COMMAND $<TARGET_FILE:h5_api_test_${hdf5_test}> + NAME "h5_api_ext_test_${ext_api_test}" + COMMAND $<TARGET_FILE:${ext_api_test}> ) endforeach () - # Add tests for each external VOL connector that was built - foreach (external_vol_tgt ${HDF5_EXTERNAL_VOL_TARGETS}) - # Determine environment variables that need to be set for testing - set (vol_test_env "") - set (vol_plugin_paths "${CMAKE_BINARY_DIR}/${HDF5_INSTALL_BIN_DIR}") - - get_target_property (vol_test_string "${external_vol_tgt}" HDF5_VOL_NAME) - list (APPEND vol_test_env "HDF5_VOL_CONNECTOR=${vol_test_string}") - - get_target_property (vol_lib_targets "${external_vol_tgt}" HDF5_VOL_TARGETS) - foreach (lib_target ${vol_lib_targets}) - get_target_property (lib_target_output_dir "${lib_target}" LIBRARY_OUTPUT_DIRECTORY) - if (NOT "${lib_target_output_dir}" STREQUAL "lib_target_output_dir-NOTFOUND" - AND NOT "${lib_target_output_dir}" STREQUAL "" - AND NOT "${lib_target_output_dir}" STREQUAL "${CMAKE_BINARY_DIR}/${HDF5_INSTALL_BIN_DIR}") - set (vol_plugin_paths "${vol_plugin_paths}${CMAKE_SEP}${lib_target_output_dir}") - endif () + if (BUILD_SHARED_LIBS) + # Add tests for each external VOL connector that was built, + # but only if executables that were linked to a shared HDF5 + # library are available, since static executables will cause + # issues when VOL connectors are loaded dynamically + foreach (external_vol_tgt ${HDF5_EXTERNAL_VOL_TARGETS}) + # Determine environment variables that need to be set for testing + set (vol_test_env "") + set (vol_plugin_paths "${CMAKE_BINARY_DIR}/${HDF5_INSTALL_BIN_DIR}") + + get_target_property (vol_test_string "${external_vol_tgt}" HDF5_VOL_NAME) + list (APPEND vol_test_env "HDF5_VOL_CONNECTOR=${vol_test_string}") + + get_target_property (vol_lib_targets "${external_vol_tgt}" HDF5_VOL_TARGETS) + foreach (lib_target ${vol_lib_targets}) + get_target_property (lib_target_output_dir "${lib_target}" LIBRARY_OUTPUT_DIRECTORY) + if (NOT "${lib_target_output_dir}" STREQUAL "lib_target_output_dir-NOTFOUND" + AND NOT "${lib_target_output_dir}" STREQUAL "" + AND NOT "${lib_target_output_dir}" STREQUAL "${CMAKE_BINARY_DIR}/${HDF5_INSTALL_BIN_DIR}") + set (vol_plugin_paths "${vol_plugin_paths}${CMAKE_SEP}${lib_target_output_dir}") + endif () + endforeach () + + list (APPEND vol_test_env "HDF5_PLUGIN_PATH=${vol_plugin_paths}") + + # Add main API tests to test suite + set (last_api_test "") + foreach (api_test ${HDF5_API_TESTS}) + add_test ( + NAME "${external_vol_tgt}-h5_api_test_${api_test}" + COMMAND $<TARGET_FILE:h5_api_test> "${api_test}" + ) + set_tests_properties ( + "${external_vol_tgt}-h5_api_test_${api_test}" + PROPERTIES + ENVIRONMENT + "${vol_test_env}" + WORKING_DIRECTORY + "${HDF5_TEST_BINARY_DIR}/${external_vol_tgt}" + DEPENDS + "${last_api_test}" + ) + + set (last_api_test "${external_vol_tgt}-h5_api_test_${api_test}") + endforeach () + + # Add any extra HDF5 tests to test suite + foreach (hdf5_test ${HDF5_API_TESTS_EXTRA}) + add_test ( + NAME "${external_vol_tgt}-h5_api_test_${hdf5_test}" + COMMAND $<TARGET_FILE:${hdf5_test}> + ) + set_tests_properties ( + "${external_vol_tgt}-h5_api_test_${hdf5_test}" + PROPERTIES + ENVIRONMENT + "${vol_test_env}" + WORKING_DIRECTORY + "${HDF5_TEST_BINARY_DIR}/${external_vol_tgt}" + ) + endforeach () endforeach () + endif() + endif () +endif () - list (APPEND vol_test_env "HDF5_PLUGIN_PATH=${vol_plugin_paths}") - - # Add main API tests - set (last_api_test "") - foreach (api_test ${HDF5_API_TESTS}) - add_test ( - NAME "${external_vol_tgt}-h5_api_test_${api_test}" - COMMAND $<TARGET_FILE:h5_api_test> "${api_test}" - ) - set_tests_properties ( - "${external_vol_tgt}-h5_api_test_${api_test}" - PROPERTIES - ENVIRONMENT - "${vol_test_env}" - WORKING_DIRECTORY - "${HDF5_TEST_BINARY_DIR}/${external_vol_tgt}" - DEPENDS - "${last_api_test}" - ) - - set (last_api_test "${external_vol_tgt}-h5_api_test_${api_test}") - endforeach () +#----------------------------------------------------------------------------- +# Install the main API test executable and any +# extra HDF5 tests if requested +#----------------------------------------------------------------------------- +if (HDF5_EXPORTED_TARGETS AND HDF5_TEST_API_INSTALL) + install ( + TARGETS + h5_api_test + EXPORT + ${HDF5_EXPORTED_TARGETS} + DESTINATION + ${HDF5_INSTALL_BIN_DIR} + PERMISSIONS + OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + COMPONENT + tests + ) - # Add any extra HDF5 tests - foreach (hdf5_test ${HDF5_API_TESTS_EXTRA}) - add_test ( - NAME "${external_vol_tgt}-h5_api_test_${hdf5_test}" - COMMAND $<TARGET_FILE:h5_api_test_${hdf5_test}> - ) - set_tests_properties ( - "${external_vol_tgt}-h5_api_test_${hdf5_test}" - PROPERTIES - ENVIRONMENT - "${vol_test_env}" - WORKING_DIRECTORY - "${HDF5_TEST_BINARY_DIR}/${external_vol_tgt}" - ) - endforeach () - endforeach () - endif () + foreach (api_test_extra ${HDF5_API_TESTS_EXTRA}) + if (TARGET ${api_test_extra}) + set_target_properties ( + ${api_test_extra} + PROPERTIES + OUTPUT_NAME "h5_api_test_${api_test_extra}" + ) + install ( + TARGETS + ${api_test_extra} + EXPORT + ${HDF5_EXPORTED_TARGETS} + DESTINATION + ${HDF5_INSTALL_BIN_DIR} + PERMISSIONS + OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE + COMPONENT + tests + ) + endif () + endforeach () endif () diff --git a/test/API/H5_api_dataset_test.c b/test/API/H5_api_dataset_test.c index 996e2cc..d36b77b 100644 --- a/test/API/H5_api_dataset_test.c +++ b/test/API/H5_api_dataset_test.c @@ -10817,8 +10817,8 @@ error: * then read correctly when the selection used in a chunked * dataset's file dataspace is a point selection. */ -#define FIXED_DIMSIZE 25 -#define FIXED_CHUNK_DIMSIZE 10 +/* #define FIXED_DIMSIZE 25 */ +/* #define FIXED_CHUNK_DIMSIZE 10 */ static int test_read_partial_chunk_point_selection(void) { @@ -10827,8 +10827,8 @@ test_read_partial_chunk_point_selection(void) return 1; } -#undef FIXED_DIMSIZE -#undef FIXED_CHUNK_DIMSIZE +/* #undef FIXED_DIMSIZE */ +/* #undef FIXED_CHUNK_DIMSIZE */ /* * A test to verify that H5Dvlen_get_buf_size returns diff --git a/test/API/tarray.c b/test/API/tarray.c deleted file mode 100644 index 7ab2114..0000000 --- a/test/API/tarray.c +++ /dev/null @@ -1,2247 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tarray - * - * Test the Array Datatype functionality - * - *************************************************************/ - -#include "testhdf5.h" -/* #include "H5srcdir.h" */ - -#define FILENAME "tarray1.h5" -#define TESTFILE "tarrold.h5" - -/* 1-D array datatype */ -#define ARRAY1_RANK 1 -#define ARRAY1_DIM1 4 - -/* 3-D array datatype */ -#define ARRAY2_RANK 3 -#define ARRAY2_DIM1 3 -#define ARRAY2_DIM2 4 -#define ARRAY2_DIM3 5 - -/* 2-D array datatype */ -#define ARRAY3_RANK 2 -#define ARRAY3_DIM1 6 -#define ARRAY3_DIM2 3 - -/* 1-D dataset with fixed dimensions */ -#define SPACE1_RANK 1 -#define SPACE1_DIM1 4 - -/* Parameters used with the test_array_bkg() test */ -#define FIELDNAME "ArrayofStructures" -#define LENGTH 5 -#define ALEN 10 -#define RANK 1 -#define NMAX 100 - -/* Struct used with test_array_bkg() test */ -typedef struct { - int nsubfields; - char *name[NMAX]; - size_t offset[NMAX]; - hid_t datatype[NMAX]; - -} CmpDTSinfo; - -/* Forward declarations for custom vlen memory manager functions */ -void *test_array_alloc_custom(size_t size, void *info); -void test_array_free_custom(void *mem, void *info); - -/*------------------------------------------------------------------------- - * Function: test_array_atomic_1d - * - * Purpose: Test basic array datatype code. - * Tests 1-D array of atomic datatypes. - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void -test_array_atomic_1d(void) -{ - int wdata[SPACE1_DIM1][ARRAY1_DIM1]; /* Information to write */ - int rdata[SPACE1_DIM1][ARRAY1_DIM1]; /* Information read in */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - hsize_t sdims1[] = {SPACE1_DIM1}; - hsize_t tdims1[] = {ARRAY1_DIM1}; - int ndims; /* Array rank for reading */ - hsize_t rdims1[H5S_MAX_RANK]; /* Array dimensions for reading */ - int i, j; /* counting variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 1-D Array of Atomic Datatypes Functionality\n")); - - /* Allocate and initialize array data to write */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY1_DIM1; j++) - wdata[i][j] = i * 10 + j; - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - tid1 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY1_RANK, tdims1); - CHECK(tid1, FAIL, "H5Tarray_create2"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get the datatype */ - tid1 = H5Dget_type(dataset); - CHECK(tid1, FAIL, "H5Dget_type"); - - /* Check the array rank */ - ndims = H5Tget_array_ndims(tid1); - VERIFY(ndims, ARRAY1_RANK, "H5Tget_array_ndims"); - - /* Get the array dimensions */ - ret = H5Tget_array_dims2(tid1, rdims1); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims; i++) - if (rdims1[i] != tdims1[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%" PRIuHSIZE - ", tdims1[%d]=%" PRIuHSIZE "\n", - i, rdims1[i], i, tdims1[i]); - continue; - } /* end if */ - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY1_DIM1; j++) - if (wdata[i][j] != rdata[i][j]) { - TestErrPrintf("Array data information doesn't match!, wdata[%d][%d]=%d, rdata[%d][%d]=%d\n", - (int)i, (int)j, (int)wdata[i][j], (int)i, (int)j, (int)rdata[i][j]); - continue; - } /* end if */ - - /* Close Datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_array_atomic_1d() */ - -/*------------------------------------------------------------------------- - * Function: test_array_funcs - * - * Purpose: Test some type functions that are and aren't supposed to - * work with array type. - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void -test_array_funcs(void) -{ - hid_t type; /* Datatype ID */ - hsize_t tdims1[] = {ARRAY1_DIM1}; - size_t size; - H5T_pad_t inpad; - H5T_norm_t norm; - H5T_cset_t cset; - H5T_str_t strpad; - herr_t ret; /* Generic return value */ - - /* Create a datatype to refer to */ - type = H5Tarray_create2(H5T_IEEE_F32BE, ARRAY1_RANK, tdims1); - CHECK(type, FAIL, "H5Tarray_create2"); - - size = H5Tget_precision(type); - CHECK(size, 0, "H5Tget_precision"); - - size = H5Tget_size(type); - CHECK(size, 0, "H5Tget_size"); - - size = H5Tget_ebias(type); - CHECK(size, 0, "H5Tget_ebias"); - - ret = H5Tset_pad(type, H5T_PAD_ZERO, H5T_PAD_ONE); - CHECK(ret, FAIL, "H5Tset_pad"); - - inpad = H5Tget_inpad(type); - CHECK(inpad, FAIL, "H5Tget_inpad"); - - norm = H5Tget_norm(type); - CHECK(norm, FAIL, "H5Tget_norm"); - - ret = H5Tset_offset(type, (size_t)16); - CHECK(ret, FAIL, "H5Tset_offset"); - - H5E_BEGIN_TRY - { - cset = H5Tget_cset(type); - } - H5E_END_TRY - VERIFY(cset, FAIL, "H5Tget_cset"); - - H5E_BEGIN_TRY - { - strpad = H5Tget_strpad(type); - } - H5E_END_TRY - VERIFY(strpad, FAIL, "H5Tget_strpad"); - - /* Close datatype */ - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); -} /* end test_array_funcs() */ - -/*------------------------------------------------------------------------- - * Function: test_array_atomic_3d - * - * Purpose: Test basic array datatype code. - * Tests 3-D array of atomic datatypes. - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void -test_array_atomic_3d(void) -{ - int wdata[SPACE1_DIM1][ARRAY2_DIM1][ARRAY2_DIM2][ARRAY2_DIM3]; /* Information to write */ - int rdata[SPACE1_DIM1][ARRAY2_DIM1][ARRAY2_DIM2][ARRAY2_DIM3]; /* Information read in */ - hid_t fid; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hsize_t sdims1[] = {SPACE1_DIM1}; - hsize_t tdims2[] = {ARRAY2_DIM1, ARRAY2_DIM2, ARRAY2_DIM3}; - int ndims; /* Array rank for reading */ - hsize_t rdims2[H5S_MAX_RANK]; /* Array dimensions for reading */ - int i, j, k, l; /* counting variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 3-D Array of Atomic Datatypes Functionality\n")); - - /* Allocate and initialize array data to write */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY2_DIM1; j++) - for (k = 0; k < ARRAY2_DIM2; k++) - for (l = 0; l < ARRAY2_DIM3; l++) - wdata[i][j][k][l] = i * 1000 + j * 100 + k * 10 + l; - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid = H5Screate_simple(SPACE1_RANK, sdims1, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - tid = H5Tarray_create2(H5T_NATIVE_INT, ARRAY2_RANK, tdims2); - CHECK(tid, FAIL, "H5Tarray_create2"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, "Dataset1", tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get the datatype */ - tid = H5Dget_type(dataset); - CHECK(tid, FAIL, "H5Dget_type"); - - /* Check the array rank */ - ndims = H5Tget_array_ndims(tid); - VERIFY(ndims, ARRAY2_RANK, "H5Tget_array_ndims"); - - /* Get the array dimensions */ - ret = H5Tget_array_dims2(tid, rdims2); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims; i++) - if (rdims2[i] != tdims2[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims2[%d]=%d, tdims2[%d]=%d\n", - (int)i, (int)rdims2[i], (int)i, (int)tdims2[i]); - continue; - } /* end if */ - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY2_DIM1; j++) - for (k = 0; k < ARRAY2_DIM2; k++) - for (l = 0; l < ARRAY2_DIM3; l++) - if (wdata[i][j][k][l] != rdata[i][j][k][l]) { - TestErrPrintf("Array data information doesn't match!, wdata[%d][%d][%d][%d]=%d, " - "rdata[%d][%d][%d][%d]=%d\n", - (int)i, (int)j, (int)k, (int)l, (int)wdata[i][j][k][l], (int)i, (int)j, - (int)k, (int)l, (int)rdata[i][j][k][l]); - continue; - } /* end if */ - - /* Close Datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_array_atomic_3d() */ - -/*------------------------------------------------------------------------- - * Function: test_array_array_atomic - * - * Purpose: Test basic array datatype code. - * Tests 1-D array 2-D arrays of atomic datatypes. - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void -test_array_array_atomic(void) -{ - int wdata[SPACE1_DIM1][ARRAY1_DIM1][ARRAY3_DIM1][ARRAY3_DIM2]; /* Information to write */ - int rdata[SPACE1_DIM1][ARRAY1_DIM1][ARRAY3_DIM1][ARRAY3_DIM2]; /* Information read in */ - hid_t fid; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid1; /* 1-D array Datatype ID */ - hid_t tid2; /* 2-D array Datatype ID */ - hsize_t sdims1[] = {SPACE1_DIM1}; - hsize_t tdims1[] = {ARRAY1_DIM1}; - hsize_t tdims2[] = {ARRAY3_DIM1, ARRAY3_DIM2}; - int ndims1; /* Array rank for reading */ - int ndims2; /* Array rank for reading */ - hsize_t rdims1[H5S_MAX_RANK]; /* Array dimensions for reading */ - hsize_t rdims2[H5S_MAX_RANK]; /* Array dimensions for reading */ - int i, j, k, l; /* counting variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 1-D Array 2-D Arrays of Atomic Datatypes Functionality\n")); - - /* Allocate and initialize array data to write */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY1_DIM1; j++) - for (k = 0; k < ARRAY3_DIM1; k++) - for (l = 0; l < ARRAY3_DIM2; l++) - wdata[i][j][k][l] = i * 1000 + j * 100 + k * 10 + l; - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid = H5Screate_simple(SPACE1_RANK, sdims1, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create a 2-D datatype to refer to */ - tid2 = H5Tarray_create2(H5T_NATIVE_INT, ARRAY3_RANK, tdims2); - CHECK(tid2, FAIL, "H5Tarray_create2"); - - /* Create a 1-D datatype to refer to */ - tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1); - CHECK(tid1, FAIL, "H5Tarray_create2"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, "Dataset1", tid1, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatypes */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get the 1-D datatype */ - tid1 = H5Dget_type(dataset); - CHECK(tid1, FAIL, "H5Dget_type"); - - /* Check the 1-D array rank */ - ndims1 = H5Tget_array_ndims(tid1); - VERIFY(ndims1, ARRAY1_RANK, "H5Tget_array_ndims"); - - /* Get the 1-D array dimensions */ - ret = H5Tget_array_dims2(tid1, rdims1); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims1; i++) - if (rdims1[i] != tdims1[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%" PRIuHSIZE - ", tdims1[%d]=%" PRIuHSIZE "\n", - i, rdims1[i], i, tdims1[i]); - continue; - } /* end if */ - - /* Get the 2-D datatype */ - tid2 = H5Tget_super(tid1); - CHECK(tid2, FAIL, "H5Tget_super"); - - /* Check the 2-D array rank */ - ndims2 = H5Tget_array_ndims(tid2); - VERIFY(ndims2, ARRAY3_RANK, "H5Tget_array_ndims"); - - /* Get the 2-D array dimensions */ - ret = H5Tget_array_dims2(tid2, rdims2); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims2; i++) - if (rdims2[i] != tdims2[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims2[%d]=%d, tdims2[%d]=%d\n", - (int)i, (int)rdims2[i], (int)i, (int)tdims2[i]); - continue; - } /* end if */ - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY1_DIM1; j++) - for (k = 0; k < ARRAY3_DIM1; k++) - for (l = 0; l < ARRAY3_DIM2; l++) - if (wdata[i][j][k][l] != rdata[i][j][k][l]) { - TestErrPrintf("Array data information doesn't match!, wdata[%d][%d][%d][%d]=%d, " - "rdata[%d][%d][%d][%d]=%d\n", - (int)i, (int)j, (int)k, (int)l, (int)wdata[i][j][k][l], (int)i, (int)j, - (int)k, (int)l, (int)rdata[i][j][k][l]); - continue; - } /* end if */ - - /* Close Datatypes */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_array_array_atomic() */ - -/*------------------------------------------------------------------------- - * Function: test_array_compound_atomic - * - * Purpose: Test basic array datatype code. - * Tests 1-D array of compound datatypes (with no array fields). - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void -test_array_compound_atomic(void) -{ - typedef struct { /* Typedef for compound datatype */ - int i; - float f; - } s1_t; - - s1_t wdata[SPACE1_DIM1][ARRAY1_DIM1]; /* Information to write */ - s1_t rdata[SPACE1_DIM1][ARRAY1_DIM1]; /* Information read in */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Array Datatype ID */ - hid_t tid2; /* Compound Datatype ID */ - hsize_t sdims1[] = {SPACE1_DIM1}; - hsize_t tdims1[] = {ARRAY1_DIM1}; - int ndims; /* Array rank for reading */ - hsize_t rdims1[H5S_MAX_RANK]; /* Array dimensions for reading */ - int nmemb; /* Number of compound members */ - char *mname; /* Name of compound field */ - size_t off; /* Offset of compound field */ - hid_t mtid; /* Datatype ID for field */ - int i, j; /* counting variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 1-D Array of Compound Atomic Datatypes Functionality\n")); - - /* Initialize array data to write */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY1_DIM1; j++) { - wdata[i][j].i = i * 10 + j; - wdata[i][j].f = (float)i * 2.5F + (float)j; - } /* end for */ - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a compound datatype to refer to */ - tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid2, FAIL, "H5Tcreate"); - - /* Insert integer field */ - ret = H5Tinsert(tid2, "i", HOFFSET(s1_t, i), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Insert float field */ - ret = H5Tinsert(tid2, "f", HOFFSET(s1_t, f), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create an array datatype to refer to */ - tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1); - CHECK(tid1, FAIL, "H5Tarray_create2"); - - /* Close compound datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get the datatype */ - tid1 = H5Dget_type(dataset); - CHECK(tid1, FAIL, "H5Dget_type"); - - /* Check the array rank */ - ndims = H5Tget_array_ndims(tid1); - VERIFY(ndims, ARRAY1_RANK, "H5Tget_array_ndims"); - - /* Get the array dimensions */ - ret = H5Tget_array_dims2(tid1, rdims1); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims; i++) - if (rdims1[i] != tdims1[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%" PRIuHSIZE - ", tdims1[%d]=%" PRIuHSIZE "\n", - i, rdims1[i], i, tdims1[i]); - continue; - } /* end if */ - - /* Get the compound datatype */ - tid2 = H5Tget_super(tid1); - CHECK(tid2, FAIL, "H5Tget_super"); - - /* Check the number of members */ - nmemb = H5Tget_nmembers(tid2); - VERIFY(nmemb, 2, "H5Tget_nmembers"); - - /* Check the 1st field's name */ - mname = H5Tget_member_name(tid2, 0); - CHECK_PTR(mname, "H5Tget_member_name"); - if (strcmp(mname, "i") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - H5free_memory(mname); - - /* Check the 1st field's offset */ - off = H5Tget_member_offset(tid2, 0); - VERIFY(off, HOFFSET(s1_t, i), "H5Tget_member_offset"); - - /* Check the 1st field's datatype */ - mtid = H5Tget_member_type(tid2, 0); - CHECK(mtid, FAIL, "H5Tget_member_type"); - if ((ret = H5Tequal(mtid, H5T_NATIVE_INT)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - ret = H5Tclose(mtid); - CHECK(mtid, FAIL, "H5Tclose"); - - /* Check the 2nd field's name */ - mname = H5Tget_member_name(tid2, 1); - CHECK_PTR(mname, "H5Tget_member_name"); - if (strcmp(mname, "f") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - H5free_memory(mname); - - /* Check the 2nd field's offset */ - off = H5Tget_member_offset(tid2, 1); - VERIFY(off, HOFFSET(s1_t, f), "H5Tget_member_offset"); - - /* Check the 2nd field's datatype */ - mtid = H5Tget_member_type(tid2, 1); - CHECK(mtid, FAIL, "H5Tget_member_type"); - if ((ret = H5Tequal(mtid, H5T_NATIVE_FLOAT)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - ret = H5Tclose(mtid); - CHECK(mtid, FAIL, "H5Tclose"); - - /* Close Compound Datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY1_DIM1; j++) { - if (wdata[i][j].i != rdata[i][j].i) { - TestErrPrintf( - "Array data information doesn't match!, wdata[%d][%d].i=%d, rdata[%d][%d].i=%d\n", (int)i, - (int)j, (int)wdata[i][j].i, (int)i, (int)j, (int)rdata[i][j].i); - continue; - } /* end if */ - if (!H5_FLT_ABS_EQUAL(wdata[i][j].f, rdata[i][j].f)) { - TestErrPrintf( - "Array data information doesn't match!, wdata[%d][%d].f=%f, rdata[%d][%d].f=%f\n", (int)i, - (int)j, (double)wdata[i][j].f, (int)i, (int)j, (double)rdata[i][j].f); - continue; - } /* end if */ - } /* end for */ - - /* Close Datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_array_compound_atomic() */ - -/*------------------------------------------------------------------------- - * Function: test_array_compound_array - * - * Purpose: Test basic array datatype code. - * Tests 1-D array of compound datatypes (with array fields). - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void -test_array_compound_array(void) -{ - typedef struct { /* Typedef for compound datatype */ - int i; - float f[ARRAY1_DIM1]; - } s1_t; - - s1_t wdata[SPACE1_DIM1][ARRAY1_DIM1]; /* Information to write */ - s1_t rdata[SPACE1_DIM1][ARRAY1_DIM1]; /* Information read in */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Array Datatype ID */ - hid_t tid2; /* Compound Datatype ID */ - hid_t tid3; /* Nested Array Datatype ID */ - hsize_t sdims1[] = {SPACE1_DIM1}; - hsize_t tdims1[] = {ARRAY1_DIM1}; - int ndims; /* Array rank for reading */ - hsize_t rdims1[H5S_MAX_RANK]; /* Array dimensions for reading */ - int nmemb; /* Number of compound members */ - char *mname; /* Name of compound field */ - size_t off; /* Offset of compound field */ - hid_t mtid; /* Datatype ID for field */ - H5T_class_t mclass; /* Datatype class for field */ - int i, j, k; /* counting variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 1-D Array of Compound Array Datatypes Functionality\n")); - - /* Initialize array data to write */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY1_DIM1; j++) { - wdata[i][j].i = i * 10 + j; - for (k = 0; k < ARRAY1_DIM1; k++) - wdata[i][j].f[k] = (float)i * 10.0F + (float)j * 2.5F + (float)k; - } /* end for */ - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a compound datatype to refer to */ - tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid2, FAIL, "H5Tcreate"); - - /* Insert integer field */ - ret = H5Tinsert(tid2, "i", HOFFSET(s1_t, i), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create an array of floats datatype */ - tid3 = H5Tarray_create2(H5T_NATIVE_FLOAT, ARRAY1_RANK, tdims1); - CHECK(tid3, FAIL, "H5Tarray_create2"); - - /* Insert float array field */ - ret = H5Tinsert(tid2, "f", HOFFSET(s1_t, f), tid3); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Close array of floats field datatype */ - ret = H5Tclose(tid3); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create an array datatype to refer to */ - tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1); - CHECK(tid1, FAIL, "H5Tarray_create2"); - - /* Close compound datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get the datatype */ - tid1 = H5Dget_type(dataset); - CHECK(tid1, FAIL, "H5Dget_type"); - - /* Check the array rank */ - ndims = H5Tget_array_ndims(tid1); - VERIFY(ndims, ARRAY1_RANK, "H5Tget_array_ndims"); - - /* Get the array dimensions */ - ret = H5Tget_array_dims2(tid1, rdims1); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims; i++) - if (rdims1[i] != tdims1[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%" PRIuHSIZE - ", tdims1[%d]=%" PRIuHSIZE "\n", - i, rdims1[i], i, tdims1[i]); - continue; - } /* end if */ - - /* Get the compound datatype */ - tid2 = H5Tget_super(tid1); - CHECK(tid2, FAIL, "H5Tget_super"); - - /* Check the number of members */ - nmemb = H5Tget_nmembers(tid2); - VERIFY(nmemb, 2, "H5Tget_nmembers"); - - /* Check the 1st field's name */ - mname = H5Tget_member_name(tid2, 0); - CHECK_PTR(mname, "H5Tget_member_name"); - if (strcmp(mname, "i") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - H5free_memory(mname); - - /* Check the 1st field's offset */ - off = H5Tget_member_offset(tid2, 0); - VERIFY(off, HOFFSET(s1_t, i), "H5Tget_member_offset"); - - /* Check the 1st field's datatype */ - mtid = H5Tget_member_type(tid2, 0); - CHECK(mtid, FAIL, "H5Tget_member_type"); - if ((ret = H5Tequal(mtid, H5T_NATIVE_INT)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - ret = H5Tclose(mtid); - CHECK(mtid, FAIL, "H5Tclose"); - - /* Check the 2nd field's name */ - mname = H5Tget_member_name(tid2, 1); - CHECK_PTR(mname, "H5Tget_member_name"); - if (strcmp(mname, "f") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - H5free_memory(mname); - - /* Check the 2nd field's offset */ - off = H5Tget_member_offset(tid2, 1); - VERIFY(off, HOFFSET(s1_t, f), "H5Tget_member_offset"); - - /* Check the 2nd field's datatype */ - mtid = H5Tget_member_type(tid2, 1); - CHECK(mtid, FAIL, "H5Tget_member_type"); - - /* Get the 2nd field's class */ - mclass = H5Tget_class(mtid); - VERIFY(mclass, H5T_ARRAY, "H5Tget_class"); - - /* Check the array rank */ - ndims = H5Tget_array_ndims(mtid); - VERIFY(ndims, ARRAY1_RANK, "H5Tget_array_ndims"); - - /* Get the array dimensions */ - ret = H5Tget_array_dims2(mtid, rdims1); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims; i++) - if (rdims1[i] != tdims1[i]) { - TestErrPrintf("Nested array dimension information doesn't match!, rdims1[%d]=%" PRIuHSIZE - ", tdims1[%d]=%" PRIuHSIZE "\n", - i, rdims1[i], i, tdims1[i]); - continue; - } /* end if */ - - /* Check the nested array's datatype */ - tid3 = H5Tget_super(mtid); - CHECK(tid3, FAIL, "H5Tget_super"); - - if ((ret = H5Tequal(tid3, H5T_NATIVE_FLOAT)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - - /* Close the array's base type datatype */ - ret = H5Tclose(tid3); - CHECK(mtid, FAIL, "H5Tclose"); - - /* Close the member datatype */ - ret = H5Tclose(mtid); - CHECK(mtid, FAIL, "H5Tclose"); - - /* Close Compound Datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - for (j = 0; j < ARRAY1_DIM1; j++) { - if (wdata[i][j].i != rdata[i][j].i) { - TestErrPrintf( - "Array data information doesn't match!, wdata[%d][%d].i=%d, rdata[%d][%d].i=%d\n", (int)i, - (int)j, (int)wdata[i][j].i, (int)i, (int)j, (int)rdata[i][j].i); - continue; - } /* end if */ - for (k = 0; k < ARRAY1_DIM1; k++) - if (!H5_FLT_ABS_EQUAL(wdata[i][j].f[k], rdata[i][j].f[k])) { - TestErrPrintf("Array data information doesn't match!, wdata[%d][%d].f[%d]=%f, " - "rdata[%d][%d].f[%d]=%f\n", - (int)i, (int)j, (int)k, (double)wdata[i][j].f[k], (int)i, (int)j, (int)k, - (double)rdata[i][j].f[k]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Close Datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_array_compound_array() */ - -/**************************************************************** -** -** test_array_alloc_custom(): Test VL datatype custom memory -** allocation routines. This routine just uses malloc to -** allocate the memory and increments the amount of memory -** allocated. -** -****************************************************************/ - -/*------------------------------------------------------------------------- - * Function: test_array_alloc_custom - * - * Purpose: Memory allocator for testing VL datatype custom memory - * allocation routines. - * - * This routine just uses malloc to allocate the memory and - * increments the amount of memory allocated. - * - * Return: - * - * Success: A memory buffer - * Failure: NULL - * - *------------------------------------------------------------------------- - */ -void * -test_array_alloc_custom(size_t size, void *info) -{ - void *ret_value = NULL; /* Pointer to return */ - size_t *mem_used = (size_t *)info; /* Pointer to the memory used */ - size_t extra; /* Extra space needed */ - - /* - * This weird contortion is required on the DEC Alpha to keep the - * alignment correct - QAK - */ - extra = MAX(sizeof(void *), sizeof(size_t)); - - if ((ret_value = malloc(extra + size)) != NULL) { - *(size_t *)ret_value = size; - *mem_used += size; - } /* end if */ - - ret_value = ((unsigned char *)ret_value) + extra; - return ret_value; -} /* end test_array_alloc_custom() */ - -/*------------------------------------------------------------------------- - * Function: test_array_free_custom - * - * Purpose: Memory free function for testing VL datatype custom memory - * allocation routines. - * - * This routine just uses free to free the memory and - * decrements the amount of memory allocated. - * - * Return: void - * - *------------------------------------------------------------------------- - */ -void -test_array_free_custom(void *_mem, void *info) -{ - unsigned char *mem = NULL; /* Pointer to mem to be freed */ - size_t *mem_used = (size_t *)info; /* Pointer to the memory used */ - size_t extra; /* Extra space needed */ - - /* - * This weird contortion is required on the DEC Alpha to keep the - * alignment correct - QAK - */ - extra = MAX(sizeof(void *), sizeof(size_t)); - - if (_mem != NULL) { - mem = ((unsigned char *)_mem) - extra; - *mem_used -= *(size_t *)((void *)mem); - free(mem); - } /* end if */ - -} /* end test_array_free_custom() */ - -/*------------------------------------------------------------------------- - * Function: test_array_vlen_atomic - * - * Purpose: Test basic array datatype code. - * Tests 1-D array of atomic VL datatypes. - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void -test_array_vlen_atomic(void) -{ - hvl_t wdata[SPACE1_DIM1][ARRAY1_DIM1]; /* Information to write */ - hvl_t rdata[SPACE1_DIM1][ARRAY1_DIM1]; /* Information read in */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Array Datatype ID */ - hid_t tid2; /* VL Datatype ID */ - hid_t tid3; /* Atomic Datatype ID */ - hsize_t sdims1[] = {SPACE1_DIM1}; - hsize_t tdims1[] = {ARRAY1_DIM1}; - int ndims; /* Array rank for reading */ - hsize_t rdims1[H5S_MAX_RANK]; /* Array dimensions for reading */ - H5T_class_t mclass; /* Datatype class for VL */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t size; /* Number of bytes which will be used */ - size_t mem_used = 0; /* Memory used during allocation */ - int i, j, k; /* counting variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 1-D Array of Atomic Variable-Length Datatypes Functionality\n")); - - /* Initialize array data to write */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY1_DIM1; j++) { - wdata[i][j].p = malloc((size_t)(i + j + 1) * sizeof(unsigned int)); - wdata[i][j].len = (size_t)(i + j + 1); - for (k = 0; k < (i + j + 1); k++) - ((unsigned int *)wdata[i][j].p)[k] = (unsigned int)(i * 100 + j * 10 + k); - } /* end for */ - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a compound datatype to refer to */ - tid2 = H5Tvlen_create(H5T_NATIVE_UINT); - CHECK(tid2, FAIL, "H5Tcreate"); - - /* Create an array datatype to refer to */ - tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1); - CHECK(tid1, FAIL, "H5Tarray_create2"); - - /* Close VL datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get the dataspace */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Get the datatype */ - tid1 = H5Dget_type(dataset); - CHECK(tid1, FAIL, "H5Dget_type"); - - /* Check the array rank */ - ndims = H5Tget_array_ndims(tid1); - VERIFY(ndims, ARRAY1_RANK, "H5Tget_array_ndims"); - - /* Get the array dimensions */ - ret = H5Tget_array_dims2(tid1, rdims1); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims; i++) - if (rdims1[i] != tdims1[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%" PRIuHSIZE - ", tdims1[%d]=%" PRIuHSIZE "\n", - i, rdims1[i], i, tdims1[i]); - continue; - } /* end if */ - - /* Get the VL datatype */ - tid2 = H5Tget_super(tid1); - CHECK(tid2, FAIL, "H5Tget_super"); - - /* Get the 2nd field's class */ - mclass = H5Tget_class(tid2); - VERIFY(mclass, H5T_VLEN, "H5Tget_class"); - - /* Check the VL datatype's base type */ - tid3 = H5Tget_super(tid2); - CHECK(tid3, FAIL, "H5Tget_super"); - - if ((ret = H5Tequal(tid3, H5T_NATIVE_UINT)) <= 0) - TestErrPrintf("VL base datatype is incorrect!, ret=%d\n", (int)ret); - - /* Close the array's base type datatype */ - ret = H5Tclose(tid3); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close VL Datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_array_alloc_custom, &mem_used, test_array_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dataset, tid1, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* # elements allocated = (1 + 2 + 3 + 4) + (2 + 3 + 4 + 5) + - * (3 + 4 + 5 + 6) + (4 + 5 + 6 + 7) = 64 elements - */ - VERIFY(size, 64 * sizeof(unsigned int), "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* # elements allocated = (1 + 2 + 3 + 4) + (2 + 3 + 4 + 5) + - * (3 + 4 + 5 + 6) + (4 + 5 + 6 + 7) = 64 elements - */ - VERIFY(mem_used, 64 * sizeof(unsigned int), "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - for (j = 0; j < ARRAY1_DIM1; j++) { - if (wdata[i][j].len != rdata[i][j].len) { - TestErrPrintf("VL data length don't match!, wdata[%d][%d].len=%d, rdata[%d][%d].len=%d\n", - (int)i, (int)j, (int)wdata[i][j].len, (int)i, (int)j, (int)rdata[i][j].len); - continue; - } /* end if */ - for (k = 0; k < (int)rdata[i][j].len; k++) { - if (((unsigned int *)wdata[i][j].p)[k] != ((unsigned int *)rdata[i][j].p)[k]) { - TestErrPrintf( - "VL data values don't match!, wdata[%d][%d].p[%d]=%d, rdata[%d][%d].p[%d]=%d\n", - (int)i, (int)j, (int)k, (int)((unsigned int *)wdata[i][j].p)[k], (int)i, (int)j, - (int)k, (int)((unsigned int *)rdata[i][j].p)[k]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - } /* end for */ - - /* Reclaim the read VL data */ - ret = H5Treclaim(tid1, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid1, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close Datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_array_vlen_atomic() */ - -/*------------------------------------------------------------------------- - * Function: test_array_vlen_array - * - * Purpose: Test basic array datatype code. - * Tests 1-D array of 1-D array VL datatypes. - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void -test_array_vlen_array(void) -{ - hvl_t wdata[SPACE1_DIM1][ARRAY1_DIM1]; /* Information to write */ - hvl_t rdata[SPACE1_DIM1][ARRAY1_DIM1]; /* Information read in */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Array Datatype ID */ - hid_t tid2; /* VL Datatype ID */ - hid_t tid3; /* Nested Array Datatype ID */ - hid_t tid4; /* Atomic Datatype ID */ - hsize_t sdims1[] = {SPACE1_DIM1}; - hsize_t tdims1[] = {ARRAY1_DIM1}; - int ndims; /* Array rank for reading */ - hsize_t rdims1[H5S_MAX_RANK]; /* Array dimensions for reading */ - H5T_class_t mclass; /* Datatype class for VL */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t size; /* Number of bytes which will be used */ - size_t mem_used = 0; /* Memory used during allocation */ - int i, j, k, l; /* Index variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 1-D Array of 1-D Array Variable-Length Datatypes Functionality\n")); - - /* Initialize array data to write */ - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < ARRAY1_DIM1; j++) { - wdata[i][j].p = malloc((size_t)(i + j + 1) * sizeof(unsigned int) * (size_t)ARRAY1_DIM1); - wdata[i][j].len = (size_t)(i + j + 1); - for (k = 0; k < (i + j + 1); k++) - for (l = 0; l < ARRAY1_DIM1; l++) - ((unsigned int *)wdata[i][j].p)[k * ARRAY1_DIM1 + l] = - (unsigned int)(i * 1000 + j * 100 + k * 10 + l); - } - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, sdims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create the nested array datatype to refer to */ - tid3 = H5Tarray_create2(H5T_NATIVE_UINT, ARRAY1_RANK, tdims1); - CHECK(tid3, FAIL, "H5Tarray_create2"); - - /* Create a VL datatype of 1-D arrays to refer to */ - tid2 = H5Tvlen_create(tid3); - CHECK(tid2, FAIL, "H5Tcreate"); - - /* Close nested array datatype */ - ret = H5Tclose(tid3); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create an array datatype to refer to */ - tid1 = H5Tarray_create2(tid2, ARRAY1_RANK, tdims1); - CHECK(tid1, FAIL, "H5Tarray_create2"); - - /* Close VL datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get the dataspace */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Get the datatype */ - tid1 = H5Dget_type(dataset); - CHECK(tid1, FAIL, "H5Dget_type"); - - /* Check the array rank */ - ndims = H5Tget_array_ndims(tid1); - VERIFY(ndims, ARRAY1_RANK, "H5Tget_array_ndims"); - - /* Get the array dimensions */ - ret = H5Tget_array_dims2(tid1, rdims1); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims; i++) - if (rdims1[i] != tdims1[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%" PRIuHSIZE - ", tdims1[%d]=%" PRIuHSIZE "\n", - i, rdims1[i], i, tdims1[i]); - continue; - } /* end if */ - - /* Get the VL datatype */ - tid2 = H5Tget_super(tid1); - CHECK(tid2, FAIL, "H5Tget_super"); - - /* Get the VL datatype's class */ - mclass = H5Tget_class(tid2); - VERIFY(mclass, H5T_VLEN, "H5Tget_class"); - - /* Check the VL datatype's base type */ - tid3 = H5Tget_super(tid2); - CHECK(tid3, FAIL, "H5Tget_super"); - - /* Get the nested array datatype's class */ - mclass = H5Tget_class(tid3); - VERIFY(mclass, H5T_ARRAY, "H5Tget_class"); - - /* Check the array rank */ - ndims = H5Tget_array_ndims(tid3); - VERIFY(ndims, ARRAY1_RANK, "H5Tget_array_ndims"); - - /* Get the array dimensions */ - ret = H5Tget_array_dims2(tid3, rdims1); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims; i++) - if (rdims1[i] != tdims1[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%" PRIuHSIZE - ", tdims1[%d]=%" PRIuHSIZE "\n", - i, rdims1[i], i, tdims1[i]); - continue; - } /* end if */ - - /* Check the array's base type */ - tid4 = H5Tget_super(tid3); - CHECK(tid4, FAIL, "H5Tget_super"); - - if ((ret = H5Tequal(tid4, H5T_NATIVE_UINT)) <= 0) - TestErrPrintf("VL base datatype is incorrect!, ret=%d\n", (int)ret); - - /* Close the array's base type datatype */ - ret = H5Tclose(tid4); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close the nested array datatype */ - ret = H5Tclose(tid3); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close VL Datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_array_alloc_custom, &mem_used, test_array_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dataset, tid1, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* # elements allocated = (1 + 2 + 3 + 4) + (2 + 3 + 4 + 5) + - * (3 + 4 + 5 + 6) + (4 + 5 + 6 + 7) = 64*ARRAY1_DIM1 elements - */ - VERIFY(size, 64 * (sizeof(unsigned int) * ARRAY1_DIM1), "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* # elements allocated = (1 + 2 + 3 + 4) + (2 + 3 + 4 + 5) + - * (3 + 4 + 5 + 6) + (4 + 5 + 6 + 7) = 64*ARRAY1_DIM1 elements - */ - VERIFY(mem_used, 64 * (sizeof(unsigned int) * ARRAY1_DIM1), "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - for (j = 0; j < ARRAY1_DIM1; j++) { - if (wdata[i][j].len != rdata[i][j].len) { - TestErrPrintf("VL data length don't match!, wdata[%d][%d].len=%d, rdata[%d][%d].len=%d\n", - (int)i, (int)j, (int)wdata[i][j].len, (int)i, (int)j, (int)rdata[i][j].len); - continue; - } /* end if */ - for (k = 0; k < (int)rdata[i][j].len; k++) { - for (l = 0; l < ARRAY1_DIM1; l++) { - if (((unsigned int *)wdata[i][j].p)[k * ARRAY1_DIM1 + l] != - ((unsigned int *)rdata[i][j].p)[k * ARRAY1_DIM1 + l]) { - TestErrPrintf("VL data values don't match!, wdata[%d][%d].p[%d][%d]=%d, " - "rdata[%d][%d].p[%d][%d]=%d\n", - (int)i, (int)j, (int)k, (int)l, - (int)((unsigned int *)wdata[i][j].p)[k * ARRAY1_DIM1 + l], (int)i, - (int)j, (int)k, (int)l, - (int)((unsigned int *)rdata[i][j].p)[k * ARRAY1_DIM1 + l]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - } /* end for */ - } /* end for */ - - /* Reclaim the read VL data */ - ret = H5Treclaim(tid1, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid1, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close Datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_array_vlen_array() */ - -/*------------------------------------------------------------------------- - * Function: test_array_bkg - * - * Purpose: Test basic array datatype code. - * Tests reading compound datatype with array fields and - * writing partial fields. - * - * Return: void - * - *------------------------------------------------------------------------- - */ -static void -test_array_bkg(void) -{ - herr_t status = -1; - - hid_t fid, array_dt; - hid_t space; - hid_t type; - hid_t dataset; - - hsize_t dim[] = {LENGTH}; - hsize_t dima[] = {ALEN}; - - int i, j; - unsigned ndims[3] = {1, 1, 1}; - - typedef struct { - int a[ALEN]; - float b[ALEN]; - double c[ALEN]; - } CmpField; - - CmpField cf[LENGTH]; - CmpField cfr[LENGTH]; - CmpDTSinfo *dtsinfo = NULL; - - typedef struct { - float b[ALEN]; - } fld_t; - - fld_t fld[LENGTH]; - fld_t fldr[LENGTH]; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Partial I/O of Array Fields in Compound Datatype Functionality\n")); - - /* Initialize the data */ - /* ------------------- */ - dtsinfo = (CmpDTSinfo *)malloc(sizeof(CmpDTSinfo)); - CHECK_PTR(dtsinfo, "malloc"); - memset(dtsinfo, 0, sizeof(CmpDTSinfo)); - for (i = 0; i < LENGTH; i++) { - for (j = 0; j < ALEN; j++) { - cf[i].a[j] = 100 * (i + 1) + j; - cf[i].b[j] = 100.0F * ((float)i + 1.0F) + 0.01F * (float)j; - cf[i].c[j] = (double)(100.0F * ((float)i + 1.0F) + 0.02F * (float)j); - } /* end for */ - } /* end for */ - - /* Set the number of data members */ - /* ------------------------------ */ - dtsinfo->nsubfields = 3; - - /* Initialize the offsets */ - /* ----------------------- */ - dtsinfo->offset[0] = HOFFSET(CmpField, a); - dtsinfo->offset[1] = HOFFSET(CmpField, b); - dtsinfo->offset[2] = HOFFSET(CmpField, c); - - /* Initialize the data type IDs */ - /* ---------------------------- */ - dtsinfo->datatype[0] = H5T_NATIVE_INT; - dtsinfo->datatype[1] = H5T_NATIVE_FLOAT; - dtsinfo->datatype[2] = H5T_NATIVE_DOUBLE; - - /* Initialize the names of data members */ - /* ------------------------------------ */ - for (i = 0; i < dtsinfo->nsubfields; i++) - dtsinfo->name[i] = (char *)calloc((size_t)20, sizeof(char)); - - strcpy(dtsinfo->name[0], "One"); - strcpy(dtsinfo->name[1], "Two"); - strcpy(dtsinfo->name[2], "Three"); - - /* Create file */ - /* ----------- */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create data space */ - /* ----------------- */ - space = H5Screate_simple(RANK, dim, NULL); - CHECK(space, FAIL, "H5Screate_simple"); - - /* Create the memory data type */ - /* --------------------------- */ - type = H5Tcreate(H5T_COMPOUND, sizeof(CmpField)); - CHECK(type, FAIL, "H5Tcreate"); - - /* Add members to the compound data type */ - /* -------------------------------------- */ - for (i = 0; i < dtsinfo->nsubfields; i++) { - array_dt = H5Tarray_create2(dtsinfo->datatype[i], ndims[i], dima); - CHECK(array_dt, FAIL, "H5Tarray_create2"); - - status = H5Tinsert(type, dtsinfo->name[i], dtsinfo->offset[i], array_dt); - CHECK(status, FAIL, "H5Tinsert"); - - status = H5Tclose(array_dt); - CHECK(status, FAIL, "H5Tclose"); - } /* end for */ - - /* Create the dataset */ - /* ------------------ */ - dataset = H5Dcreate2(fid, FIELDNAME, type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write data to the dataset */ - /* ------------------------- */ - status = H5Dwrite(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, cf); - CHECK(status, FAIL, "H5Dwrite"); - - status = H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, cfr); - CHECK(status, FAIL, "H5Dread"); - - /* Verify correct data */ - /* ------------------- */ - for (i = 0; i < LENGTH; i++) { - for (j = 0; j < ALEN; j++) { - if (cf[i].a[j] != cfr[i].a[j]) { - TestErrPrintf("Field a data doesn't match, cf[%d].a[%d]=%d, cfr[%d].a[%d]=%d\n", (int)i, - (int)j, (int)cf[i].a[j], (int)i, (int)j, (int)cfr[i].a[j]); - continue; - } /* end if */ - if (!H5_FLT_ABS_EQUAL(cf[i].b[j], cfr[i].b[j])) { - TestErrPrintf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n", (int)i, - (int)j, (double)cf[i].b[j], (int)i, (int)j, (double)cfr[i].b[j]); - continue; - } /* end if */ - if (!H5_DBL_ABS_EQUAL(cf[i].c[j], cfr[i].c[j])) { - TestErrPrintf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n", (int)i, - (int)j, (double)cf[i].c[j], (int)i, (int)j, (double)cfr[i].c[j]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Release memory resources */ - /* ------------------------ */ - for (i = 0; i < dtsinfo->nsubfields; i++) - free(dtsinfo->name[i]); - - /* Release IDs */ - /* ----------- */ - status = H5Tclose(type); - CHECK(status, FAIL, "H5Tclose"); - - status = H5Sclose(space); - CHECK(status, FAIL, "H5Sclose"); - - status = H5Dclose(dataset); - CHECK(status, FAIL, "H5Dclose"); - - status = H5Fclose(fid); - CHECK(status, FAIL, "H5Fclose"); - - /******************************/ - /* Reopen the file and update */ - /******************************/ - - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - dataset = H5Dopen2(fid, FIELDNAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - type = H5Tcreate(H5T_COMPOUND, sizeof(fld_t)); - CHECK(type, FAIL, "H5Tcreate"); - - array_dt = H5Tarray_create2(H5T_NATIVE_FLOAT, 1, dima); - CHECK(array_dt, FAIL, "H5Tarray_create2"); - - status = H5Tinsert(type, "Two", HOFFSET(fld_t, b), array_dt); - CHECK(status, FAIL, "H5Tinsert"); - - /* Initialize the data to overwrite */ - /* -------------------------------- */ - for (i = 0; i < LENGTH; i++) - for (j = 0; j < ALEN; j++) - cf[i].b[j] = fld[i].b[j] = 1.313F; - - status = H5Dwrite(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, fld); - CHECK(status, FAIL, "H5Dwrite"); - - /* Read just the field changed */ - status = H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, fldr); - CHECK(status, FAIL, "H5Dread"); - - for (i = 0; i < LENGTH; i++) - for (j = 0; j < ALEN; j++) - if (!H5_FLT_ABS_EQUAL(fld[i].b[j], fldr[i].b[j])) { - TestErrPrintf("Field data doesn't match, fld[%d].b[%d]=%f, fldr[%d].b[%d]=%f\n", (int)i, - (int)j, (double)fld[i].b[j], (int)i, (int)j, (double)fldr[i].b[j]); - continue; - } /* end if */ - - status = H5Tclose(type); - CHECK(status, FAIL, "H5Tclose"); - - status = H5Tclose(array_dt); - CHECK(status, FAIL, "H5Tclose"); - - type = H5Dget_type(dataset); - CHECK(type, FAIL, "H5Dget_type"); - - /* Read the entire dataset again */ - status = H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, cfr); - CHECK(status, FAIL, "H5Dread"); - - /* Verify correct data */ - /* ------------------- */ - for (i = 0; i < LENGTH; i++) { - for (j = 0; j < ALEN; j++) { - if (cf[i].a[j] != cfr[i].a[j]) { - TestErrPrintf("Field a data doesn't match, cf[%d].a[%d]=%d, cfr[%d].a[%d]=%d\n", (int)i, - (int)j, (int)cf[i].a[j], (int)i, (int)j, (int)cfr[i].a[j]); - continue; - } /* end if */ - if (!H5_FLT_ABS_EQUAL(cf[i].b[j], cfr[i].b[j])) { - TestErrPrintf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n", (int)i, - (int)j, (double)cf[i].b[j], (int)i, (int)j, (double)cfr[i].b[j]); - continue; - } /* end if */ - if (!H5_DBL_ABS_EQUAL(cf[i].c[j], cfr[i].c[j])) { - TestErrPrintf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n", (int)i, - (int)j, (double)cf[i].c[j], (int)i, (int)j, (double)cfr[i].c[j]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - status = H5Dclose(dataset); - CHECK(status, FAIL, "H5Dclose"); - - status = H5Tclose(type); - CHECK(status, FAIL, "H5Tclose"); - - status = H5Fclose(fid); - CHECK(status, FAIL, "H5Fclose"); - - /****************************************************/ - /* Reopen the file and print out all the data again */ - /****************************************************/ - - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - dataset = H5Dopen2(fid, FIELDNAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - type = H5Dget_type(dataset); - CHECK(type, FAIL, "H5Dget_type"); - - /* Reset the data to read in */ - /* ------------------------- */ - memset(cfr, 0, sizeof(CmpField) * LENGTH); - - status = H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, cfr); - CHECK(status, FAIL, "H5Dread"); - - /* Verify correct data */ - /* ------------------- */ - for (i = 0; i < LENGTH; i++) { - for (j = 0; j < ALEN; j++) { - if (cf[i].a[j] != cfr[i].a[j]) { - TestErrPrintf("Field a data doesn't match, cf[%d].a[%d]=%d, cfr[%d].a[%d]=%d\n", (int)i, - (int)j, (int)cf[i].a[j], (int)i, (int)j, (int)cfr[i].a[j]); - continue; - } /* end if */ - if (!H5_FLT_ABS_EQUAL(cf[i].b[j], cfr[i].b[j])) { - TestErrPrintf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n", (int)i, - (int)j, (double)cf[i].b[j], (int)i, (int)j, (double)cfr[i].b[j]); - continue; - } /* end if */ - if (!H5_DBL_ABS_EQUAL(cf[i].c[j], cfr[i].c[j])) { - TestErrPrintf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n", (int)i, - (int)j, (double)cf[i].c[j], (int)i, (int)j, (double)cfr[i].c[j]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - status = H5Dclose(dataset); - CHECK(status, FAIL, "H5Dclose"); - - status = H5Tclose(type); - CHECK(status, FAIL, "H5Tclose"); - - status = H5Fclose(fid); - CHECK(status, FAIL, "H5Fclose"); - - free(dtsinfo); -} /* end test_array_bkg() */ - -/*------------------------------------------------------------------------- - * Function: test_compat - * - * Purpose: Test array datatype compatibility code. - * - * Reads file containing old version of datatype object header - * messages for compound datatypes and verifies reading the older - * version of the is working correctly. - * - * Return: void - * - *------------------------------------------------------------------------- - */ -#if 0 -static void -test_compat(void) -{ - const char *testfile = H5_get_srcdir_filename(TESTFILE); /* Corrected test file name */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t tid1; /* Array Datatype ID */ - hid_t tid2; /* Datatype ID */ - hsize_t tdims1[] = {ARRAY1_DIM1}; - int ndims; /* Array rank for reading */ - hsize_t rdims1[H5S_MAX_RANK]; /* Array dimensions for reading */ - H5T_class_t mclass; /* Datatype class for VL */ - int nmemb; /* Number of compound members */ - char *mname; /* Name of compound field */ - size_t off; /* Offset of compound field */ - hid_t mtid; /* Datatype ID for field */ - int i; /* Index variables */ - bool driver_is_default_compatible; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Array Datatypes Compatibility Functionality\n")); - - /* - * Try reading a file that has been prepared that has datasets with - * compound datatypes which use an older version (version 1) of the - * datatype object header message for describing the datatype. - * - * If this test fails and the datatype object header message version has - * changed, follow the instructions in gen_old_array.c for regenerating - * the tarrold.h5 file. - */ - - if (h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible) < 0) - TestErrPrintf("can't check if VFD is default VFD compatible\n"); - if (!driver_is_default_compatible) { - printf(" -- SKIPPED --\n"); - return; - } - - /* Open the testfile */ - fid1 = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK_I(fid1, "H5Fopen"); - - /* Only try to proceed if the file is around */ - if (fid1 >= 0) { - /* Open the first dataset (with no array fields) */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK_I(dataset, "H5Dopen2"); - - /* Get the datatype */ - tid1 = H5Dget_type(dataset); - CHECK_I(tid1, "H5Dget_type"); - - /* Verify datatype class */ - mclass = H5Tget_class(tid1); - VERIFY(mclass, H5T_COMPOUND, "H5Tget_class"); - - /* Get the number of compound datatype fields */ - nmemb = H5Tget_nmembers(tid1); - VERIFY(nmemb, 3, "H5Tget_nmembers"); - - /* Check the 1st field's name */ - mname = H5Tget_member_name(tid1, 0); - CHECK_PTR(mname, "H5Tget_member_name"); - if (strcmp(mname, "i") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - H5free_memory(mname); - - /* Check the 1st field's offset */ - off = H5Tget_member_offset(tid1, 0); - VERIFY(off, 0, "H5Tget_member_offset"); - - /* Check the 1st field's datatype */ - mtid = H5Tget_member_type(tid1, 0); - CHECK(mtid, FAIL, "H5Tget_member_type"); - if ((ret = H5Tequal(mtid, H5T_STD_I16LE)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - ret = H5Tclose(mtid); - CHECK(mtid, FAIL, "H5Tclose"); - - /* Check the 2nd field's name */ - mname = H5Tget_member_name(tid1, 1); - CHECK_PTR(mname, "H5Tget_member_name"); - if (strcmp(mname, "f") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - H5free_memory(mname); - - /* Check the 2nd field's offset */ - off = H5Tget_member_offset(tid1, 1); - VERIFY(off, 4, "H5Tget_member_offset"); - - /* Check the 2nd field's datatype */ - mtid = H5Tget_member_type(tid1, 1); - CHECK(mtid, FAIL, "H5Tget_member_type"); - if ((ret = H5Tequal(mtid, H5T_IEEE_F32LE)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - ret = H5Tclose(mtid); - CHECK(mtid, FAIL, "H5Tclose"); - - /* Check the 3rd field's name */ - mname = H5Tget_member_name(tid1, 2); - CHECK_PTR(mname, "H5Tget_member_name"); - if (strcmp(mname, "l") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - H5free_memory(mname); - - /* Check the 3rd field's offset */ - off = H5Tget_member_offset(tid1, 2); - VERIFY(off, 8, "H5Tget_member_offset"); - - /* Check the 3rd field's datatype */ - mtid = H5Tget_member_type(tid1, 2); - CHECK(mtid, FAIL, "H5Tget_member_type"); - if ((ret = H5Tequal(mtid, H5T_STD_I32LE)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - ret = H5Tclose(mtid); - CHECK(mtid, FAIL, "H5Tclose"); - - /* Close the datatype */ - ret = H5Tclose(tid1); - CHECK_I(ret, "H5Tclose"); - - /* Close the dataset */ - ret = H5Dclose(dataset); - CHECK_I(ret, "H5Dclose"); - - /* Open the second dataset (with array fields) */ - dataset = H5Dopen2(fid1, "Dataset2", H5P_DEFAULT); - CHECK_I(dataset, "H5Dopen2"); - - /* Get the datatype */ - tid1 = H5Dget_type(dataset); - CHECK_I(tid1, "H5Dget_type"); - - /* Verify datatype class */ - mclass = H5Tget_class(tid1); - VERIFY(mclass, H5T_COMPOUND, "H5Tget_class"); - - /* Get the number of compound datatype fields */ - nmemb = H5Tget_nmembers(tid1); - VERIFY(nmemb, 4, "H5Tget_nmembers"); - - /* Check the 1st field's name */ - mname = H5Tget_member_name(tid1, 0); - CHECK_PTR(mname, "H5Tget_member_name"); - if (mname && strcmp(mname, "i") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - if (mname) - H5free_memory(mname); - - /* Check the 1st field's offset */ - off = H5Tget_member_offset(tid1, 0); - VERIFY(off, 0, "H5Tget_member_offset"); - - /* Check the 1st field's datatype */ - mtid = H5Tget_member_type(tid1, 0); - CHECK(mtid, FAIL, "H5Tget_member_type"); - if ((ret = H5Tequal(mtid, H5T_STD_I16LE)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - ret = H5Tclose(mtid); - CHECK(mtid, FAIL, "H5Tclose"); - - /* Check the 2nd field's name */ - mname = H5Tget_member_name(tid1, 1); - CHECK_PTR(mname, "H5Tget_member_name"); - if (mname && strcmp(mname, "f") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - if (mname) - H5free_memory(mname); - - /* Check the 2nd field's offset */ - off = H5Tget_member_offset(tid1, 1); - VERIFY(off, 4, "H5Tget_member_offset"); - - /* Check the 2nd field's datatype */ - mtid = H5Tget_member_type(tid1, 1); - CHECK(mtid, FAIL, "H5Tget_member_type"); - - /* Verify datatype class */ - mclass = H5Tget_class(mtid); - VERIFY(mclass, H5T_ARRAY, "H5Tget_class"); - - /* Check the array rank */ - ndims = H5Tget_array_ndims(mtid); - VERIFY(ndims, ARRAY1_RANK, "H5Tget_array_ndims"); - - /* Get the array dimensions */ - ret = H5Tget_array_dims2(mtid, rdims1); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims; i++) - if (rdims1[i] != tdims1[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%" PRIuHSIZE - ", tdims1[%d]=%" PRIuHSIZE "\n", - i, rdims1[i], i, tdims1[i]); - continue; - } /* end if */ - - /* Check the array's base datatype */ - tid2 = H5Tget_super(mtid); - CHECK(tid2, FAIL, "H5Tget_super"); - - if ((ret = H5Tequal(tid2, H5T_IEEE_F32LE)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(mtid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Check the 3rd field's name */ - mname = H5Tget_member_name(tid1, 2); - CHECK_PTR(mname, "H5Tget_member_name"); - if (mname && strcmp(mname, "l") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - if (mname) - H5free_memory(mname); - - /* Check the 3rd field's offset */ - off = H5Tget_member_offset(tid1, 2); - VERIFY(off, 20, "H5Tget_member_offset"); - - /* Check the 3rd field's datatype */ - mtid = H5Tget_member_type(tid1, 2); - CHECK(mtid, FAIL, "H5Tget_member_type"); - - /* Verify datatype class */ - mclass = H5Tget_class(mtid); - VERIFY(mclass, H5T_ARRAY, "H5Tget_class"); - - /* Check the array rank */ - ndims = H5Tget_array_ndims(mtid); - VERIFY(ndims, ARRAY1_RANK, "H5Tget_array_ndims"); - - /* Get the array dimensions */ - ret = H5Tget_array_dims2(mtid, rdims1); - CHECK(ret, FAIL, "H5Tget_array_dims2"); - - /* Check the array dimensions */ - for (i = 0; i < ndims; i++) - if (rdims1[i] != tdims1[i]) { - TestErrPrintf("Array dimension information doesn't match!, rdims1[%d]=%" PRIuHSIZE - ", tdims1[%d]=%" PRIuHSIZE "\n", - i, rdims1[i], i, tdims1[i]); - continue; - } /* end if */ - - /* Check the array's base datatype */ - tid2 = H5Tget_super(mtid); - CHECK(tid2, FAIL, "H5Tget_super"); - - if ((ret = H5Tequal(tid2, H5T_STD_I32LE)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(mtid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Check the 4th field's name */ - mname = H5Tget_member_name(tid1, 3); - CHECK_PTR(mname, "H5Tget_member_name"); - if (mname && strcmp(mname, "d") != 0) - TestErrPrintf("Compound field name doesn't match!, mname=%s\n", mname); - if (mname) - H5free_memory(mname); - - /* Check the 4th field's offset */ - off = H5Tget_member_offset(tid1, 3); - VERIFY(off, 36, "H5Tget_member_offset"); - - /* Check the 4th field's datatype */ - mtid = H5Tget_member_type(tid1, 3); - CHECK(mtid, FAIL, "H5Tget_member_type"); - if ((ret = H5Tequal(mtid, H5T_IEEE_F64LE)) <= 0) - TestErrPrintf("Compound data type is incorrect!, ret=%d\n", (int)ret); - ret = H5Tclose(mtid); - CHECK(mtid, FAIL, "H5Tclose"); - - /* Close the datatype */ - ret = H5Tclose(tid1); - CHECK_I(ret, "H5Tclose"); - - /* Close the dataset */ - ret = H5Dclose(dataset); - CHECK_I(ret, "H5Dclose"); - - /* Close the file */ - ret = H5Fclose(fid1); - CHECK_I(ret, "H5Fclose"); - } /* end if */ - else - printf("***cannot open the pre-created compound datatype test file (%s)\n", testfile); - -} /* end test_compat() */ -#endif - -/*------------------------------------------------------------------------- - * Function: test_array - * - * Purpose: Main array datatype testing routine. - * - * Return: void - * - *------------------------------------------------------------------------- - */ -void -test_array(void) -{ - /* Output message about test being performed */ - MESSAGE(5, ("Testing Array Datatypes\n")); - - /* These tests use the same file... */ - test_array_atomic_1d(); /* Test 1-D array of atomic datatypes */ - test_array_atomic_3d(); /* Test 3-D array of atomic datatypes */ - test_array_array_atomic(); /* Test 1-D array of 2-D arrays of atomic datatypes */ - test_array_compound_atomic(); /* Test 1-D array of compound datatypes (with no array fields) */ - test_array_compound_array(); /* Test 1-D array of compound datatypes (with array fields) */ - test_array_vlen_atomic(); /* Test 1-D array of atomic VL datatypes */ - test_array_vlen_array(); /* Test 1-D array of 1-D array VL datatypes */ - test_array_funcs(); /* Test type functions with array types */ - - test_array_bkg(); /* Read compound datatype with array fields and background fields read */ -#if 0 - /* This test uses a custom file */ - test_compat(); /* Test compatibility changes for compound datatype fields */ -#endif -} /* end test_array() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_array - * - * Purpose: Cleanup temporary test files - * - * Return: void - * - *------------------------------------------------------------------------- - */ -void -cleanup_array(void) -{ - H5Fdelete(FILENAME, H5P_DEFAULT); -} /* end cleanup_array() */ diff --git a/test/API/tattr.c b/test/API/tattr.c deleted file mode 100644 index c4ae9f9..0000000 --- a/test/API/tattr.c +++ /dev/null @@ -1,11923 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tattr - * - * Test the attribute functionality - * - *************************************************************/ - -#include "testhdf5.h" - -#if 0 -#include "H5VLnative_private.h" - -/* - * This file needs to access private information from the H5O package. - * This file also needs to access the object header testing code. - */ -#define H5O_FRIEND /*suppress error about including H5Opkg */ -#define H5O_TESTING -#include "H5Opkg.h" /* Object headers */ - -/* - * This file needs to access private information from the H5A package. - * This file also needs to access the attribute testing code. - */ -#define H5A_FRIEND /*suppress error about including H5Apkg */ -#define H5A_TESTING -#include "H5Apkg.h" /* Attributes */ - -/* - * This file needs to access private information from the H5F package. - * This file also needs to access the file testing code. - */ -#define H5F_FRIEND /*suppress error about including H5Fpkg */ -#define H5F_TESTING -#include "H5Fpkg.h" /* File access */ -#endif - -#define FILENAME "tattr.h5" -#define NAME_BUF_SIZE 1024 -#define ATTR_NAME_LEN 16 -#define ATTR_MAX_DIMS 7 -#define ATTR_TMP_NAME "a really long temp_name" -#define CORDER_ITER_STOP 3 - -/* 3-D dataset with fixed dimensions */ -#define SPACE1_RANK 3 -#define SPACE1_DIM1 3 -#define SPACE1_DIM2 15 -#define SPACE1_DIM3 13 - -/* Dataset Information */ -#define DSET1_NAME "Dataset1" -#define DSET2_NAME "Dataset2" -#define DSET3_NAME "Dataset3" -#define NUM_DSETS 3 - -/* Group Information */ -#define GROUP1_NAME "/Group1" -#define GROUP2_NAME "/Group2" -#define GROUP3_NAME "/Group3" - -/* Named Datatype Information */ -#define TYPE1_NAME "/Type" - -/* Attribute Rank & Dimensions */ -#define ATTR1_NAME "Attr1" -#define ATTR1_RANK 1 -#define ATTR1_DIM1 3 -int attr_data1[ATTR1_DIM1] = {512, -234, 98123}; /* Test data for 1st attribute */ - -/* rank & dimensions for another attribute */ -#define ATTR1A_NAME "Attr1_a" -int attr_data1a[ATTR1_DIM1] = {256, 11945, -22107}; - -#define ATTR2_NAME "Attr2" -#define ATTR2_RANK 2 -#define ATTR2_DIM1 2 -#define ATTR2_DIM2 2 -int attr_data2[ATTR2_DIM1][ATTR2_DIM2] = {{7614, -416}, {197814, -3}}; /* Test data for 2nd attribute */ - -#define ATTR3_NAME "Attr3" -#define ATTR3_RANK 3 -#define ATTR3_DIM1 2 -#define ATTR3_DIM2 2 -#define ATTR3_DIM3 2 -double attr_data3[ATTR3_DIM1][ATTR3_DIM2][ATTR3_DIM3] = { - {{2.3, -26.1}, {0.123, -10.0}}, {{973.23, -0.91827}, {2.0, 23.0}}}; /* Test data for 3rd attribute */ - -#define ATTR4_NAME "Attr4" -#define ATTR4_RANK 2 -#define ATTR4_DIM1 2 -#define ATTR4_DIM2 2 -#define ATTR4_FIELDNAME1 "i" -#define ATTR4_FIELDNAME2 "d" -#define ATTR4_FIELDNAME3 "c" -size_t attr4_field1_off = 0; -size_t attr4_field2_off = 0; -size_t attr4_field3_off = 0; -struct attr4_struct { - int i; - double d; - char c; -} attr_data4[ATTR4_DIM1][ATTR4_DIM2] = { - {{3, -26.1, 'd'}, {-100000, 0.123, '3'}}, - {{-23, 981724.2, 'Q'}, {0, 2.0, '\n'}}}; /* Test data for 4th attribute */ - -#define ATTR5_NAME "Attr5" -#define ATTR5_RANK 0 -float attr_data5 = -5.123F; /* Test data for 5th attribute */ - -#define ATTR6_RANK 3 -#define ATTR6_DIM1 100 -#define ATTR6_DIM2 100 -#define ATTR6_DIM3 100 - -#define ATTR7_NAME "attr 1 - 000000" -#define ATTR8_NAME "attr 2" - -#define LINK1_NAME "Link1" - -#define NATTR_MANY_OLD 350 -#define NATTR_MANY_NEW 3500 - -#define BUG2_NATTR 100 -#define BUG2_NATTR2 16 - -#define BUG3_DSET_NAME "dset" -#define BUG3_DT_NAME "dt" -#define BUG3_ATTR_NAME "attr" - -/* Used by test_attr_delete_last_dense() */ -#define GRPNAME "grp" -#define ATTRNAME "attr" -#define DIM0 100 -#define DIM1 100 -#define RANK 2 - -/* Used by test_attr_info_null_info_pointer() */ -#define GET_INFO_NULL_POINTER_ATTR_NAME "NullInfoPointerAttr" - -/* Used by test_attr_rename_invalid_name() */ -#define INVALID_RENAME_TEST_ATTR_NAME "InvalidRenameTestAttr" -#define INVALID_RENAME_TEST_NEW_ATTR_NAME "InvalidRenameTestNewAttr" - -/* Used by test_attr_get_name_invalid_buf() */ -#define GET_NAME_INVALID_BUF_TEST_ATTR_NAME "InvalidNameBufferTestAttr" - -/* Attribute iteration struct */ -typedef struct { - H5_iter_order_t order; /* Direction of iteration */ - unsigned ncalled; /* # of times callback is entered */ - unsigned nskipped; /* # of attributes skipped */ - int stop; /* # of iterations to stop after */ - hsize_t curr; /* Current creation order value */ - size_t max_visit; /* Size of "visited attribute" flag array */ - bool *visited; /* Pointer to array of "visited attribute" flags */ -} attr_iter_info_t; - -static herr_t attr_op1(hid_t loc_id, const char *name, const H5A_info_t *ainfo, void *op_data); - -/* Global dcpl ID, can be re-set as a generated dcpl for various operations - * across multiple tests. - * e.g., minimized dataset object headers - */ -static hid_t dcpl_g = H5P_DEFAULT; - -/**************************************************************** -** -** test_attr_basic_write(): Test basic H5A (attribute) code. -** Tests integer attributes on both datasets and groups -** -****************************************************************/ -static void -test_attr_basic_write(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t group; /* Group ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t attr, attr2; /* Attribute ID */ -#if 0 - hsize_t attr_size; /* storage size for attribute */ -#endif - ssize_t attr_name_size; /* size of attribute name */ - char *attr_name = NULL; /* name of attribute */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {ATTR1_DIM1}; - hsize_t dims3[] = {ATTR2_DIM1, ATTR2_DIM2}; - int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading 1st attribute */ - int i; - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Scalar Attribute Writing Functions\n")); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Create dataspace for attribute */ - sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Try to create an attribute on the file (should create an attribute on root group) */ - attr = H5Acreate2(fid1, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the root group */ - group = H5Gopen2(fid1, "/", H5P_DEFAULT); - CHECK(group, FAIL, "H5Gopen2"); - - /* Open attribute again */ - attr = H5Aopen(group, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close root group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create an attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write attribute information */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Create an another attribute for the dataset */ - attr2 = H5Acreate2(dataset, ATTR1A_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write attribute information */ - ret = H5Awrite(attr2, H5T_NATIVE_INT, attr_data1a); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check storage size for attribute */ - attr_size = H5Aget_storage_size(attr); - VERIFY(attr_size, (ATTR1_DIM1 * sizeof(int)), "H5A_get_storage_size"); -#endif - /* Read attribute information immediately, without closing attribute */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute */ - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* change attribute name */ - ret = H5Arename(dataset, ATTR1_NAME, ATTR_TMP_NAME); - CHECK(ret, FAIL, "H5Arename"); - - /* Open attribute again */ - attr = H5Aopen(dataset, ATTR_TMP_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Verify new attribute name */ - attr_name_size = H5Aget_name(attr, (size_t)0, NULL); - CHECK(attr_name_size, FAIL, "H5Aget_name"); - - if (attr_name_size > 0) { - attr_name = (char *)calloc((size_t)(attr_name_size + 1), sizeof(char)); - CHECK_PTR(attr_name, "calloc"); - - if (attr_name) { - ret = (herr_t)H5Aget_name(attr, (size_t)(attr_name_size + 1), attr_name); - CHECK(ret, FAIL, "H5Aget_name"); - ret = strcmp(attr_name, ATTR_TMP_NAME); - VERIFY(ret, 0, "strcmp"); - - free(attr_name); - attr_name = NULL; - } /* end if */ - } /* end if */ - - /* Read attribute information immediately, without closing attribute */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the second attribute again */ - attr2 = H5Aopen(dataset, ATTR1A_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Verify new attribute name */ - attr_name_size = H5Aget_name(attr2, (size_t)0, NULL); - CHECK(attr_name_size, FAIL, "H5Aget_name"); - - if (attr_name_size > 0) { - attr_name = (char *)calloc((size_t)(attr_name_size + 1), sizeof(char)); - CHECK_PTR(attr_name, "calloc"); - - if (attr_name) { - ret = (herr_t)H5Aget_name(attr2, (size_t)(attr_name_size + 1), attr_name); - CHECK(ret, FAIL, "H5Aget_name"); - ret = strcmp(attr_name, ATTR1A_NAME); - VERIFY(ret, 0, "strcmp"); - - free(attr_name); - attr_name = NULL; - } /* end if */ - } /* end if */ - - /* Read attribute information immediately, without closing attribute */ - ret = H5Aread(attr2, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1a[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1a[%d]=%d, read_data1[%d]=%d\n", __LINE__, - i, attr_data1a[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create group */ - group = H5Gcreate2(fid1, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, FAIL, "H5Gcreate2"); - - /* Create dataspace for attribute */ - sid2 = H5Screate_simple(ATTR2_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create an attribute for the group */ - attr = H5Acreate2(group, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check storage size for attribute */ - attr_size = H5Aget_storage_size(attr); - VERIFY(attr_size, (ATTR2_DIM1 * ATTR2_DIM2 * sizeof(int)), "H5Aget_storage_size"); -#endif - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(group, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write attribute information */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data2); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check storage size for attribute */ - attr_size = H5Aget_storage_size(attr); - VERIFY(attr_size, (ATTR2_DIM1 * ATTR2_DIM2 * sizeof(int)), "H5A_get_storage_size"); -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Attribute dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_basic_write() */ - -/**************************************************************** -** -** test_attr_basic_read(): Test basic H5A (attribute) code. -** -****************************************************************/ -static void -test_attr_basic_read(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t group; /* Group ID */ - hid_t attr; /* Attribute ID */ - H5O_info2_t oinfo; /* Object info */ - int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading 1st attribute */ - int read_data2[ATTR2_DIM1][ATTR2_DIM2] = {{0}}; /* Buffer for reading 2nd attribute */ - int i, j; /* Local index variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Functions\n")); - - /* Create file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 2, "H5Oget_info3"); - - /* Open first attribute for the dataset */ - attr = H5Aopen(dataset, ATTR_TMP_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open the group */ - group = H5Gopen2(fid1, GROUP1_NAME, H5P_DEFAULT); - CHECK(group, FAIL, "H5Gopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(group, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 1, "H5Oget_info3"); - - /* Open the attribute for the group */ - attr = H5Aopen(group, ATTR2_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data2); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR2_DIM1; i++) - for (j = 0; j < ATTR2_DIM2; j++) - if (attr_data2[i][j] != read_data2[i][j]) - TestErrPrintf("%d: attribute data different: attr_data2[%d][%d]=%d, read_data2[%d][%d]=%d\n", - __LINE__, i, j, attr_data2[i][j], i, j, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_basic_read() */ - -/**************************************************************** -** -** test_attr_flush(): Test H5A (attribute) code for performing -** I/O when H5Fflush is used. -** -****************************************************************/ -static void -test_attr_flush(hid_t fapl) -{ - hid_t fil, /* File ID */ - att, /* Attribute ID */ - spc, /* Dataspace ID */ - set; /* Dataset ID */ - double wdata = 3.14159; /* Data to write */ - double rdata; /* Data read in */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Attribute Flushing\n")); - - fil = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fil, FAIL, "H5Fcreate"); - - spc = H5Screate(H5S_SCALAR); - CHECK(spc, FAIL, "H5Screate"); - - set = H5Dcreate2(fil, DSET1_NAME, H5T_NATIVE_DOUBLE, spc, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(set, FAIL, "H5Dcreate2"); - - att = H5Acreate2(set, ATTR1_NAME, H5T_NATIVE_DOUBLE, spc, H5P_DEFAULT, H5P_DEFAULT); - CHECK(att, FAIL, "H5Acreate2"); - - if ((vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) && (vol_cap_flags_g & H5VL_CAP_FLAG_FILL_VALUES) && - (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_MORE)) { - ret = H5Aread(att, H5T_NATIVE_DOUBLE, &rdata); - CHECK(ret, FAIL, "H5Aread"); - - if (!H5_DBL_ABS_EQUAL(rdata, 0.0)) - TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n", rdata, 0.0); - - ret = H5Fflush(fil, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - ret = H5Aread(att, H5T_NATIVE_DOUBLE, &rdata); - CHECK(ret, FAIL, "H5Awrite"); - - if (!H5_DBL_ABS_EQUAL(rdata, 0.0)) - TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n", rdata, 0.0); - } - else { - printf("** SKIPPED attribute pre-read due to fill values not being supported **\n"); - } - - ret = H5Awrite(att, H5T_NATIVE_DOUBLE, &wdata); - CHECK(ret, FAIL, "H5Awrite"); - - ret = H5Aread(att, H5T_NATIVE_DOUBLE, &rdata); - CHECK(ret, FAIL, "H5Awrite"); - - if (!H5_DBL_ABS_EQUAL(rdata, wdata)) - TestErrPrintf("attribute value wrong: rdata=%f, should be %f\n", rdata, wdata); - - ret = H5Sclose(spc); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Aclose(att); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Dclose(set); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fil); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_flush() */ - -/**************************************************************** -** -** test_attr_plist(): Test Attribute Creation Property Lists -** -****************************************************************/ -static void -test_attr_plist(hid_t fapl) -{ - hid_t fid = H5I_INVALID_HID; /* File ID */ - hid_t did = H5I_INVALID_HID; /* Dataset ID */ - hid_t dsid = H5I_INVALID_HID; /* Dataspace ID (for dataset) */ - hid_t asid = H5I_INVALID_HID; /* Dataspace ID (for attribute) */ - hid_t aid = H5I_INVALID_HID; /* Attribute ID */ - hid_t acpl_id = H5I_INVALID_HID; /* Attribute creation property list ID */ - hid_t aapl_id = H5I_INVALID_HID; /* Attribute access property list ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {ATTR1_DIM1}; - H5T_cset_t cset; /* Character set for attributes */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Attribute Property Lists\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for dataset */ - dsid = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(dsid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create a dataset */ - did = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, dsid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create dataspace for attribute */ - asid = H5Screate_simple(ATTR1_RANK, dims2, NULL); - CHECK(asid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create default creation property list for attribute */ - acpl_id = H5Pcreate(H5P_ATTRIBUTE_CREATE); - CHECK(acpl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create default access property list for attribute - * This currently has no properties, but we need to test its creation - * and use. - */ - aapl_id = H5Pcreate(H5P_ATTRIBUTE_ACCESS); - CHECK(aapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Get the character encoding and ensure that it is the default (ASCII) */ - ret = H5Pget_char_encoding(acpl_id, &cset); - CHECK(ret, FAIL, "H5Pget_char_encoding"); - VERIFY(cset, H5T_CSET_ASCII, "H5Pget_char_encoding"); - - /* Create an attribute for the dataset using the property list */ - aid = H5Acreate2(did, ATTR1_NAME, H5T_NATIVE_INT, asid, acpl_id, aapl_id); - CHECK(aid, H5I_INVALID_HID, "H5Acreate2"); - - /* Close the property list, and get the attribute's creation property list */ - ret = H5Pclose(acpl_id); - CHECK(ret, FAIL, "H5Pclose"); - acpl_id = H5Aget_create_plist(aid); - CHECK(acpl_id, H5I_INVALID_HID, "H5Aget_create_plist"); - - /* Get the character encoding and ensure that it is the default (ASCII) */ - ret = H5Pget_char_encoding(acpl_id, &cset); - CHECK(ret, FAIL, "H5Pget_char_encoding"); - VERIFY(cset, H5T_CSET_ASCII, "H5Pget_char_encoding"); - - /* Close the property list and attribute */ - ret = H5Pclose(acpl_id); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create a new property list and modify it to use a different encoding */ - acpl_id = H5Pcreate(H5P_ATTRIBUTE_CREATE); - CHECK(acpl_id, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_char_encoding(acpl_id, H5T_CSET_UTF8); - CHECK(ret, FAIL, "H5Pset_char_encoding"); - - /* Get the character encoding and ensure that it has been changed */ - ret = H5Pget_char_encoding(acpl_id, &cset); - CHECK(ret, FAIL, "H5Pget_char_encoding"); - VERIFY(cset, H5T_CSET_UTF8, "H5Pget_char_encoding"); - - /* Create an attribute for the dataset using the modified property list */ - aid = H5Acreate2(did, ATTR2_NAME, H5T_NATIVE_INT, asid, acpl_id, aapl_id); - CHECK(aid, H5I_INVALID_HID, "H5Acreate2"); - - /* Close the property list and attribute */ - ret = H5Pclose(acpl_id); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Re-open the second attribute and ensure that its character encoding is correct */ - aid = H5Aopen(did, ATTR2_NAME, H5P_DEFAULT); - CHECK(aid, H5I_INVALID_HID, "H5Aopen"); - acpl_id = H5Aget_create_plist(aid); - CHECK(acpl_id, H5I_INVALID_HID, "H5Aget_create_plist"); - ret = H5Pget_char_encoding(acpl_id, &cset); - CHECK(ret, FAIL, "H5Pget_char_encoding"); - VERIFY(cset, H5T_CSET_UTF8, "H5Pget_char_encoding"); - - /* Close everything */ - ret = H5Sclose(dsid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(asid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Pclose(aapl_id); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(acpl_id); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_plist() */ - -/**************************************************************** -** -** test_attr_compound_write(): Test H5A (attribute) code. -** Tests compound datatype attributes -** -****************************************************************/ -static void -test_attr_compound_write(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t tid1; /* Attribute datatype ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {ATTR4_DIM1, ATTR4_DIM2}; - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Multiple Attribute Functions\n")); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataset's dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create the attribute datatype. */ - tid1 = H5Tcreate(H5T_COMPOUND, sizeof(struct attr4_struct)); - CHECK(tid1, FAIL, "H5Tcreate"); - attr4_field1_off = HOFFSET(struct attr4_struct, i); - ret = H5Tinsert(tid1, ATTR4_FIELDNAME1, attr4_field1_off, H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - attr4_field2_off = HOFFSET(struct attr4_struct, d); - ret = H5Tinsert(tid1, ATTR4_FIELDNAME2, attr4_field2_off, H5T_NATIVE_DOUBLE); - CHECK(ret, FAIL, "H5Tinsert"); - attr4_field3_off = HOFFSET(struct attr4_struct, c); - ret = H5Tinsert(tid1, ATTR4_FIELDNAME3, attr4_field3_off, H5T_NATIVE_SCHAR); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create dataspace for 1st attribute */ - sid2 = H5Screate_simple(ATTR4_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create complex attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR4_NAME, tid1, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR4_NAME, tid1, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write complex attribute data */ - ret = H5Awrite(attr, tid1, attr_data4); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute's dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close attribute's datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_compound_write() */ - -/**************************************************************** -** -** test_attr_compound_read(): Test basic H5A (attribute) code. -** -****************************************************************/ -static void -test_attr_compound_read(hid_t fapl) -{ - hid_t fid1; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t space; /* Attribute dataspace */ - hid_t type; /* Attribute datatype */ - hid_t attr; /* Attribute ID */ - char attr_name[ATTR_NAME_LEN]; /* Buffer for attribute names */ - int rank; /* Attribute rank */ - hsize_t dims[ATTR_MAX_DIMS]; /* Attribute dimensions */ - H5T_class_t t_class; /* Attribute datatype class */ - H5T_order_t order; /* Attribute datatype order */ - size_t size; /* Attribute datatype size as stored in file */ - int fields; /* # of Attribute datatype fields */ - char *fieldname; /* Name of a field */ - size_t offset; /* Attribute datatype field offset */ - hid_t field; /* Attribute field datatype */ - struct attr4_struct read_data4[ATTR4_DIM1][ATTR4_DIM2]; /* Buffer for reading 4th attribute */ - ssize_t name_len; /* Length of attribute name */ - H5O_info2_t oinfo; /* Object info */ - int i, j; /* Local index variables */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Functions\n")); - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 1, "H5Oget_info3"); - - /* Open 1st attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Dataspace */ - space = H5Aget_space(attr); - CHECK(space, FAIL, "H5Aget_space"); - rank = H5Sget_simple_extent_ndims(space); - VERIFY(rank, ATTR4_RANK, "H5Sget_simple_extent_ndims"); - ret = H5Sget_simple_extent_dims(space, dims, NULL); - CHECK(ret, FAIL, "H5Sget_simple_extent_dims"); - if (dims[0] != ATTR4_DIM1) - TestErrPrintf("attribute dimensions different: dims[0]=%d, should be %d\n", (int)dims[0], ATTR4_DIM1); - if (dims[1] != ATTR4_DIM2) - TestErrPrintf("attribute dimensions different: dims[1]=%d, should be %d\n", (int)dims[1], ATTR4_DIM2); - H5Sclose(space); - - /* Verify Datatype */ - type = H5Aget_type(attr); - CHECK(type, FAIL, "H5Aget_type"); - t_class = H5Tget_class(type); - VERIFY(t_class, H5T_COMPOUND, "H5Tget_class"); - fields = H5Tget_nmembers(type); - VERIFY(fields, 3, "H5Tget_nmembers"); - for (i = 0; i < fields; i++) { - fieldname = H5Tget_member_name(type, (unsigned)i); - if (!(strcmp(fieldname, ATTR4_FIELDNAME1) != 0 || strcmp(fieldname, ATTR4_FIELDNAME2) != 0 || - strcmp(fieldname, ATTR4_FIELDNAME3) != 0)) - TestErrPrintf("invalid field name for field #%d: %s\n", i, fieldname); - H5free_memory(fieldname); - } /* end for */ - offset = H5Tget_member_offset(type, 0); - VERIFY(offset, attr4_field1_off, "H5Tget_member_offset"); - offset = H5Tget_member_offset(type, 1); - VERIFY(offset, attr4_field2_off, "H5Tget_member_offset"); - offset = H5Tget_member_offset(type, 2); - VERIFY(offset, attr4_field3_off, "H5Tget_member_offset"); - - /* Verify each field's type, class & size */ - field = H5Tget_member_type(type, 0); - CHECK(field, FAIL, "H5Tget_member_type"); - t_class = H5Tget_class(field); - VERIFY(t_class, H5T_INTEGER, "H5Tget_class"); - order = H5Tget_order(field); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_INT), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(field); - VERIFY(size, H5Tget_size(H5T_NATIVE_INT), "H5Tget_size"); - H5Tclose(field); - field = H5Tget_member_type(type, 1); - CHECK(field, FAIL, "H5Tget_member_type"); - t_class = H5Tget_class(field); - VERIFY(t_class, H5T_FLOAT, "H5Tget_class"); - order = H5Tget_order(field); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_DOUBLE), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(field); - VERIFY(size, H5Tget_size(H5T_NATIVE_DOUBLE), "H5Tget_size"); - H5Tclose(field); - field = H5Tget_member_type(type, 2); - CHECK(field, FAIL, "H5Tget_member_type"); - t_class = H5Tget_class(field); - VERIFY(t_class, H5T_INTEGER, "H5Tget_class"); - order = H5Tget_order(field); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_SCHAR), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(field); - VERIFY(size, H5Tget_size(H5T_NATIVE_SCHAR), "H5Tget_size"); - H5Tclose(field); - - /* Read attribute information */ - ret = H5Aread(attr, type, read_data4); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR4_DIM1; i++) - for (j = 0; j < ATTR4_DIM2; j++) - if (memcmp(&attr_data4[i][j], &read_data4[i][j], sizeof(struct attr4_struct)) != 0) { - printf("%d: attribute data different: attr_data4[%d][%d].i=%d, read_data4[%d][%d].i=%d\n", - __LINE__, i, j, attr_data4[i][j].i, i, j, read_data4[i][j].i); - printf("%d: attribute data different: attr_data4[%d][%d].d=%f, read_data4[%d][%d].d=%f\n", - __LINE__, i, j, attr_data4[i][j].d, i, j, read_data4[i][j].d); - TestErrPrintf( - "%d: attribute data different: attr_data4[%d][%d].c=%c, read_data4[%d][%d].c=%c\n", - __LINE__, i, j, attr_data4[i][j].c, i, j, read_data4[i][j].c); - } /* end if */ - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR4_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR4_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR4_NAME); - - /* Close attribute datatype */ - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_compound_read() */ - -/**************************************************************** -** -** test_attr_scalar_write(): Test scalar H5A (attribute) writing code. -** -****************************************************************/ -static void -test_attr_scalar_write(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Functions\n")); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Create dataspace for attribute */ - sid2 = H5Screate_simple(ATTR5_RANK, NULL, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create an attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR5_NAME, H5T_NATIVE_FLOAT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR5_NAME, H5T_NATIVE_FLOAT, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write attribute information */ - ret = H5Awrite(attr, H5T_NATIVE_FLOAT, &attr_data5); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_scalar_write() */ - -/**************************************************************** -** -** test_attr_scalar_read(): Test scalar H5A (attribute) reading code. -** -****************************************************************/ -static void -test_attr_scalar_read(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - H5S_class_t stype; /* Dataspace class */ - float rdata = 0.0F; /* Buffer for reading 1st attribute */ - H5O_info2_t oinfo; /* Object info */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Scalar Attribute Reading Functions\n")); - - /* Create file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 1, "H5Oget_info3"); - - /* Open an attribute for the dataset */ - attr = H5Aopen(dataset, ATTR5_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_FLOAT, &rdata); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify the floating-poing value in this way to avoid compiler warning. */ - if (!H5_FLT_ABS_EQUAL(rdata, attr_data5)) - printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n", "H5Aread", - (double)attr_data5, (double)rdata, (int)__LINE__, __FILE__); - - /* Get the attribute's dataspace */ - sid = H5Aget_space(attr); - CHECK(sid, FAIL, "H5Aget_space"); - - /* Make certain the dataspace is scalar */ - stype = H5Sget_simple_extent_type(sid); - VERIFY(stype, H5S_SCALAR, "H5Sget_simple_extent_type"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_scalar_read() */ - -/**************************************************************** -** -** test_attr_mult_write(): Test basic H5A (attribute) code. -** Tests integer attributes on both datasets and groups -** -****************************************************************/ -static void -test_attr_mult_write(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {ATTR1_DIM1}; - hsize_t dims3[] = {ATTR2_DIM1, ATTR2_DIM2}; - hsize_t dims4[] = {ATTR3_DIM1, ATTR3_DIM2, ATTR3_DIM3}; - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Multiple Attribute Functions\n")); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataset's dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for 1st attribute */ - sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create 1st attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write 1st attribute data */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close 1st attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute's dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for 2nd attribute */ - sid2 = H5Screate_simple(ATTR2_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create 2nd attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write 2nd attribute information */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data2); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close 2nd attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close 2nd attribute's dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for 3rd attribute */ - sid2 = H5Screate_simple(ATTR3_RANK, dims4, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create 3rd attribute for the dataset */ - attr = H5Acreate2(dataset, ATTR3_NAME, H5T_NATIVE_DOUBLE, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to create the same attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret_id = H5Acreate2(dataset, ATTR3_NAME, H5T_NATIVE_DOUBLE, sid2, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Acreate2"); - } - - /* Write 3rd attribute information */ - ret = H5Awrite(attr, H5T_NATIVE_DOUBLE, attr_data3); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close 3rd attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close 3rd attribute's dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_mult_write() */ - -/**************************************************************** -** -** test_attr_mult_read(): Test basic H5A (attribute) code. -** -****************************************************************/ -static void -test_attr_mult_read(hid_t fapl) -{ - hid_t fid1; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t space; /* Attribute dataspace */ - hid_t type; /* Attribute datatype */ - hid_t attr; /* Attribute ID */ - char attr_name[ATTR_NAME_LEN]; /* Buffer for attribute names */ - char temp_name[ATTR_NAME_LEN]; /* Buffer for mangling attribute names */ - int rank; /* Attribute rank */ - hsize_t dims[ATTR_MAX_DIMS]; /* Attribute dimensions */ - H5T_class_t t_class; /* Attribute datatype class */ - H5T_order_t order; /* Attribute datatype order */ - size_t size; /* Attribute datatype size as stored in file */ - int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading 1st attribute */ - int read_data2[ATTR2_DIM1][ATTR2_DIM2] = {{0}}; /* Buffer for reading 2nd attribute */ - double read_data3[ATTR3_DIM1][ATTR3_DIM2][ATTR3_DIM3] = {{{0}}}; /* Buffer for reading 3rd attribute */ - ssize_t name_len; /* Length of attribute name */ - H5O_info2_t oinfo; /* Object info */ - int i, j, k; /* Local index values */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Functions\n")); - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 3, "H5Oget_info3"); - - /* Open 1st attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Dataspace */ - space = H5Aget_space(attr); - CHECK(space, FAIL, "H5Aget_space"); - rank = H5Sget_simple_extent_ndims(space); - VERIFY(rank, ATTR1_RANK, "H5Sget_simple_extent_ndims"); - ret = H5Sget_simple_extent_dims(space, dims, NULL); - CHECK(ret, FAIL, "H5Sget_simple_extent_dims"); - if (dims[0] != ATTR1_DIM1) - TestErrPrintf("attribute dimensions different: dims[0]=%d, should be %d\n", (int)dims[0], ATTR1_DIM1); - H5Sclose(space); - - /* Verify Datatype */ - type = H5Aget_type(attr); - CHECK(type, FAIL, "H5Aget_type"); - t_class = H5Tget_class(type); - VERIFY(t_class, H5T_INTEGER, "H5Tget_class"); - order = H5Tget_order(type); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_INT), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(type); - VERIFY(size, H5Tget_size(H5T_NATIVE_INT), "H5Tget_size"); - H5Tclose(type); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR1_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR1_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR1_NAME); - - /* Verify Name with too small of a buffer */ - name_len = H5Aget_name(attr, strlen(ATTR1_NAME), attr_name); - VERIFY(name_len, strlen(ATTR1_NAME), "H5Aget_name"); - strcpy(temp_name, ATTR1_NAME); /* make a copy of the name */ - temp_name[strlen(ATTR1_NAME) - 1] = '\0'; /* truncate it to match the one retrieved */ - if (strcmp(attr_name, temp_name) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, temp_name); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open 2nd attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)1, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Dataspace */ - space = H5Aget_space(attr); - CHECK(space, FAIL, "H5Aget_space"); - rank = H5Sget_simple_extent_ndims(space); - VERIFY(rank, ATTR2_RANK, "H5Sget_simple_extent_ndims"); - ret = H5Sget_simple_extent_dims(space, dims, NULL); - CHECK(ret, FAIL, "H5Sget_simple_extent_dims"); - if (dims[0] != ATTR2_DIM1) - TestErrPrintf("attribute dimensions different: dims[0]=%d, should be %d\n", (int)dims[0], ATTR2_DIM1); - if (dims[1] != ATTR2_DIM2) - TestErrPrintf("attribute dimensions different: dims[1]=%d, should be %d\n", (int)dims[1], ATTR2_DIM2); - H5Sclose(space); - - /* Verify Datatype */ - type = H5Aget_type(attr); - CHECK(type, FAIL, "H5Aget_type"); - t_class = H5Tget_class(type); - VERIFY(t_class, H5T_INTEGER, "H5Tget_class"); - order = H5Tget_order(type); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_INT), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(type); - VERIFY(size, H5Tget_size(H5T_NATIVE_INT), "H5Tget_size"); - H5Tclose(type); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data2); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR2_DIM1; i++) - for (j = 0; j < ATTR2_DIM2; j++) - if (attr_data2[i][j] != read_data2[i][j]) - TestErrPrintf("%d: attribute data different: attr_data2[%d][%d]=%d, read_data2[%d][%d]=%d\n", - __LINE__, i, j, attr_data2[i][j], i, j, read_data2[i][j]); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR2_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR2_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR2_NAME); - - /* Verify Name with too small of a buffer */ - name_len = H5Aget_name(attr, strlen(ATTR2_NAME), attr_name); - VERIFY(name_len, strlen(ATTR2_NAME), "H5Aget_name"); - strcpy(temp_name, ATTR2_NAME); /* make a copy of the name */ - temp_name[strlen(ATTR2_NAME) - 1] = '\0'; /* truncate it to match the one retrieved */ - if (strcmp(attr_name, temp_name) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, temp_name); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open 2nd attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Dataspace */ - space = H5Aget_space(attr); - CHECK(space, FAIL, "H5Aget_space"); - rank = H5Sget_simple_extent_ndims(space); - VERIFY(rank, ATTR3_RANK, "H5Sget_simple_extent_ndims"); - ret = H5Sget_simple_extent_dims(space, dims, NULL); - CHECK(ret, FAIL, "H5Sget_simple_extent_dims"); - if (dims[0] != ATTR3_DIM1) - TestErrPrintf("attribute dimensions different: dims[0]=%d, should be %d\n", (int)dims[0], ATTR3_DIM1); - if (dims[1] != ATTR3_DIM2) - TestErrPrintf("attribute dimensions different: dims[1]=%d, should be %d\n", (int)dims[1], ATTR3_DIM2); - if (dims[2] != ATTR3_DIM3) - TestErrPrintf("attribute dimensions different: dims[2]=%d, should be %d\n", (int)dims[2], ATTR3_DIM3); - H5Sclose(space); - - /* Verify Datatype */ - type = H5Aget_type(attr); - CHECK(type, FAIL, "H5Aget_type"); - t_class = H5Tget_class(type); - VERIFY(t_class, H5T_FLOAT, "H5Tget_class"); - order = H5Tget_order(type); - VERIFY_TYPE(order, H5Tget_order(H5T_NATIVE_DOUBLE), H5T_order_t, "%d", "H5Tget_order"); - size = H5Tget_size(type); - VERIFY(size, H5Tget_size(H5T_NATIVE_DOUBLE), "H5Tget_size"); - H5Tclose(type); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_DOUBLE, read_data3); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR3_DIM1; i++) - for (j = 0; j < ATTR3_DIM2; j++) - for (k = 0; k < ATTR3_DIM3; k++) - if (!H5_DBL_ABS_EQUAL(attr_data3[i][j][k], read_data3[i][j][k])) - TestErrPrintf("%d: attribute data different: attr_data3[%d][%d][%d]=%f, " - "read_data3[%d][%d][%d]=%f\n", - __LINE__, i, j, k, attr_data3[i][j][k], i, j, k, read_data3[i][j][k]); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR3_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR3_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR3_NAME); - - /* Verify Name with too small of a buffer */ - name_len = H5Aget_name(attr, strlen(ATTR3_NAME), attr_name); - VERIFY(name_len, strlen(ATTR3_NAME), "H5Aget_name"); - strcpy(temp_name, ATTR3_NAME); /* make a copy of the name */ - temp_name[strlen(ATTR3_NAME) - 1] = '\0'; /* truncate it to match the one retrieved */ - if (strcmp(attr_name, temp_name) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, temp_name); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_mult_read() */ - -/**************************************************************** -** -** attr_op1(): Attribute operator -** -****************************************************************/ -static herr_t -attr_op1(hid_t H5_ATTR_UNUSED loc_id, const char *name, const H5A_info_t H5_ATTR_UNUSED *ainfo, void *op_data) -{ - int *count = (int *)op_data; - herr_t ret = 0; - - switch (*count) { - case 0: - if (strcmp(name, ATTR1_NAME) != 0) - TestErrPrintf("attribute name different: name=%s, should be %s\n", name, ATTR1_NAME); - (*count)++; - break; - - case 1: - if (strcmp(name, ATTR2_NAME) != 0) - TestErrPrintf("attribute name different: name=%s, should be %s\n", name, ATTR2_NAME); - (*count)++; - break; - - case 2: - if (strcmp(name, ATTR3_NAME) != 0) - TestErrPrintf("attribute name different: name=%s, should be %s\n", name, ATTR3_NAME); - (*count)++; - break; - - default: - ret = -1; - break; - } /* end switch() */ - - return (ret); -} /* end attr_op1() */ - -/**************************************************************** -** -** test_attr_iterate(): Test H5A (attribute) iterator code. -** -****************************************************************/ -static void -test_attr_iterate(hid_t fapl) -{ - hid_t file; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - int count; /* operator data for the iterator */ - H5O_info2_t oinfo; /* Object info */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Functions\n")); - - /* Open file */ - file = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(file, FAIL, "H5Fopen"); - - /* Create a dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a new dataset */ - dataset = H5Dcreate2(file, DSET2_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 0, "H5Oget_info3"); - - /* Iterate over attributes on dataset */ - count = 0; - ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, NULL, attr_op1, &count); - VERIFY(ret, 0, "H5Aiterate2"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open existing dataset w/attributes */ - dataset = H5Dopen2(file, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 3, "H5Oget_info3"); - - /* Iterate over attributes on dataset */ - count = 0; - ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, NULL, attr_op1, &count); - VERIFY(ret, 0, "H5Aiterate2"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_iterate() */ - -/**************************************************************** -** -** test_attr_delete(): Test H5A (attribute) code for deleting objects. -** -****************************************************************/ -static void -test_attr_delete(hid_t fapl) -{ - hid_t fid1; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t attr; /* Attribute ID */ - char attr_name[ATTR_NAME_LEN]; /* Buffer for attribute names */ - ssize_t name_len; /* Length of attribute name */ - H5O_info2_t oinfo; /* Object info */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Attribute Deletion Functions\n")); - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 3, "H5Oget_info3"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Try to delete bogus attribute */ - H5E_BEGIN_TRY - { - ret = H5Adelete(dataset, "Bogus"); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete"); - } - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 3, "H5Oget_info3"); - - /* Delete middle (2nd) attribute */ - ret = H5Adelete(dataset, ATTR2_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 2, "H5Oget_info3"); - - /* Open 1st attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR1_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR1_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR1_NAME); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open last (formally 3rd) attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)1, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR3_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR3_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR3_NAME); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete first attribute */ - ret = H5Adelete(dataset, ATTR1_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 1, "H5Oget_info3"); - - /* Open last (formally 3rd) attribute for the dataset */ - attr = - H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Name */ - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, attr_name); - VERIFY(name_len, strlen(ATTR3_NAME), "H5Aget_name"); - if (strcmp(attr_name, ATTR3_NAME) != 0) - TestErrPrintf("attribute name different: attr_name=%s, should be %s\n", attr_name, ATTR3_NAME); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete first attribute */ - ret = H5Adelete(dataset, ATTR3_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Verify the correct number of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, 0, "H5Oget_info3"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_delete() */ - -/**************************************************************** -** -** test_attr_dtype_shared(): Test H5A (attribute) code for using -** shared datatypes in attributes. -** -****************************************************************/ -static void -test_attr_dtype_shared(hid_t fapl) -{ - hid_t file_id; /* File ID */ - hid_t dset_id; /* Dataset ID */ - hid_t space_id; /* Dataspace ID for dataset & attribute */ - hid_t type_id; /* Datatype ID for named datatype */ - hid_t attr_id; /* Attribute ID */ - int data = 8; /* Data to write */ - int rdata = 0; /* Read read in */ - H5O_info2_t oinfo; /* Object's information */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Shared Datatypes with Attributes\n")); - - if ((vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES) && (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC)) { - /* Create a file */ - file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file_id, FAIL, "H5Fopen"); - - /* Close file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - - /* Re-open file */ - file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(file_id, FAIL, "H5Fopen"); - - /* Create a datatype to commit and use */ - type_id = H5Tcopy(H5T_NATIVE_INT); - CHECK(type_id, FAIL, "H5Tcopy"); - - /* Commit datatype to file */ - ret = H5Tcommit2(file_id, TYPE1_NAME, type_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "H5Oget_info_by_name3"); - - /* Create dataspace for dataset */ - space_id = H5Screate(H5S_SCALAR); - CHECK(space_id, FAIL, "H5Screate"); - - /* Create dataset */ - dset_id = H5Dcreate2(file_id, DSET1_NAME, type_id, space_id, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate2"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 2, "H5Oget_info_by_name3"); - - /* Create attribute on dataset */ - attr_id = H5Acreate2(dset_id, ATTR1_NAME, type_id, space_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate2"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 3, "H5Oget_info_by_name3"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete attribute */ - ret = H5Adelete(dset_id, ATTR1_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 2, "H5Oget_info_by_name3"); - - /* Create attribute on dataset */ - attr_id = H5Acreate2(dset_id, ATTR1_NAME, type_id, space_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate2"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 3, "H5Oget_info_by_name3"); - - /* Write data into the attribute */ - ret = H5Awrite(attr_id, H5T_NATIVE_INT, &data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataspace */ - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close datatype */ - ret = H5Tclose(type_id); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(file_id, FAIL, "H5Fopen"); - - /* Open dataset */ - dset_id = H5Dopen2(file_id, DSET1_NAME, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dopen2"); - - /* Open attribute */ - attr_id = H5Aopen(dset_id, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Aopen"); - - /* Read data from the attribute */ - ret = H5Aread(attr_id, H5T_NATIVE_INT, &rdata); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(data, rdata, "H5Aread"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 3, "H5Oget_info_by_name3"); - - /* Unlink the dataset */ - ret = H5Ldelete(file_id, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Check reference count on named datatype */ - ret = H5Oget_info_by_name3(file_id, TYPE1_NAME, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "H5Oget_info_by_name3"); - - /* Unlink the named datatype */ - ret = H5Ldelete(file_id, TYPE1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); -#endif - } -} /* test_attr_dtype_shared() */ - -/**************************************************************** -** -** test_attr_duplicate_ids(): Test operations with more than -** one ID handles. -** -****************************************************************/ -static void -test_attr_duplicate_ids(hid_t fapl) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t gid1, gid2; /* Group ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t attr, attr2; /* Attribute ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {ATTR1_DIM1}; - int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading 1st attribute */ - int rewrite_data[ATTR1_DIM1] = {1234, -423, 9907256}; /* Test data for rewrite */ - int i; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing operations with two ID handles\n")); - - /*----------------------------------------------------------------------------------- - * Create an attribute in a new file and fill it with fill value. - */ - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, DSET1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Create dataspace for attribute */ - sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Try to create an attribute on the dataset */ - attr = H5Acreate2(dataset, ATTR1_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Open the attribute just created and get a second ID */ - attr2 = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr2, FAIL, "H5Aopen"); - - /* Close attribute */ - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Reopen the file and verify the fill value for attribute. Also write - * some real data. - */ - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Open first attribute for the dataset */ - attr = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute with fill value */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (0 != read_data1[i]) - TestErrPrintf("%d: attribute data different: read_data1[%d]=%d\n", __LINE__, i, read_data1[i]); - - /* Open attribute for the second time */ - attr2 = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information */ - ret = H5Awrite(attr2, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Reopen the file and verify the data. Also rewrite the data and verify it. - */ - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Open first attribute for the dataset */ - attr = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Open attribute for the second time */ - attr2 = H5Aopen(dataset, ATTR1_NAME, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information */ - ret = H5Awrite(attr2, H5T_NATIVE_INT, rewrite_data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (read_data1[i] != rewrite_data[i]) - TestErrPrintf("%d: attribute data different: read_data1[%d]=%d, rewrite_data[%d]=%d\n", __LINE__, - i, read_data1[i], i, rewrite_data[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Verify that the attribute being pointed to by different paths shares - * the same data. - */ - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Create a group */ - gid1 = H5Gcreate2(fid1, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gcreate2"); - - /* Create hard link to the first group */ - ret = H5Lcreate_hard(gid1, GROUP1_NAME, H5L_SAME_LOC, GROUP2_NAME, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_hard"); - - /* Try to create an attribute on the group */ - attr = H5Acreate2(gid1, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Open the hard link just created */ - gid2 = H5Gopen2(fid1, GROUP2_NAME, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - - /* Open the attribute of the group for the second time */ - attr2 = H5Aopen(gid2, ATTR2_NAME, H5P_DEFAULT); - CHECK(attr2, FAIL, "H5Aopen"); - - /* Write attribute information with the first attribute handle */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the second attribute handle */ - ret = H5Aread(attr2, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close group */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close Attribute dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_duplicate_ids() */ - -/**************************************************************** -** -** test_attr_dense_verify(): Test basic H5A (attribute) code. -** Verify attributes on object -** -****************************************************************/ -static int -test_attr_dense_verify(hid_t loc_id, unsigned max_attr) -{ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - hid_t attr; /* Attribute ID */ - unsigned value; /* Attribute value */ - unsigned u; /* Local index variable */ - int old_nerrs; /* Number of errors when entering this check */ - herr_t ret; /* Generic return value */ - - /* Retrieve the current # of reported errors */ - old_nerrs = nerrors; - - /* Re-open all the attributes by name and verify the data */ - for (u = 0; u < max_attr; u++) { - /* Open attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Aopen(loc_id, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read data from the attribute */ - ret = H5Aread(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, u, "H5Aread"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Re-open all the attributes by index and verify the data */ - for (u = 0; u < max_attr; u++) { - ssize_t name_len; /* Length of attribute name */ - char check_name[ATTR_NAME_LEN]; /* Buffer for checking attribute names */ - - /* Open attribute */ - attr = H5Aopen_by_idx(loc_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen_by_idx"); - - /* Verify Name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - name_len = H5Aget_name(attr, (size_t)ATTR_NAME_LEN, check_name); - VERIFY(name_len, strlen(attrname), "H5Aget_name"); - if (strcmp(check_name, attrname) != 0) - TestErrPrintf("attribute name different: attrname = '%s', should be '%s'\n", check_name, - attrname); - - /* Read data from the attribute */ - ret = H5Aread(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, u, "H5Aread"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Retrieve current # of errors */ - if (old_nerrs == nerrors) - return (0); - else - return (-1); -} /* test_attr_dense_verify() */ - -/**************************************************************** -** -** test_attr_dense_create(): Test basic H5A (attribute) code. -** Tests "dense" attribute storage creation -** -****************************************************************/ -static void -test_attr_dense_create(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dense Attribute Storage Creation\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until just before converting to dense storage */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add one more attribute, to push into "dense" storage */ - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) { - /* Attempt to add attribute again, which should fail */ - H5E_BEGIN_TRY - { - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(attr, FAIL, "H5Acreate2"); - } - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_create() */ - -/**************************************************************** -** -** test_attr_dense_open(): Test basic H5A (attribute) code. -** Tests opening attributes in "dense" storage -** -****************************************************************/ -static void -test_attr_dense_open(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Opening Attributes in Dense Storage\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Enable creation order tracking on attributes, so creation order tests work */ - ret = H5Pset_attr_creation_order(dcpl, H5P_CRT_ORDER_TRACKED); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until just before converting to dense storage */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify attributes written so far */ - ret = test_attr_dense_verify(dataset, u); - CHECK(ret, FAIL, "test_attr_dense_verify"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add one more attribute, to push into "dense" storage */ - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Verify all the attributes written */ - ret = test_attr_dense_verify(dataset, (u + 1)); - CHECK(ret, FAIL, "test_attr_dense_verify"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_open() */ - -/**************************************************************** -** -** test_attr_dense_delete(): Test basic H5A (attribute) code. -** Tests deleting attributes in "dense" storage -** -****************************************************************/ -static void -test_attr_dense_delete(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - H5O_info2_t oinfo; /* Object info */ - int use_min_dset_oh = (dcpl_g != H5P_DEFAULT); - herr_t ret; /* Generic return value */ - - /* Only run this test for sec2/default driver */ - if (!h5_using_default_driver(NULL)) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deleting Attributes in Dense Storage\n")); - - if (use_min_dset_oh) { /* using minimized dataset headers */ - /* modify fcpl... - * sidestep "bug" where file space is lost with minimized dset ohdrs - */ - fcpl = H5Pcopy(fcpl); - CHECK(fcpl, FAIL, "H5Pcopy"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, true, 1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - } - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - if (use_min_dset_oh) - CHECK(H5Pclose(fcpl), FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (use_min_dset_oh) { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - else { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - - /* Enable creation order tracking on attributes, so creation order tests work */ - ret = H5Pset_attr_creation_order(dcpl, H5P_CRT_ORDER_TRACKED); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until well into dense storage */ - for (u = 0; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check # of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info3"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Delete attributes until the attributes revert to compact storage again */ - for (u--; u >= min_dense; u--) { - /* Delete attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); - - /* Verify attributes still left */ - ret = test_attr_dense_verify(dataset, u); - CHECK(ret, FAIL, "test_attr_dense_verify"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Delete one more attribute, which should cause reversion to compact storage */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Verify attributes still left */ - ret = test_attr_dense_verify(dataset, (u - 1)); - CHECK(ret, FAIL, "test_attr_dense_verify"); - - /* Delete another attribute, to verify deletion in compact storage */ - snprintf(attrname, sizeof(attrname), "attr %02u", (u - 1)); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Verify attributes still left */ - ret = test_attr_dense_verify(dataset, (u - 2)); - CHECK(ret, FAIL, "test_attr_dense_verify"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_delete() */ - -/**************************************************************** -** -** test_attr_dense_rename(): Test basic H5A (attribute) code. -** Tests renaming attributes in "dense" storage -** -****************************************************************/ -static void -test_attr_dense_rename(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - char new_attrname[NAME_BUF_SIZE]; /* New name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - H5O_info2_t oinfo; /* Object info */ - unsigned u; /* Local index variable */ - int use_min_dset_oh = (dcpl_g != H5P_DEFAULT); - unsigned use_corder; /* Track creation order or not */ - herr_t ret; /* Generic return value */ - - /* Only run this test for sec2/default driver */ - if (!h5_using_default_driver(NULL)) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Renaming Attributes in Dense Storage\n")); - - if (use_min_dset_oh) { /* using minimized dataset headers */ - /* modify fcpl... - * sidestep "bug" where file space is lost with minimized dset ohdrs - */ - fcpl = H5Pcopy(fcpl); - CHECK(fcpl, FAIL, "H5Pcopy"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, true, 1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - } - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - if (use_min_dset_oh) - CHECK(H5Pclose(fcpl), FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, H5I_INVALID_HID, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (use_min_dset_oh) { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcopy"); - } - else { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcreate"); - } - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Using creation order or not */ - for (use_corder = false; use_corder <= true; use_corder++) { - - if (use_corder) { - ret = H5Pset_attr_creation_order(dcpl, H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until well into dense storage */ - for (u = 0; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Rename attribute */ - snprintf(new_attrname, sizeof(new_attrname), "new attr %02u", u); - - /* Rename attribute */ - ret = H5Arename_by_name(fid, DSET1_NAME, attrname, new_attrname, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Arename_by_name"); - - /* Check # of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info3"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - if (!use_corder) { - /* Unlink dataset with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } - - } /* end for use_corder */ - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fopen"); - - /* Open dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - /* Verify renamed attributes */ - for (u = 0; u < (max_compact * 2); u++) { - unsigned value; /* Attribute value */ - - /* Open attribute */ - snprintf(attrname, sizeof(attrname), "new attr %02u", u); - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Aopen"); - - /* Read data from the attribute */ - ret = H5Aread(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, u, "H5Aread"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_rename() */ - -/**************************************************************** -** -** test_attr_dense_unlink(): Test basic H5A (attribute) code. -** Tests unlinking object with attributes in "dense" storage -** -****************************************************************/ -static void -test_attr_dense_unlink(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - size_t mesg_count; /* # of shared messages */ - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - H5O_info2_t oinfo; /* Object info */ - unsigned u; /* Local index variable */ - int use_min_dset_oh = (dcpl_g != H5P_DEFAULT); - herr_t ret; /* Generic return value */ - - /* Only run this test for sec2/default driver */ - if (!h5_using_default_driver(NULL)) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Unlinking Object with Attributes in Dense Storage\n")); - - if (use_min_dset_oh) { /* using minimized dataset headers */ - /* modify fcpl... - * sidestep "bug" where file space is lost with minimized dset ohdrs - */ - fcpl = H5Pcopy(fcpl); - CHECK(fcpl, FAIL, "H5Pcopy"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, true, 1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - } - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - if (use_min_dset_oh) - CHECK(H5Pclose(fcpl), FAIL, "H5Pclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (use_min_dset_oh) { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - else { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until well into dense storage */ - for (u = 0; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check # of attributes */ - ret = H5Oget_info3(dataset, &oinfo, H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info3"); - VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info3"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Unlink dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); -#if 0 - /* Check on dataset's attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); -#endif - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_unlink() */ - -/**************************************************************** -** -** test_attr_dense_limits(): Test basic H5A (attribute) code. -** Tests attribute in "dense" storage limits -** -****************************************************************/ -static void -test_attr_dense_limits(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact, rmax_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense, rmin_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Phase Change Limits For Attributes in Dense Storage\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Change limits on compact/dense attribute storage */ - max_compact = 0; - min_dense = 0; - ret = H5Pset_attr_phase_change(dcpl, max_compact, min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &rmax_compact, &rmin_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(rmax_compact, max_compact, "H5Pget_attr_phase_change"); - VERIFY(rmin_dense, min_dense, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Add first attribute, which should be immediately in dense storage */ - - /* Create attribute */ - u = 0; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Add second attribute, to allow deletions to be checked easily */ - - /* Create attribute */ - u = 1; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Delete second attribute, attributes should still be stored densely */ - - /* Delete attribute */ - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Delete first attribute, attributes should not be stored densely */ - - /* Delete attribute */ - u = 0; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_dense_limits() */ - -/**************************************************************** -** -** test_attr_dense_dup_ids(): Test operations with multiple ID -** handles with "dense" attribute storage creation -** -****************************************************************/ -static void -test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t gid1, gid2; /* Group ID */ - hid_t sid, sid2; /* Dataspace ID */ - hid_t attr, attr2, add_attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - hsize_t dims[] = {ATTR1_DIM1}; - int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading attribute */ - int rewrite_data[ATTR1_DIM1] = {1234, -423, 9907256}; /* Test data for rewrite */ - unsigned scalar_data = 1317; /* scalar data for attribute */ - unsigned read_scalar; /* variable for reading attribute*/ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u, i; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing operations with two IDs for Dense Storage\n")); - - /*----------------------------------------------------------------------------------- - * Create an attribute in dense storage and fill it with fill value. - */ - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* need DCPL to query the group creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes, until just before converting to dense storage */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add one more attribute, to push into "dense" storage */ - /* Create dataspace for attribute */ - sid2 = H5Screate_simple(ATTR1_RANK, dims, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open the attribute just created and get a second ID */ - attr2 = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr2, FAIL, "H5Aopen"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Reopen the file and verify the fill value for attribute. Also write - * some real data. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open first attribute for the dataset */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute with fill value */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (0 != read_data1[i]) - TestErrPrintf("%d: attribute data different: read_data1[%d]=%d\n", __LINE__, i, read_data1[i]); - - /* Open attribute for the second time */ - attr2 = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information */ - ret = H5Awrite(attr2, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Reopen the file and verify the data. Also rewrite the data and verify it. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open first attribute for the dataset */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Read attribute information */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Open attribute for the second time */ - attr2 = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information with the second ID */ - ret = H5Awrite(attr2, H5T_NATIVE_INT, rewrite_data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the first ID */ - ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (read_data1[i] != rewrite_data[i]) - TestErrPrintf("%d: attribute data different: read_data1[%d]=%d, rewrite_data[%d]=%d\n", __LINE__, - i, read_data1[i], i, rewrite_data[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Open the attribute by index. Verify the data is shared when the attribute - * is opened twice. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open first attribute for the dataset */ - attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)4, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Open attribute for the second time */ - attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)4, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information with the second ID */ - ret = H5Awrite(attr2, H5T_NATIVE_UINT, &scalar_data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the first ID */ - ret = H5Aread(attr, H5T_NATIVE_INT, &read_scalar); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - if (read_scalar != scalar_data) - TestErrPrintf("%d: attribute data different: read_scalar=%d, scalar_data=%d\n", __LINE__, read_scalar, - scalar_data); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Open one attribute. As it remains open, delete some attributes. The - * attribute storage should switch from dense to compact. Then open the - * same attribute for the second time and verify that the attribute data - * is shared. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open attribute of the dataset for the first time */ - attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Delete a few attributes until the storage switches to compact */ - for (u = max_compact; u >= min_dense - 1; u--) { - ret = H5Adelete_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)u, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); - } -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Open attribute for the second time */ - attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information with the second ID */ - ret = H5Awrite(attr2, H5T_NATIVE_UINT, &scalar_data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the first ID */ - ret = H5Aread(attr, H5T_NATIVE_INT, &read_scalar); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - if (read_scalar != scalar_data) - TestErrPrintf("%d: attribute data different: read_scalar=%d, scalar_data=%d\n", __LINE__, read_scalar, - scalar_data); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Open one attribute. As it remains open, create some attributes. The - * attribute storage should switch from compact to dense. Then open the - * same attribute for the second time and verify that the attribute data - * is shared. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Open attribute of the dataset for the first time */ - attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)3, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Delete a few attributes until the storage switches to compact */ - for (u = min_dense - 1; u <= max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - add_attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(add_attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(add_attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(add_attr); - CHECK(ret, FAIL, "H5Aclose"); - } -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open attribute for the second time */ - attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)3, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Write attribute information with the second ID */ - ret = H5Awrite(attr2, H5T_NATIVE_UINT, &scalar_data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the first ID */ - ret = H5Aread(attr, H5T_NATIVE_INT, &read_scalar); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - if (read_scalar != scalar_data) - TestErrPrintf("%d: attribute data different: read_scalar=%d, scalar_data=%d\n", __LINE__, read_scalar, - scalar_data); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*----------------------------------------------------------------------------------- - * Verify that the attribute being pointed to by different paths shares - * the same data. - */ - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create a group */ - gid1 = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gcreate2"); - - /* Create hard link to the first group */ - ret = H5Lcreate_hard(gid1, GROUP1_NAME, H5L_SAME_LOC, GROUP2_NAME, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_hard"); - - /* Add attributes, until just before converting to dense storage */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(gid1, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Try to create another attribute to make dense storage */ - attr = H5Acreate2(gid1, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check on group's attribute storage status */ - is_dense = H5O__is_attr_dense_test(gid1); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Open the hard link just created */ - gid2 = H5Gopen2(fid, GROUP2_NAME, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - - /* Open the attribute of the group for the second time */ - attr2 = H5Aopen(gid2, ATTR2_NAME, H5P_DEFAULT); - CHECK(attr2, FAIL, "H5Aopen"); - - /* Write attribute information with the first attribute handle */ - ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data1); - CHECK(ret, FAIL, "H5Awrite"); - - /* Read attribute information with the second attribute handle */ - ret = H5Aread(attr2, H5T_NATIVE_INT, read_data1); - CHECK(ret, FAIL, "H5Aread"); - - /* Verify values read in */ - for (i = 0; i < ATTR1_DIM1; i++) - if (attr_data1[i] != read_data1[i]) - TestErrPrintf("%d: attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n", __LINE__, i, - attr_data1[i], i, read_data1[i]); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(attr2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close group */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close Attribute dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_dense_dup_ids() */ - -/**************************************************************** -** -** test_attr_big(): Test basic H5A (attribute) code. -** Tests storing "big" attribute in dense storage immediately, if available -** -****************************************************************/ -static void -test_attr_big(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t big_sid; /* "Big" dataspace ID */ - hsize_t dims[ATTR6_RANK] = {ATTR6_DIM1, ATTR6_DIM2, ATTR6_DIM3}; /* Attribute dimensions */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ - unsigned nshared_indices; /* # of shared message indices */ - H5F_libver_t low, high; /* File format bounds */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ -#endif - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Storing 'Big' Attributes in Dense Storage\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset & "small" attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "big" dataspace for "big" attributes */ - big_sid = H5Screate_simple(ATTR6_RANK, dims, NULL); - CHECK(big_sid, FAIL, "H5Screate_simple"); - - /* need DCPL to query the group creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Retrieve # of shared message indices (ie. whether attributes are shared or not) */ - ret = H5Pget_shared_mesg_nindexes(fcpl, &nshared_indices); - CHECK(ret, FAIL, "H5Pget_shared_mesg_nindexes"); - - /* Retrieve the format bounds for creating objects in the file */ - ret = H5Pget_libver_bounds(fapl, &low, &high); - CHECK(ret, FAIL, "H5Pget_libver_bounds"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Add first "small" attribute, which should be in compact storage */ - - /* Create attribute */ - u = 0; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Add second "small" attribute, which should stay in compact storage */ - - /* Create attribute */ - u = 1; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Add first "big" attribute, which should push storage into dense form */ - - /* Create attribute */ - u = 2; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, big_sid, H5P_DEFAULT, H5P_DEFAULT); - if (low == H5F_LIBVER_LATEST || attr >= 0) { - CHECK(attr, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check on dataset's attribute storage status */ - /* (when attributes are shared, the "big" attribute goes into the shared - * message heap instead of forcing the attribute storage into the dense - * form - QAK) - */ -#if 0 - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); -#endif - - /* Add second "big" attribute, which should leave storage in dense form */ - - /* Create attribute */ - u = 3; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check on dataset's attribute storage status */ - /* (when attributes are shared, the "big" attribute goes into the shared - * message heap instead of forcing the attribute storage into the dense - * form - QAK) - */ -#if 0 - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); -#endif - - /* Delete second "small" attribute, attributes should still be stored densely */ - - /* Delete attribute */ - u = 1; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); -#endif - - /* Delete second "big" attribute, attributes should still be stored densely */ - - /* Delete attribute */ - u = 3; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); -#endif - - /* Delete first "big" attribute, attributes should _not_ be stored densely */ - - /* Delete attribute */ - u = 2; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Delete first "small" attribute, should be no attributes now */ - - /* Delete attribute */ - u = 0; - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); -#endif - } /* end if */ -#if 0 - else { - /* Shouldn't be able to create "big" attributes with older version of format */ - VERIFY(attr, FAIL, "H5Acreate2"); - - /* Check on dataset's attribute storage status */ - /* (when attributes are shared, the "big" attribute goes into the shared - * message heap instead of forcing the attribute storage into the dense - * form - QAK) - */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - } /* end else */ -#endif - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(big_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_big() */ - -/**************************************************************** -** -** test_attr_null_space(): Test basic H5A (attribute) code. -** Tests storing attribute with "null" dataspace -** -****************************************************************/ -static void -test_attr_null_space(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t null_sid; /* "null" dataspace ID */ - hid_t attr_sid; /* Attribute's dataspace ID */ - hid_t attr; /* Attribute ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned value; /* Attribute value */ - htri_t cmp; /* Results of comparison */ -#if 0 - hsize_t storage_size; /* Size of storage for attribute */ -#endif - H5A_info_t ainfo; /* Attribute info */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Storing Attributes with 'null' dataspace\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create dataspace for dataset attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "null" dataspace for attribute */ - null_sid = H5Screate(H5S_NULL); - CHECK(null_sid, FAIL, "H5Screate"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Add attribute with 'null' dataspace */ - - /* Create attribute */ - strcpy(attrname, "null attr"); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, null_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Try to read data from the attribute */ - /* (shouldn't fail, but should leave buffer alone) */ - value = 23; - ret = H5Aread(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, 23, "H5Aread"); - - /* Get the dataspace for the attribute and make certain it's 'null' */ - attr_sid = H5Aget_space(attr); - CHECK(attr_sid, FAIL, "H5Aget_space"); - - /* Compare the dataspaces */ - cmp = H5Sextent_equal(attr_sid, null_sid); - CHECK(cmp, FAIL, "H5Sextent_equal"); - VERIFY(cmp, true, "H5Sextent_equal"); - - /* Close dataspace */ - ret = H5Sclose(attr_sid); - CHECK(ret, FAIL, "H5Sclose"); -#if 0 - /* Check the storage size for the attribute */ - storage_size = H5Aget_storage_size(attr); - VERIFY(storage_size, 0, "H5Aget_storage_size"); -#endif - /* Get the attribute info */ - ret = H5Aget_info(attr, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); -#if 0 - VERIFY(ainfo.data_size, storage_size, "H5Aget_info"); -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Add another attribute with 'null' dataspace */ - - /* Create attribute */ - strcpy(attrname, "null attr #2"); - attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, null_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Try to write data to the attribute */ - /* (shouldn't fail, but should leave buffer alone) */ - value = 23; - ret = H5Awrite(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Awrite"); - VERIFY(value, 23, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file and check on the attributes */ - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Open first attribute */ - strcpy(attrname, "null attr #2"); - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Try to read data from the attribute */ - /* (shouldn't fail, but should leave buffer alone) */ - value = 23; - ret = H5Aread(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, 23, "H5Aread"); - - /* Get the dataspace for the attribute and make certain it's 'null' */ - attr_sid = H5Aget_space(attr); - CHECK(attr_sid, FAIL, "H5Aget_space"); - - /* Compare the dataspaces */ - cmp = H5Sextent_equal(attr_sid, null_sid); - CHECK(cmp, FAIL, "H5Sextent_equal"); - VERIFY(cmp, true, "H5Sextent_equal"); - - /* Close dataspace */ - ret = H5Sclose(attr_sid); - CHECK(ret, FAIL, "H5Sclose"); -#if 0 - /* Check the storage size for the attribute */ - storage_size = H5Aget_storage_size(attr); - VERIFY(storage_size, 0, "H5Aget_storage_size"); -#endif - /* Get the attribute info */ - ret = H5Aget_info(attr, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); -#if 0 - VERIFY(ainfo.data_size, storage_size, "H5Aget_info"); -#endif - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open second attribute */ - strcpy(attrname, "null attr"); - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Try to write data to the attribute */ - /* (shouldn't fail, but should leave buffer alone) */ - value = 23; - ret = H5Awrite(attr, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Awrite"); - VERIFY(value, 23, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(null_sid); - CHECK(ret, FAIL, "H5Sclose"); - -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif -} /* test_attr_null_space() */ - -/**************************************************************** -** -** test_attr_deprec(): Test basic H5A (attribute) code. -** Tests deprecated API routines -** -****************************************************************/ -static void -test_attr_deprec(hid_t fcpl, hid_t fapl) -{ -#ifndef H5_NO_DEPRECATED_SYMBOLS - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deprecated Attribute Routines\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Add attribute to dataset */ - - /* Create attribute */ - attr = H5Acreate1(dataset, "attr", H5T_NATIVE_UINT, sid, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate1"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataspaces */ - ret = H5Sclose(sid); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file and operate on the attribute */ - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open dataset */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - -#if 0 - /* Get number of attributes with bad ID */ - H5E_BEGIN_TRY - { - ret = H5Aget_num_attrs((hid_t)-1); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_num_attrs"); - - /* Get number of attributes */ - ret = H5Aget_num_attrs(dataset); - VERIFY(ret, 1, "H5Aget_num_attrs"); -#endif - /* Open the attribute by index */ - attr = H5Aopen_idx(dataset, 0); - CHECK(attr, FAIL, "H5Aopen_idx"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the attribute by name */ - attr = H5Aopen_name(dataset, "attr"); - CHECK(attr, FAIL, "H5Aopen_name"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#else /* H5_NO_DEPRECATED_SYMBOLS */ - /* Shut compiler up */ - (void)fcpl; - (void)fapl; - - /* Output message about test being skipped */ - MESSAGE(5, ("Skipping Test On Deprecated Attribute Routines\n")); - -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -} /* test_attr_deprec() */ - -/**************************************************************** -** -** test_attr_many(): Test basic H5A (attribute) code. -** Tests storing lots of attributes -** -****************************************************************/ -static void -test_attr_many(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t gid; /* Group ID */ - hid_t sid; /* Dataspace ID */ - hid_t aid; /* Attribute ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned nattr = (new_format ? NATTR_MANY_NEW : NATTR_MANY_OLD); /* Number of attributes */ - htri_t exists; /* Whether the attribute exists or not */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Storing Many Attributes\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataspace for attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create group for attributes */ - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create many attributes */ - for (u = 0; u < nattr; u++) { - snprintf(attrname, sizeof(attrname), "a-%06u", u); - - exists = H5Aexists(gid, attrname); - VERIFY(exists, false, "H5Aexists"); - - exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); - VERIFY(exists, false, "H5Aexists_by_name"); - - aid = H5Acreate2(gid, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - exists = H5Aexists(gid, attrname); - VERIFY(exists, true, "H5Aexists"); - - exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); - VERIFY(exists, true, "H5Aexists_by_name"); - - ret = H5Awrite(aid, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - exists = H5Aexists(gid, attrname); - VERIFY(exists, true, "H5Aexists"); - - exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); - VERIFY(exists, true, "H5Aexists_by_name"); - } /* end for */ - - /* Close group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file and check on the attributes */ - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open group */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Verify attributes */ - for (u = 0; u < nattr; u++) { - unsigned value; /* Attribute value */ - - snprintf(attrname, sizeof(attrname), "a-%06u", u); - - exists = H5Aexists(gid, attrname); - VERIFY(exists, true, "H5Aexists"); - - exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); - VERIFY(exists, true, "H5Aexists_by_name"); - - aid = H5Aopen(gid, attrname, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Aopen"); - - exists = H5Aexists(gid, attrname); - VERIFY(exists, true, "H5Aexists"); - - exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); - VERIFY(exists, true, "H5Aexists_by_name"); - - ret = H5Aread(aid, H5T_NATIVE_UINT, &value); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(value, u, "H5Aread"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_many() */ - -/**************************************************************** -** -** test_attr_corder_create_empty(): Test basic H5A (attribute) code. -** Tests basic code to create objects with attribute creation order info -** -****************************************************************/ -static void -test_attr_corder_create_basic(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned crt_order_flags; /* Creation order flags */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Code for Attributes with Creation Order Info\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } -#if 0 - /* Get creation order indexing on object */ - ret = H5Pget_attr_creation_order(dcpl, &crt_order_flags); - CHECK(ret, FAIL, "H5Pget_attr_creation_order"); - VERIFY(crt_order_flags, 0, "H5Pget_attr_creation_order"); -#endif - /* Setting invalid combination of a attribute order creation order indexing on should fail */ - H5E_BEGIN_TRY - { - ret = H5Pset_attr_creation_order(dcpl, H5P_CRT_ORDER_INDEXED); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_attr_creation_order"); - -#if 0 - ret = H5Pget_attr_creation_order(dcpl, &crt_order_flags); - CHECK(ret, FAIL, "H5Pget_attr_creation_order"); - VERIFY(crt_order_flags, 0, "H5Pget_attr_creation_order"); -#endif - - /* Set attribute creation order tracking & indexing for object */ - ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - ret = H5Pget_attr_creation_order(dcpl, &crt_order_flags); - CHECK(ret, FAIL, "H5Pget_attr_creation_order"); - VERIFY(crt_order_flags, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED), "H5Pget_attr_creation_order"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open dataset created */ - dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - /* Retrieve dataset creation property list for group */ - dcpl = H5Dget_create_plist(dataset); - CHECK(dcpl, FAIL, "H5Dget_create_plist"); - - /* Query the attribute creation properties */ - ret = H5Pget_attr_creation_order(dcpl, &crt_order_flags); - CHECK(ret, FAIL, "H5Pget_attr_creation_order"); - VERIFY(crt_order_flags, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED), "H5Pget_attr_creation_order"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_corder_create_basic() */ - -/**************************************************************** -** -** test_attr_corder_create_compact(): Test basic H5A (attribute) code. -** Tests compact attribute storage on objects with attribute creation order info -** -****************************************************************/ -static void -test_attr_corder_create_compact(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ -#endif - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Compact Storage of Attributes with Creation Order Info\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Set attribute creation order tracking & indexing for object */ - ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Create several attributes, but keep storage in compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open datasets created */ - dset1 = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dopen2"); - dset2 = H5Dopen2(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dopen2"); - dset3 = H5Dopen2(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dopen2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Loop through attributes, checking their creation order values */ - /* (the name index is used, but the creation order value is in the same order) */ - for (u = 0; u < max_compact; u++) { - H5A_info_t ainfo; /* Attribute information */ - - /* Retrieve information for attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Aget_info_by_name(my_dataset, ".", attrname, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - - /* Verify creation order of attribute */ - VERIFY(ainfo.corder_valid, true, "H5Aget_info_by_name"); - VERIFY(ainfo.corder, u, "H5Aget_info_by_name"); - } /* end for */ - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_corder_create_compact() */ - -/**************************************************************** -** -** test_attr_corder_create_dense(): Test basic H5A (attribute) code. -** Tests dense attribute storage on objects with attribute creation order info -** -****************************************************************/ -static void -test_attr_corder_create_dense(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dense Storage of Attributes with Creation Order Info\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Set attribute creation order tracking & indexing for object */ - ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Create several attributes, but keep storage in compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Create another attribute, to push into dense storage */ - snprintf(attrname, sizeof(attrname), "attr %02u", max_compact); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open datasets created */ - dset1 = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dopen2"); - dset2 = H5Dopen2(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dopen2"); - dset3 = H5Dopen2(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dopen2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Loop through attributes, checking their creation order values */ - /* (the name index is used, but the creation order value is in the same order) */ - for (u = 0; u < (max_compact + 1); u++) { - H5A_info_t ainfo; /* Attribute information */ - - /* Retrieve information for attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Aget_info_by_name(my_dataset, ".", attrname, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - - /* Verify creation order of attribute */ - VERIFY(ainfo.corder_valid, true, "H5Aget_info_by_name"); - VERIFY(ainfo.corder, u, "H5Aget_info_by_name"); - } /* end for */ - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_corder_create_dense() */ - -/**************************************************************** -** -** test_attr_corder_create_reopen(): Test basic H5A (attribute) code. -** Test creating attributes w/reopening file from using new format -** to using old format -** -****************************************************************/ -static void -test_attr_corder_create_reopen(hid_t fcpl, hid_t fapl) -{ - hid_t fid = -1; /* File ID */ - hid_t gcpl_id = -1; /* Group creation property list ID */ - hid_t gid = -1; /* Group ID */ - hid_t sid = -1; /* Dataspace ID */ - hid_t aid = -1; /* Attribute ID */ - int buf; /* Attribute data */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Creating Attributes w/New & Old Format\n")); - - /* Create dataspace for attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create group */ - gcpl_id = H5Pcreate(H5P_GROUP_CREATE); - CHECK(gcpl_id, FAIL, "H5Pcreate"); - ret = H5Pset_attr_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, gcpl_id, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create a couple of attributes */ - aid = H5Acreate2(gid, "attr-003", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - buf = 3; - ret = H5Awrite(aid, H5T_NATIVE_INT, &buf); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - aid = H5Acreate2(gid, "attr-004", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - buf = 4; - ret = H5Awrite(aid, H5T_NATIVE_INT, &buf); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /***** Close group & GCPL *****/ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Pclose(gcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file, without "use the latest format" flag */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open group */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Delete attribute */ - ret = H5Adelete(gid, "attr-003"); - CHECK(aid, FAIL, "H5Adelete"); - - /* Create some additional attributes */ - aid = H5Acreate2(gid, "attr-008", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - buf = 8; - ret = H5Awrite(aid, H5T_NATIVE_INT, &buf); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - aid = H5Acreate2(gid, "attr-006", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - buf = 6; - ret = H5Awrite(aid, H5T_NATIVE_INT, &buf); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /***** Close group *****/ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close attribute dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_corder_create_reopen() */ - -/**************************************************************** -** -** test_attr_corder_transition(): Test basic H5A (attribute) code. -** Tests attribute storage transitions on objects with attribute creation order info -** -****************************************************************/ -static void -test_attr_corder_transition(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Storage Transitions of Attributes with Creation Order Info\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Set attribute creation order tracking & indexing for object */ - ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* XXX: Try to find a way to resize dataset's object header so that the object - * header can have one chunk, then retrieve "empty" file size and check - * that size after everything is deleted -QAK - */ - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open datasets created */ - dset1 = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dopen2"); - dset2 = H5Dopen2(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dopen2"); - dset3 = H5Dopen2(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dopen2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create several attributes, but keep storage in compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Create another attribute, to push into dense storage */ - snprintf(attrname, sizeof(attrname), "attr %02u", max_compact); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - /* Delete several attributes from object, until attribute storage resumes compact form */ - for (u = max_compact; u >= min_dense; u--) { - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, u, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - } /* end for */ - - /* Delete another attribute, to push attribute storage into compact form */ - snprintf(attrname, sizeof(attrname), "attr %02u", (min_dense - 1)); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (min_dense - 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Re-add attributes to get back into dense form */ - for (u = (min_dense - 1); u < (max_compact + 1); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open datasets created */ - dset1 = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dopen2"); - dset2 = H5Dopen2(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dopen2"); - dset3 = H5Dopen2(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dopen2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - /* Delete several attributes from object, until attribute storage resumes compact form */ - for (u = max_compact; u >= min_dense; u--) { - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, u, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - } /* end for */ - - /* Delete another attribute, to push attribute storage into compact form */ - snprintf(attrname, sizeof(attrname), "attr %02u", (min_dense - 1)); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (min_dense - 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Re-add attributes to get back into dense form */ - for (u = (min_dense - 1); u < (max_compact + 1); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - /* Delete all attributes */ - for (u = max_compact; u > 0; u--) { - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); - } /* end for */ - snprintf(attrname, sizeof(attrname), "attr %02u", 0); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_corder_transition() */ - -/**************************************************************** -** -** test_attr_corder_delete(): Test basic H5A (attribute) code. -** Tests deleting object w/dense attribute storage on objects with attribute creation order info -** -****************************************************************/ -static void -test_attr_corder_delete(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - unsigned reopen_file; /* Whether to re-open the file before deleting group */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ -#ifdef LATER - h5_stat_size_t empty_size; /* Size of empty file */ - h5_stat_size_t file_size; /* Size of file after operating on it */ -#endif /* LATER */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deleting Object w/Dense Attribute Storage and Creation Order Info\n")); - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Set attribute creation order tracking & indexing for object */ - ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - -/* XXX: Try to find a way to resize dataset's object header so that the object - * header can have one chunk, then retrieve "empty" file size and check - * that size after everything is deleted -QAK - */ -#ifdef LATER - /* Create empty file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Get the size of an empty file */ - empty_size = h5_get_file_size(FILENAME); - CHECK(empty_size, FAIL, "h5_get_file_size"); -#endif /* LATER */ - - /* Loop to leave file open when deleting dataset, or to close & re-open file - * before deleting dataset */ - for (reopen_file = false; reopen_file <= true; reopen_file++) { - /* Create test file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Create attributes, until attribute storage is in dense form */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); -#endif - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Check for deleting datasets without re-opening file */ - if (!reopen_file) { - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Check for deleting dataset after re-opening file */ - if (reopen_file) { - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Delete the datasets */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET3_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end if */ - -#ifdef LATER - /* Get the size of the file now */ - file_size = h5_get_file_size(FILENAME); - CHECK(file_size, FAIL, "h5_get_file_size"); - VERIFY(file_size, empty_size, "h5_get_file_size"); -#endif /* LATER */ - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_corder_delete() */ - -/*------------------------------------------------------------------------- - * Function: attr_info_by_idx_check - * - * Purpose: Support routine for attr_info_by_idx, to verify the attribute - * info is correct for a attribute - * - * Note: This routine assumes that the attributes have been added to the - * object in alphabetical order. - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -static int -attr_info_by_idx_check(hid_t obj_id, const char *attrname, hsize_t n, bool use_index) -{ - char tmpname[NAME_BUF_SIZE]; /* Temporary attribute name */ - H5A_info_t ainfo; /* Attribute info struct */ - int old_nerrs; /* Number of errors when entering this check */ - herr_t ret; /* Generic return value */ - - /* Retrieve the current # of reported errors */ - old_nerrs = nerrors; - - /* Verify the information for first attribute, in increasing creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); - - /* Verify the information for new attribute, in increasing creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, n, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); - - /* Verify the name for new link, in increasing creation order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, n, tmpname, - (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_name_by_idx"); - if (strcmp(attrname, tmpname) != 0) - TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__); - - /* Don't test "native" order if there is no creation order index, since - * there's not a good way to easily predict the attribute's order in the name - * index. - */ - if (use_index) { - /* Verify the information for first attribute, in native creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC /* H5_ITER_NATIVE */, - (hsize_t)0, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); - - /* Verify the information for new attribute, in native creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC /* H5_ITER_NATIVE */, n, &ainfo, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); - - /* Verify the name for new link, in increasing native order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC /* H5_ITER_NATIVE */, n, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_name_by_idx"); - if (strcmp(attrname, tmpname) != 0) - TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__); - } /* end if */ - - /* Verify the information for first attribute, in decreasing creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, n, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); - - /* Verify the information for new attribute, in increasing creation order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)0, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); - - /* Verify the name for new link, in increasing creation order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)0, tmpname, - (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_name_by_idx"); - if (strcmp(attrname, tmpname) != 0) - TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__); - - /* Verify the information for first attribute, in increasing name order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)0, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); - - /* Verify the information for new attribute, in increasing name order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_INC, n, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); - - /* Verify the name for new link, in increasing name order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_INC, n, tmpname, - (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_name_by_idx"); - if (strcmp(attrname, tmpname) != 0) - TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__); - - /* Don't test "native" order queries on link name order, since there's not - * a good way to easily predict the order of the links in the name index. - */ - - /* Verify the information for first attribute, in decreasing name order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_DEC, n, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); - - /* Verify the information for new attribute, in increasing name order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_DEC, (hsize_t)0, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_idx"); - VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); - - /* Verify the name for new link, in increasing name order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_DEC, (hsize_t)0, tmpname, - (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_name_by_idx"); - if (strcmp(attrname, tmpname) != 0) - TestErrPrintf("Line %d: attribute name size wrong!\n", __LINE__); - - /* Retrieve current # of errors */ - if (old_nerrs == nerrors) - return (0); - else - return (-1); -} /* end attr_info_by_idx_check() */ - -/**************************************************************** -** -** test_attr_info_by_idx(): Test basic H5A (attribute) code. -** Tests querying attribute info by index -** -****************************************************************/ -static void -test_attr_info_by_idx(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - H5A_info_t ainfo; /* Attribute information */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - unsigned use_index; /* Use index on creation order values */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - char tmpname[NAME_BUF_SIZE]; /* Temporary attribute name */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Output message about test being performed */ - if (use_index) - MESSAGE(5, ("Testing Querying Attribute Info By Index w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Querying Attribute Info By Index w/o Creation Order Index\n")) - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for query on non-existent attribute */ - H5E_BEGIN_TRY - { - ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, &ainfo, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_info_by_idx"); - H5E_BEGIN_TRY - { - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)0, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_name_by_idx"); - - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for out of bound offset queries */ - H5E_BEGIN_TRY - { - ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, &ainfo, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_info_by_idx"); - H5E_BEGIN_TRY - { - ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)u, &ainfo, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_info_by_idx"); - H5E_BEGIN_TRY - { - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_name_by_idx"); - - /* Create more attributes, to push into dense form */ - for (; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ -#endif - /* Check for out of bound offset queries */ - H5E_BEGIN_TRY - { - ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, &ainfo, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_info_by_idx"); - H5E_BEGIN_TRY - { - ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)u, &ainfo, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_info_by_idx"); - H5E_BEGIN_TRY - { - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aget_name_by_idx"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_info_by_idx() */ - -/*************************************************************** -** -** test_attr_info_null_info_pointer(): A test to ensure that -** passing a NULL attribute info pointer to H5Aget_info -** (_by_name/_by_idx) doesn't cause bad behavior. -** -****************************************************************/ -static void -test_attr_info_null_info_pointer(hid_t fcpl, hid_t fapl) -{ - herr_t err_ret = -1; - hid_t fid; - hid_t attr; - hid_t sid; - - /* Create dataspace for attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create attribute */ - attr = H5Acreate2(fid, GET_INFO_NULL_POINTER_ATTR_NAME, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - H5E_BEGIN_TRY - { - err_ret = H5Aget_info(attr, NULL); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Aget_info"); - - H5E_BEGIN_TRY - { - err_ret = H5Aget_info_by_name(fid, ".", GET_INFO_NULL_POINTER_ATTR_NAME, NULL, H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Aget_info_by_name"); - - H5E_BEGIN_TRY - { - err_ret = H5Aget_info_by_idx(fid, ".", H5_INDEX_NAME, H5_ITER_INC, 0, NULL, H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Aget_info_by_idx"); - - /* Close dataspace */ - err_ret = H5Sclose(sid); - CHECK(err_ret, FAIL, "H5Sclose"); - - /* Close attribute */ - err_ret = H5Aclose(attr); - CHECK(err_ret, FAIL, "H5Aclose"); - - /* Close file */ - err_ret = H5Fclose(fid); - CHECK(err_ret, FAIL, "H5Fclose"); -} - -/*************************************************************** -** -** test_attr_rename_invalid_name(): A test to ensure that -** passing a NULL or empty attribute name to -** H5Arename(_by_name) doesn't cause bad behavior. -** -****************************************************************/ -static void -test_attr_rename_invalid_name(hid_t fcpl, hid_t fapl) -{ - herr_t err_ret = -1; - hid_t fid; - hid_t attr; - hid_t sid; - - /* Create dataspace for attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create attribute */ - attr = H5Acreate2(fid, INVALID_RENAME_TEST_ATTR_NAME, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename(fid, NULL, INVALID_RENAME_TEST_NEW_ATTR_NAME); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename(fid, "", INVALID_RENAME_TEST_NEW_ATTR_NAME); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename(fid, INVALID_RENAME_TEST_ATTR_NAME, NULL); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename(fid, INVALID_RENAME_TEST_ATTR_NAME, ""); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename_by_name(fid, ".", NULL, INVALID_RENAME_TEST_NEW_ATTR_NAME, H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename_by_name"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename_by_name(fid, ".", "", INVALID_RENAME_TEST_NEW_ATTR_NAME, H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename_by_name"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename_by_name(fid, ".", INVALID_RENAME_TEST_ATTR_NAME, NULL, H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename_by_name"); - - H5E_BEGIN_TRY - { - err_ret = H5Arename_by_name(fid, ".", INVALID_RENAME_TEST_ATTR_NAME, "", H5P_DEFAULT); - } - H5E_END_TRY - - CHECK(err_ret, SUCCEED, "H5Arename_by_name"); - - /* Close dataspace */ - err_ret = H5Sclose(sid); - CHECK(err_ret, FAIL, "H5Sclose"); - - /* Close attribute */ - err_ret = H5Aclose(attr); - CHECK(err_ret, FAIL, "H5Aclose"); - - /* Close file */ - err_ret = H5Fclose(fid); - CHECK(err_ret, FAIL, "H5Fclose"); -} - -/*************************************************************** -** -** test_attr_get_name_invalid_buf(): A test to ensure that -** passing a NULL buffer to H5Aget_name(_by_idx) when -** the 'size' parameter is non-zero doesn't cause bad -** behavior. -** -****************************************************************/ -static void -test_attr_get_name_invalid_buf(hid_t fcpl, hid_t fapl) -{ - ssize_t err_ret = -1; - hid_t fid; - hid_t attr; - hid_t sid; - - /* Create dataspace for attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create attribute */ - attr = - H5Acreate2(fid, GET_NAME_INVALID_BUF_TEST_ATTR_NAME, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - H5E_BEGIN_TRY - { - err_ret = H5Aget_name(attr, 1, NULL); - } - H5E_END_TRY - - VERIFY(err_ret, FAIL, "H5Aget_name"); - - H5E_BEGIN_TRY - { - err_ret = H5Aget_name_by_idx(fid, ".", H5_INDEX_NAME, H5_ITER_INC, 0, NULL, 1, H5P_DEFAULT); - } - H5E_END_TRY - - VERIFY(err_ret, FAIL, "H5Aget_name_by_idx"); - - /* Close dataspace */ - err_ret = H5Sclose(sid); - CHECK(err_ret, FAIL, "H5Sclose"); - - /* Close attribute */ - err_ret = H5Aclose(attr); - CHECK(err_ret, FAIL, "H5Aclose"); - - /* Close file */ - err_ret = H5Fclose(fid); - CHECK(err_ret, FAIL, "H5Fclose"); -} - -/**************************************************************** -** -** test_attr_delete_by_idx(): Test basic H5A (attribute) code. -** Tests deleting attribute by index -** -****************************************************************/ -static void -test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - H5A_info_t ainfo; /* Attribute information */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - H5_index_t idx_type; /* Type of index to operate on */ - H5_iter_order_t order; /* Order within in the index */ - unsigned use_index; /* Use index on creation order values */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - char tmpname[NAME_BUF_SIZE]; /* Temporary attribute name */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - MESSAGE(5, ("Testing Deleting Attribute By Index\n")) - - if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) { - MESSAGE(5, (" SKIPPED\n")) - return; - } - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Loop over operating on different indices on link fields */ - for (idx_type = H5_INDEX_NAME; idx_type <= H5_INDEX_CRT_ORDER; idx_type++) { - /* Loop over operating in different orders */ - for (order = H5_ITER_INC; order <= H5_ITER_DEC; order++) { - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Print appropriate test message */ - if (idx_type == H5_INDEX_CRT_ORDER) { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Deleting Attribute By Creation Order Index in Increasing " - "Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Deleting Attribute By Creation Order Index in Increasing " - "Order w/o Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Deleting Attribute By Creation Order Index in Decreasing " - "Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Deleting Attribute By Creation Order Index in Decreasing " - "Order w/o Creation Order Index\n")) - } /* end else */ - } /* end if */ - else { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Deleting Attribute By Name Index in Increasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Deleting Attribute By Name Index in Increasing Order w/o " - "Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Deleting Attribute By Name Index in Decreasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Deleting Attribute By Name Index in Decreasing Order w/o " - "Creation Order Index\n")) - } - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for deleting non-existent attribute */ - H5E_BEGIN_TRY - { - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete_by_idx"); - - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for out of bound deletions */ - H5E_BEGIN_TRY - { - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete_by_idx"); - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Delete attributes from compact storage */ - for (u = 0; u < (max_compact - 1); u++) { - /* Delete first attribute in appropriate order */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); - - /* Verify the attribute information for first attribute in appropriate order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, &ainfo, - H5P_DEFAULT); - if (new_format) { - if (order == H5_ITER_INC) { - VERIFY(ainfo.corder, (u + 1), "H5Aget_info_by_idx"); - } /* end if */ - else { - VERIFY(ainfo.corder, (max_compact - (u + 2)), "H5Aget_info_by_idx"); - } /* end else */ - } /* end if */ - - /* Verify the name for first attribute in appropriate order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - if (order == H5_ITER_INC) - snprintf(attrname, sizeof(attrname), "attr %02u", (u + 1)); - else - snprintf(attrname, sizeof(attrname), "attr %02u", (max_compact - (u + 2))); - ret = strcmp(attrname, tmpname); - VERIFY(ret, 0, "H5Aget_name_by_idx"); - } /* end for */ - - /* Delete last attribute */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); -#if 0 - /* Verify state of attribute storage (empty) */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); -#endif - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create more attributes, to push into dense form */ - for (u = 0; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ -#endif - /* Check for out of bound deletion */ - H5E_BEGIN_TRY - { - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete_by_idx"); - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Delete attributes from dense storage */ - for (u = 0; u < ((max_compact * 2) - 1); u++) { - /* Delete first attribute in appropriate order */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); - - /* Verify the attribute information for first attribute in appropriate order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, &ainfo, - H5P_DEFAULT); - if (new_format) { - if (order == H5_ITER_INC) { - VERIFY(ainfo.corder, (u + 1), "H5Aget_info_by_idx"); - } /* end if */ - else { - VERIFY(ainfo.corder, ((max_compact * 2) - (u + 2)), "H5Aget_info_by_idx"); - } /* end else */ - } /* end if */ - - /* Verify the name for first attribute in appropriate order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - if (order == H5_ITER_INC) - snprintf(attrname, sizeof(attrname), "attr %02u", (u + 1)); - else - snprintf(attrname, sizeof(attrname), "attr %02u", ((max_compact * 2) - (u + 2))); - ret = strcmp(attrname, tmpname); - VERIFY(ret, 0, "H5Aget_name_by_idx"); - } /* end for */ - - /* Delete last attribute */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); -#if 0 - /* Verify state of attribute storage (empty) */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); -#endif - /* Check for deletion on empty attribute storage again */ - H5E_BEGIN_TRY - { - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete_by_idx"); - } /* end for */ - - /* Delete attributes in middle */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create attributes, to push into dense form */ - for (u = 0; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Delete every other attribute from dense storage, in appropriate order */ - for (u = 0; u < max_compact; u++) { - /* Delete attribute */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); - - /* Verify the attribute information for first attribute in appropriate order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, &ainfo, - H5P_DEFAULT); - if (new_format) { - if (order == H5_ITER_INC) { - VERIFY(ainfo.corder, ((u * 2) + 1), "H5Aget_info_by_idx"); - } /* end if */ - else { - VERIFY(ainfo.corder, ((max_compact * 2) - ((u * 2) + 2)), - "H5Aget_info_by_idx"); - } /* end else */ - } /* end if */ - - /* Verify the name for first attribute in appropriate order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - if (order == H5_ITER_INC) - snprintf(attrname, sizeof(attrname), "attr %02u", ((u * 2) + 1)); - else - snprintf(attrname, sizeof(attrname), "attr %02u", - ((max_compact * 2) - ((u * 2) + 2))); - ret = strcmp(attrname, tmpname); - VERIFY(ret, 0, "H5Aget_name_by_idx"); - } /* end for */ - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Delete remaining attributes from dense storage, in appropriate order */ - for (u = 0; u < (max_compact - 1); u++) { - /* Delete attribute */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); - - /* Verify the attribute information for first attribute in appropriate order */ - memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, &ainfo, - H5P_DEFAULT); - if (new_format) { - if (order == H5_ITER_INC) { - VERIFY(ainfo.corder, ((u * 2) + 3), "H5Aget_info_by_idx"); - } /* end if */ - else { - VERIFY(ainfo.corder, ((max_compact * 2) - ((u * 2) + 4)), - "H5Aget_info_by_idx"); - } /* end else */ - } /* end if */ - - /* Verify the name for first attribute in appropriate order */ - memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, - tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); - if (order == H5_ITER_INC) - snprintf(attrname, sizeof(attrname), "attr %02u", ((u * 2) + 3)); - else - snprintf(attrname, sizeof(attrname), "attr %02u", - ((max_compact * 2) - ((u * 2) + 4))); - ret = strcmp(attrname, tmpname); - VERIFY(ret, 0, "H5Aget_name_by_idx"); - } /* end for */ - - /* Delete last attribute */ - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_idx"); -#if 0 - /* Verify state of attribute storage (empty) */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); -#endif - /* Check for deletion on empty attribute storage again */ - H5E_BEGIN_TRY - { - ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Adelete_by_idx"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - } /* end for */ - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_delete_by_idx() */ - -/**************************************************************** -** -** attr_iterate2_cb(): Revised attribute operator -** -****************************************************************/ -static herr_t -attr_iterate2_cb(hid_t loc_id, const char *attr_name, const H5A_info_t *info, void *_op_data) -{ - attr_iter_info_t *op_data = (attr_iter_info_t *)_op_data; /* User data */ - char attrname[NAME_BUF_SIZE]; /* Object name */ - H5A_info_t my_info; /* Local attribute info */ - - /* Increment # of times the callback was called */ - op_data->ncalled++; - - /* Get the attribute information directly to compare */ - if (H5Aget_info_by_name(loc_id, ".", attr_name, &my_info, H5P_DEFAULT) < 0) - return (H5_ITER_ERROR); - - /* Check more things for revised attribute iteration (vs. older attribute iteration) */ - if (info) { - /* Check for correct order of iteration */ - /* (if we are operating in increasing or decreasing order) */ - if (op_data->order != H5_ITER_NATIVE) - if (info->corder != op_data->curr) - return (H5_ITER_ERROR); - - /* Compare attribute info structs */ - if (info->corder_valid != my_info.corder_valid) - return (H5_ITER_ERROR); - if (info->corder != my_info.corder) - return (H5_ITER_ERROR); - if (info->cset != my_info.cset) - return (H5_ITER_ERROR); - if (info->data_size != my_info.data_size) - return (H5_ITER_ERROR); - } /* end if */ - - /* Verify name of link */ - snprintf(attrname, sizeof(attrname), "attr %02u", (unsigned)my_info.corder); - if (strcmp(attr_name, attrname) != 0) - return (H5_ITER_ERROR); - - /* Check if we've visited this link before */ - if ((size_t)op_data->curr >= op_data->max_visit) - return (H5_ITER_ERROR); - if (op_data->visited[op_data->curr]) - return (H5_ITER_ERROR); - op_data->visited[op_data->curr] = true; - - /* Advance to next value, in correct direction */ - if (op_data->order != H5_ITER_DEC) - op_data->curr++; - else - op_data->curr--; - - /* Check for stopping in the middle of iterating */ - if (op_data->stop > 0) - if (--op_data->stop == 0) - return (CORDER_ITER_STOP); - - return (H5_ITER_CONT); -} /* end attr_iterate2_cb() */ - -#ifndef H5_NO_DEPRECATED_SYMBOLS - -/**************************************************************** -** -** attr_iterate1_cb(): Attribute operator -** -****************************************************************/ -#if 0 -static herr_t -attr_iterate1_cb(hid_t loc_id, const char *attr_name, void *_op_data) -{ - return (attr_iterate2_cb(loc_id, attr_name, NULL, _op_data)); -} /* end attr_iterate1_cb() */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - -/*------------------------------------------------------------------------- - * Function: attr_iterate2_fail_cb - * - * Purpose: Callback routine for iterating over attributes on object that - * always returns failure - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -static int -attr_iterate2_fail_cb(hid_t H5_ATTR_UNUSED group_id, const char H5_ATTR_UNUSED *attr_name, - const H5A_info_t H5_ATTR_UNUSED *info, void H5_ATTR_UNUSED *_op_data) -{ - return (H5_ITER_ERROR); -} /* end attr_iterate2_fail_cb() */ - -/*------------------------------------------------------------------------- - * Function: attr_iterate_check - * - * Purpose: Check iteration over attributes on an object - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -static int -attr_iterate_check(hid_t fid, const char *dsetname, hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order, - unsigned max_attrs, attr_iter_info_t *iter_info) -{ - unsigned v; /* Local index variable */ - hsize_t skip; /* # of attributes to skip on object */ -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - unsigned oskip; /* # of attributes to skip on object, with H5Aiterate1 */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - int old_nerrs; /* Number of errors when entering this check */ - herr_t ret; /* Generic return value */ - - /* Retrieve the current # of reported errors */ - old_nerrs = nerrors; - - if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE)) { - SKIPPED(); - printf(" API functions for iterate aren't " - "supported with this connector\n"); - return 1; - } - - /* Iterate over attributes on object */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate2(obj_id, idx_type, order, &skip, attr_iterate2_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate2"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate2"); - for (v = 0; v < max_attrs; v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate2"); - - /* Iterate over attributes on object */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate_by_name"); - for (v = 0; v < max_attrs; v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate_by_name"); - - /* Iterate over attributes on object */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(obj_id, ".", idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate_by_name"); - for (v = 0; v < max_attrs; v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate_by_name"); - -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - /* Iterate over attributes on object, with H5Aiterate1 */ - iter_info->nskipped = oskip = 0; - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate1"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate1"); - for (v = 0; v < max_attrs; v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate1"); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - - /* Skip over some attributes on object */ - iter_info->nskipped = (unsigned)(skip = max_attrs / 2); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? skip : ((max_attrs - 1) - skip); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate2(obj_id, idx_type, order, &skip, attr_iterate2_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate2"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate2"); - if (order == H5_ITER_INC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v + (max_attrs / 2)], true, "H5Aiterate2"); - } /* end if */ - else if (order == H5_ITER_DEC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate2"); - } /* end if */ - else { - unsigned nvisit = 0; /* # of links visited */ - - assert(order == H5_ITER_NATIVE); - for (v = 0; v < max_attrs; v++) - if (iter_info->visited[v] == true) - nvisit++; - - VERIFY(skip, (max_attrs / 2), "H5Aiterate2"); - } /* end else */ - - /* Skip over some attributes on object */ - iter_info->nskipped = (unsigned)(skip = max_attrs / 2); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? skip : ((max_attrs - 1) - skip); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate_by_name"); - if (order == H5_ITER_INC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v + (max_attrs / 2)], true, "H5Aiterate_by_name"); - } /* end if */ - else if (order == H5_ITER_DEC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate_by_name"); - } /* end if */ - else { - unsigned nvisit = 0; /* # of links visited */ - - assert(order == H5_ITER_NATIVE); - for (v = 0; v < max_attrs; v++) - if (iter_info->visited[v] == true) - nvisit++; - - VERIFY(skip, (max_attrs / 2), "H5Aiterate_by_name"); - } /* end else */ - - /* Skip over some attributes on object */ - iter_info->nskipped = (unsigned)(skip = max_attrs / 2); - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? skip : ((max_attrs - 1) - skip); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(obj_id, ".", idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate_by_name"); - if (order == H5_ITER_INC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v + (max_attrs / 2)], true, "H5Aiterate_by_name"); - } /* end if */ - else if (order == H5_ITER_DEC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate_by_name"); - } /* end if */ - else { - unsigned nvisit = 0; /* # of links visited */ - - assert(order == H5_ITER_NATIVE); - for (v = 0; v < max_attrs; v++) - if (iter_info->visited[v] == true) - nvisit++; - - VERIFY(skip, (max_attrs / 2), "H5Aiterate_by_name"); - } /* end else */ - -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - /* Skip over some attributes on object, with H5Aiterate1 */ - iter_info->nskipped = oskip = max_attrs / 2; - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? (unsigned)oskip : ((max_attrs - 1) - oskip); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate1"); - - /* Verify that we visited all the links */ - VERIFY(oskip, max_attrs, "H5Aiterate1"); - if (order == H5_ITER_INC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v + (max_attrs / 2)], true, "H5Aiterate1"); - } /* end if */ - else if (order == H5_ITER_DEC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate1"); - } /* end if */ - else { - unsigned nvisit = 0; /* # of links visited */ - - assert(order == H5_ITER_NATIVE); - for (v = 0; v < max_attrs; v++) - if (iter_info->visited[v] == true) - nvisit++; - - VERIFY(skip, (max_attrs / 2), "H5Aiterate1"); - } /* end else */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - - /* Iterate over attributes on object, stopping in the middle */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = 3; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate2(obj_id, idx_type, order, &skip, attr_iterate2_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate2"); - VERIFY(ret, CORDER_ITER_STOP, "H5Aiterate2"); - VERIFY(iter_info->ncalled, 3, "H5Aiterate2"); - - /* Iterate over attributes on object, stopping in the middle */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = 3; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - VERIFY(ret, CORDER_ITER_STOP, "H5Aiterate_by_name"); - VERIFY(iter_info->ncalled, 3, "H5Aiterate_by_name"); - - /* Iterate over attributes on object, stopping in the middle */ - iter_info->nskipped = (unsigned)(skip = 0); - iter_info->order = order; - iter_info->stop = 3; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate_by_name(obj_id, ".", idx_type, order, &skip, attr_iterate2_cb, iter_info, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - VERIFY(ret, CORDER_ITER_STOP, "H5Aiterate_by_name"); - VERIFY(iter_info->ncalled, 3, "H5Aiterate_by_name"); - -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - /* Iterate over attributes on object, stopping in the middle, with H5Aiterate1() */ - iter_info->nskipped = oskip = 0; - iter_info->order = order; - iter_info->stop = 3; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate1"); - VERIFY(ret, CORDER_ITER_STOP, "H5Aiterate1"); - VERIFY(iter_info->ncalled, 3, "H5Aiterate1"); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - - /* Check for iteration routine indicating failure */ - skip = 0; - H5E_BEGIN_TRY - { - ret = H5Aiterate2(obj_id, idx_type, order, &skip, attr_iterate2_fail_cb, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate2"); - - skip = 0; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &skip, attr_iterate2_fail_cb, NULL, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - skip = 0; - H5E_BEGIN_TRY - { - ret = - H5Aiterate_by_name(obj_id, ".", idx_type, order, &skip, attr_iterate2_fail_cb, NULL, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - /* Retrieve current # of errors */ - if (old_nerrs == nerrors) - return (0); - else - return (-1); -} /* end attr_iterate_check() */ - -/**************************************************************** -** -** test_attr_iterate2(): Test basic H5A (attribute) code. -** Tests iterating over attributes by index -** -****************************************************************/ -static void -test_attr_iterate2(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - H5_index_t idx_type; /* Type of index to operate on */ - H5_iter_order_t order; /* Order within in the index */ - attr_iter_info_t iter_info; /* Iterator info */ - bool *visited = NULL; /* Array of flags for visiting links */ - hsize_t idx; /* Start index for iteration */ - unsigned use_index; /* Use index on creation order values */ - const char *dsetname; /* Name of dataset for attributes */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) { - return; - } - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Allocate the "visited link" array */ - iter_info.max_visit = max_compact * 2; - visited = (bool *)malloc(sizeof(bool) * iter_info.max_visit); - CHECK_PTR(visited, "malloc"); - iter_info.visited = visited; - - /* Loop over operating on different indices on link fields */ - for (idx_type = H5_INDEX_NAME; idx_type <= H5_INDEX_CRT_ORDER; idx_type++) { - /* Loop over operating in different orders */ - for (order = H5_ITER_INC; order <= H5_ITER_DEC; order++) { - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Print appropriate test message */ - if (idx_type == H5_INDEX_CRT_ORDER) { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Iterating over Attributes By Creation Order Index in " - "Increasing Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Iterating over Attributes By Creation Order Index in " - "Increasing Order w/o Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Iterating over Attributes By Creation Order Index in " - "Decreasing Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Iterating over Attributes By Creation Order Index in " - "Decreasing Order w/o Creation Order Index\n")) - } /* end else */ - } /* end if */ - else { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Iterating over Attributes By Name Index in Increasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Iterating over Attributes By Name Index in Increasing Order " - "w/o Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Iterating over Attributes By Name Index in Decreasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Iterating over Attributes By Name Index in Decreasing Order " - "w/o Creation Order Index\n")) - } /* end else */ - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for iterating over object with no attributes (should be OK) */ - ret = H5Aiterate2(my_dataset, idx_type, order, NULL, attr_iterate2_cb, NULL); - CHECK(ret, FAIL, "H5Aiterate2"); - - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, NULL, attr_iterate2_cb, NULL, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - ret = H5Aiterate_by_name(my_dataset, ".", idx_type, order, NULL, attr_iterate2_cb, NULL, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aiterate_by_name"); - - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) { - /* Check for out of bound iteration */ - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate2(my_dataset, idx_type, order, &idx, attr_iterate2_cb, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate2"); - - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &idx, attr_iterate2_cb, - NULL, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(my_dataset, ".", idx_type, order, &idx, attr_iterate2_cb, - NULL, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - /* Test iteration over attributes stored compactly */ - ret = attr_iterate_check(fid, dsetname, my_dataset, idx_type, order, u, &iter_info); - CHECK(ret, FAIL, "attr_iterate_check"); - } - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create more attributes, to push into dense form */ - for (u = max_compact; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } -#endif - - if (vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) { - /* Check for out of bound iteration */ - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate2(my_dataset, idx_type, order, &idx, attr_iterate2_cb, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate2"); - - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &idx, attr_iterate2_cb, - NULL, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(my_dataset, ".", idx_type, order, &idx, attr_iterate2_cb, - NULL, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - /* Test iteration over attributes stored densely */ - ret = attr_iterate_check(fid, dsetname, my_dataset, idx_type, order, u, &iter_info); - CHECK(ret, FAIL, "attr_iterate_check"); - } - } - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - } /* end for */ - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Free the "visited link" array */ - free(visited); -} /* test_attr_iterate2() */ - -/*------------------------------------------------------------------------- - * Function: attr_open_by_idx_check - * - * Purpose: Check opening attribute by index on an object - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -static int -attr_open_by_idx_check(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order, unsigned max_attrs) -{ - hid_t attr_id; /* ID of attribute to test */ - H5A_info_t ainfo; /* Attribute info */ - int old_nerrs; /* Number of errors when entering this check */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Retrieve the current # of reported errors */ - old_nerrs = nerrors; - - /* Open each attribute on object by index and check that it's the correct one */ - for (u = 0; u < max_attrs; u++) { - /* Open the attribute */ - attr_id = H5Aopen_by_idx(obj_id, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Aopen_by_idx"); - - /* Get the attribute's information */ - ret = H5Aget_info(attr_id, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); - - /* Check that the object is the correct one */ - if (order == H5_ITER_INC) { - VERIFY(ainfo.corder, u, "H5Aget_info"); - } /* end if */ - else if (order == H5_ITER_DEC) { - VERIFY(ainfo.corder, (max_attrs - (u + 1)), "H5Aget_info"); - } /* end if */ - else { - /* XXX: What to do about native order? */ - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Retrieve current # of errors */ - if (old_nerrs == nerrors) - return (0); - else - return (-1); -} /* end attr_open_by_idx_check() */ - -/**************************************************************** -** -** test_attr_open_by_idx(): Test basic H5A (attribute) code. -** Tests opening attributes by index -** -****************************************************************/ -static void -test_attr_open_by_idx(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - H5_index_t idx_type; /* Type of index to operate on */ - H5_iter_order_t order; /* Order within in the index */ - unsigned use_index; /* Use index on creation order values */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) { - return; - } - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Loop over operating on different indices on link fields */ - for (idx_type = H5_INDEX_NAME; idx_type <= H5_INDEX_CRT_ORDER; idx_type++) { - /* Loop over operating in different orders */ - for (order = H5_ITER_INC; order <= H5_ITER_DEC; order++) { - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Print appropriate test message */ - if (idx_type == H5_INDEX_CRT_ORDER) { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Opening Attributes By Creation Order Index in Increasing " - "Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Opening Attributes By Creation Order Index in Increasing " - "Order w/o Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Opening Attributes By Creation Order Index in Decreasing " - "Order w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Opening Attributes By Creation Order Index in Decreasing " - "Order w/o Creation Order Index\n")) - } /* end else */ - } /* end if */ - else { - if (order == H5_ITER_INC) { - if (use_index) - MESSAGE(5, ("Testing Opening Attributes By Name Index in Increasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Opening Attributes By Name Index in Increasing Order w/o " - "Creation Order Index\n")) - } /* end if */ - else { - if (use_index) - MESSAGE(5, ("Testing Opening Attributes By Name Index in Decreasing Order " - "w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Opening Attributes By Name Index in Decreasing Order w/o " - "Creation Order Index\n")) - } /* end else */ - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for opening an attribute on an object with no attributes */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_idx"); - - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for out of bound opening an attribute on an object */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_idx"); - - /* Test opening attributes by index stored compactly */ - ret = attr_open_by_idx_check(my_dataset, idx_type, order, u); - CHECK(ret, FAIL, "attr_open_by_idx_check"); - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - break; - - case 1: - my_dataset = dset2; - break; - - case 2: - my_dataset = dset3; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create more attributes, to push into dense form */ - for (u = max_compact; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = - H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ -#endif - /* Check for out of bound opening an attribute on an object */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_idx"); - - /* Test opening attributes by index stored compactly */ - ret = attr_open_by_idx_check(my_dataset, idx_type, order, u); - CHECK(ret, FAIL, "attr_open_by_idx_check"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - } /* end for */ - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_open_by_idx() */ - -/*------------------------------------------------------------------------- - * Function: attr_open_check - * - * Purpose: Check opening attribute on an object - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -static int -attr_open_check(hid_t fid, const char *dsetname, hid_t obj_id, unsigned max_attrs) -{ - hid_t attr_id; /* ID of attribute to test */ - H5A_info_t ainfo; /* Attribute info */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - int old_nerrs; /* Number of errors when entering this check */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Retrieve the current # of reported errors */ - old_nerrs = nerrors; - - /* Open each attribute on object by index and check that it's the correct one */ - for (u = 0; u < max_attrs; u++) { - /* Open the attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr_id = H5Aopen(obj_id, attrname, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Aopen"); - - /* Get the attribute's information */ - ret = H5Aget_info(attr_id, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); - - /* Check that the object is the correct one */ - VERIFY(ainfo.corder, u, "H5Aget_info"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the attribute */ - attr_id = H5Aopen_by_name(obj_id, ".", attrname, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Aopen_by_name"); - - /* Get the attribute's information */ - ret = H5Aget_info(attr_id, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); - - /* Check that the object is the correct one */ - VERIFY(ainfo.corder, u, "H5Aget_info"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the attribute */ - attr_id = H5Aopen_by_name(fid, dsetname, attrname, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Aopen_by_name"); - - /* Get the attribute's information */ - ret = H5Aget_info(attr_id, &ainfo); - CHECK(ret, FAIL, "H5Aget_info"); - - /* Check that the object is the correct one */ - VERIFY(ainfo.corder, u, "H5Aget_info"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Retrieve current # of errors */ - if (old_nerrs == nerrors) - return (0); - else - return (-1); -} /* end attr_open_check() */ - -/**************************************************************** -** -** test_attr_open_by_name(): Test basic H5A (attribute) code. -** Tests opening attributes by name -** -****************************************************************/ -static void -test_attr_open_by_name(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - unsigned use_index; /* Use index on creation order values */ - const char *dsetname; /* Name of dataset for attributes */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Print appropriate test message */ - if (use_index) - MESSAGE(5, ("Testing Opening Attributes By Name w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Opening Attributes By Name w/o Creation Order Index\n")) - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for opening a non-existent attribute on an object with no attributes */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen(my_dataset, "foo", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Check for opening a non-existent attribute on an object with compact attribute storage */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen(my_dataset, "foo", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - /* Test opening attributes stored compactly */ - ret = attr_open_check(fid, dsetname, my_dataset, u); - CHECK(ret, FAIL, "attr_open_check"); - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create more attributes, to push into dense form */ - for (u = max_compact; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ -#endif - /* Check for opening a non-existent attribute on an object with dense attribute storage */ - H5E_BEGIN_TRY - { - ret_id = H5Aopen(my_dataset, "foo", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(my_dataset, ".", "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - H5E_BEGIN_TRY - { - ret_id = H5Aopen_by_name(fid, dsetname, "foo", H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Aopen_by_name"); - - /* Test opening attributes stored compactly */ - ret = attr_open_check(fid, dsetname, my_dataset, u); - CHECK(ret, FAIL, "attr_open_check"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_open_by_name() */ - -/**************************************************************** -** -** test_attr_create_by_name(): Test basic H5A (attribute) code. -** Tests creating attributes by name -** -****************************************************************/ -static void -test_attr_create_by_name(bool new_format, hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dset1, dset2, dset3; /* Dataset IDs */ - hid_t my_dataset; /* Current dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - unsigned max_compact; /* Maximum # of links to store in group compactly */ - unsigned min_dense; /* Minimum # of links to store in group "densely" */ -#if 0 - htri_t is_empty; /* Are there any attributes? */ - htri_t is_dense; /* Are attributes stored densely? */ - hsize_t nattrs; /* Number of attributes on object */ - hsize_t name_count; /* # of records in name index */ - hsize_t corder_count; /* # of records in creation order index */ -#endif - unsigned use_index; /* Use index on creation order values */ - const char *dsetname; /* Name of dataset for attributes */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned curr_dset; /* Current dataset to work on */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Create dataspace for dataset & attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset creation property list */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Query the attribute creation properties */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Loop over using index for creation order value */ - for (use_index = false; use_index <= true; use_index++) { - /* Print appropriate test message */ - if (use_index) - MESSAGE(5, ("Testing Creating Attributes By Name w/Creation Order Index\n")) - else - MESSAGE(5, ("Testing Creating Attributes By Name w/o Creation Order Index\n")) - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Set attribute creation order tracking & indexing for object */ - if (new_format == true) { - ret = H5Pset_attr_creation_order( - dcpl, (H5P_CRT_ORDER_TRACKED | (use_index ? H5P_CRT_ORDER_INDEXED : (unsigned)0))); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - } /* end if */ - - /* Create datasets */ - dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dcreate2"); - dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset3, FAIL, "H5Dcreate2"); - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ -#if 0 - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Create attributes, up to limit of compact form */ - for (u = 0; u < max_compact; u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate_by_name(fid, dsetname, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate_by_name"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Test opening attributes stored compactly */ - ret = attr_open_check(fid, dsetname, my_dataset, u); - CHECK(ret, FAIL, "attr_open_check"); - } /* end for */ - - /* Work on all the datasets */ - for (curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { - switch (curr_dset) { - case 0: - my_dataset = dset1; - dsetname = DSET1_NAME; - break; - - case 1: - my_dataset = dset2; - dsetname = DSET2_NAME; - break; - - case 2: - my_dataset = dset3; - dsetname = DSET3_NAME; - break; - - default: - assert(0 && "Too many datasets!"); - } /* end switch */ - - /* Create more attributes, to push into dense form */ - for (u = max_compact; u < (max_compact * 2); u++) { - /* Create attribute */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - attr = H5Acreate_by_name(fid, dsetname, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate_by_name"); - - /* Write data into the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Verify state of object */ - if (u >= max_compact) { - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ -#endif - /* Verify information for new attribute */ - ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); - CHECK(ret, FAIL, "attr_info_by_idx_check"); - } /* end for */ -#if 0 - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ -#endif - /* Test opening attributes stored compactly */ - ret = attr_open_check(fid, dsetname, my_dataset, u); - CHECK(ret, FAIL, "attr_open_check"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_create_by_name() */ - -/**************************************************************** -** -** test_attr_shared_write(): Test basic H5A (attribute) code. -** Tests writing mix of shared & un-shared attributes in "compact" & "dense" storage -** -****************************************************************/ -static void -test_attr_shared_write(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t my_fcpl; /* File creation property list ID */ - hid_t dataset, dataset2; /* Dataset IDs */ - hid_t attr_tid; /* Attribute's datatype ID */ - hid_t sid, big_sid; /* Dataspace IDs */ - hsize_t big_dims[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; /* Dimensions for "big" attribute */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - htri_t is_shared; /* Is attributes shared? */ - hsize_t shared_refcount; /* Reference count of shared attribute */ -#endif - unsigned attr_value; /* Attribute value */ - unsigned *big_value; /* Data for "big" attribute */ -#if 0 - size_t mesg_count; /* # of shared messages */ -#endif - unsigned test_shared; /* Index over shared component type */ - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Writing Shared & Unshared Attributes in Compact & Dense Storage\n")); - - /* Allocate & initialize "big" attribute data */ - big_value = (unsigned *)malloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned)); - CHECK_PTR(big_value, "malloc"); - memset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3)); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "big" dataspace for "large" attributes */ - big_sid = H5Screate_simple(SPACE1_RANK, big_dims, NULL); - CHECK(big_sid, FAIL, "H5Screate_simple"); - - /* Loop over type of shared components */ - for (test_shared = 0; test_shared < 3; test_shared++) { - /* Make copy of file creation property list */ - my_fcpl = H5Pcopy(fcpl); - CHECK(my_fcpl, FAIL, "H5Pcopy"); - - /* Set up datatype for attributes */ - attr_tid = H5Tcopy(H5T_NATIVE_UINT); - CHECK(attr_tid, FAIL, "H5Tcopy"); - - /* Special setup for each type of shared components */ - if (test_shared == 0) { - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end if */ - else { - /* Set up copy of file creation property list */ - - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)3); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - - /* Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)1, H5O_SHMESG_DTYPE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)2, H5O_SHMESG_SDSPACE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close FCPL copy */ - ret = H5Pclose(my_fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Commit datatype to file */ - if (test_shared == 2) { - ret = H5Tcommit2(fid, TYPE1_NAME, attr_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - } /* end if */ - - /* Set up to query the object creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create datasets */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - dataset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset2, FAIL, "H5Dcreate2"); - - /* Check on dataset's message storage status */ - if (test_shared != 0) { -#if 0 - /* Datasets' datatypes can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - - /* Datasets' dataspace can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); -#endif - } /* end if */ - - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes to each dataset, until after converting to dense storage */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Close attribute's datatype */ - ret = H5Tclose(attr_tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Datasets */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dataset2); - CHECK(ret, FAIL, "H5Dclose"); -#if 0 - /* Check on shared message status now */ - if (test_shared != 0) { - if (test_shared == 1) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Unlink datasets with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Unlink committed datatype */ - if (test_shared == 2) { - ret = H5Ldelete(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ -#if 0 - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif - } /* end for */ - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(big_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Release memory */ - free(big_value); -} /* test_attr_shared_write() */ - -/**************************************************************** -** -** test_attr_shared_rename(): Test basic H5A (attribute) code. -** Tests renaming shared attributes in "compact" & "dense" storage -** -****************************************************************/ -static void -test_attr_shared_rename(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* HDF5 File ID */ - hid_t my_fcpl; /* File creation property list ID */ - hid_t dataset, dataset2; /* Dataset ID2 */ - hid_t attr_tid; /* Attribute's datatype ID */ - hid_t sid, big_sid; /* Dataspace IDs */ - hsize_t big_dims[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; /* Dimensions for "big" attribute */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute on first dataset */ - char attrname2[NAME_BUF_SIZE]; /* Name of attribute on second dataset */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - htri_t is_shared; /* Is attributes shared? */ - hsize_t shared_refcount; /* Reference count of shared attribute */ -#endif - unsigned attr_value; /* Attribute value */ - unsigned *big_value; /* Data for "big" attribute */ -#if 0 - size_t mesg_count; /* # of shared messages */ -#endif - unsigned test_shared; /* Index over shared component type */ - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Renaming Shared & Unshared Attributes in Compact & Dense Storage\n")); - - /* Allocate & initialize "big" attribute data */ - big_value = (unsigned *)malloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned)); - CHECK_PTR(big_value, "malloc"); - memset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3)); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "big" dataspace for "large" attributes */ - big_sid = H5Screate_simple(SPACE1_RANK, big_dims, NULL); - CHECK(big_sid, FAIL, "H5Screate_simple"); - - /* Loop over type of shared components */ - for (test_shared = 0; test_shared < 3; test_shared++) { - /* Make copy of file creation property list */ - my_fcpl = H5Pcopy(fcpl); - CHECK(my_fcpl, FAIL, "H5Pcopy"); - - /* Set up datatype for attributes */ - attr_tid = H5Tcopy(H5T_NATIVE_UINT); - CHECK(attr_tid, FAIL, "H5Tcopy"); - - /* Special setup for each type of shared components */ - if (test_shared == 0) { - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end if */ - else { - /* Set up copy of file creation property list */ - - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)3); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - - /* Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)1, H5O_SHMESG_DTYPE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)2, H5O_SHMESG_SDSPACE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close FCPL copy */ - ret = H5Pclose(my_fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Commit datatype to file */ - if (test_shared == 2) { - ret = H5Tcommit2(fid, TYPE1_NAME, attr_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - } /* end if */ - - /* Set up to query the object creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create datasets */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - dataset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset2, FAIL, "H5Dcreate2"); -#if 0 - /* Check on dataset's message storage status */ - if (test_shared != 0) { - /* Datasets' datatypes can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - - /* Datasets' dataspace can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes to each dataset, until after converting to dense storage */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Create new attribute name */ - snprintf(attrname2, sizeof(attrname2), "new attr %02u", u); - - /* Change second dataset's attribute's name */ - ret = H5Arename_by_name(fid, DSET2_NAME, attrname, attrname2, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Arename_by_name"); - - /* Check refcount on attributes now */ - - /* Check refcount on renamed attribute */ - attr = H5Aopen(dataset2, attrname2, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check refcount on original attribute */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Change second dataset's attribute's name back to original */ - ret = H5Arename_by_name(fid, DSET2_NAME, attrname2, attrname, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Arename_by_name"); - - /* Check refcount on attributes now */ - - /* Check refcount on renamed attribute */ - attr = H5Aopen(dataset2, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check refcount on original attribute */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close attribute's datatype */ - ret = H5Tclose(attr_tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Datasets */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dataset2); - CHECK(ret, FAIL, "H5Dclose"); -#if 0 - /* Check on shared message status now */ - if (test_shared != 0) { - if (test_shared == 1) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Unlink datasets with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "HLdelete"); - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Unlink committed datatype */ - if (test_shared == 2) { - ret = H5Ldelete(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ -#if 0 - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif - } /* end for */ - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(big_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Release memory */ - free(big_value); -} /* test_attr_shared_rename() */ - -/**************************************************************** -** -** test_attr_shared_delete(): Test basic H5A (attribute) code. -** Tests deleting shared attributes in "compact" & "dense" storage -** -****************************************************************/ -static void -test_attr_shared_delete(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t my_fcpl; /* File creation property list ID */ - hid_t dataset, dataset2; /* Dataset IDs */ - hid_t attr_tid; /* Attribute's datatype ID */ - hid_t sid, big_sid; /* Dataspace IDs */ - hsize_t big_dims[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; /* Dimensions for "big" attribute */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute on first dataset */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - htri_t is_shared; /* Is attributes shared? */ - hsize_t shared_refcount; /* Reference count of shared attribute */ -#endif - unsigned attr_value; /* Attribute value */ - unsigned *big_value; /* Data for "big" attribute */ -#if 0 - size_t mesg_count; /* # of shared messages */ -#endif - unsigned test_shared; /* Index over shared component type */ - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deleting Shared & Unshared Attributes in Compact & Dense Storage\n")); - - /* Allocate & initialize "big" attribute data */ - big_value = (unsigned *)malloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned)); - CHECK_PTR(big_value, "malloc"); - memset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3)); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "big" dataspace for "large" attributes */ - big_sid = H5Screate_simple(SPACE1_RANK, big_dims, NULL); - CHECK(big_sid, FAIL, "H5Screate_simple"); - - /* Loop over type of shared components */ - for (test_shared = 0; test_shared < 3; test_shared++) { - /* Make copy of file creation property list */ - my_fcpl = H5Pcopy(fcpl); - CHECK(my_fcpl, FAIL, "H5Pcopy"); - - /* Set up datatype for attributes */ - attr_tid = H5Tcopy(H5T_NATIVE_UINT); - CHECK(attr_tid, FAIL, "H5Tcopy"); - - /* Special setup for each type of shared components */ - if (test_shared == 0) { - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end if */ - else { - /* Set up copy of file creation property list */ - - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)3); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - - /* Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)1, H5O_SHMESG_DTYPE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)2, H5O_SHMESG_SDSPACE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close FCPL copy */ - ret = H5Pclose(my_fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Commit datatype to file */ - if (test_shared == 2) { - ret = H5Tcommit2(fid, TYPE1_NAME, attr_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - } /* end if */ - - /* Set up to query the object creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create datasets */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - dataset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset2, FAIL, "H5Dcreate2"); -#if 0 - /* Check on dataset's message storage status */ - if (test_shared != 0) { - /* Datasets' datatypes can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - - /* Datasets' dataspace can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes to each dataset, until after converting to dense storage */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Delete attributes from second dataset */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Delete second dataset's attribute */ - ret = H5Adelete_by_name(fid, DSET2_NAME, attrname, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Adelete_by_name"); - - /* Check refcount on attributes now */ - - /* Check refcount on first dataset's attribute */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close attribute's datatype */ - ret = H5Tclose(attr_tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Datasets */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dataset2); - CHECK(ret, FAIL, "H5Dclose"); -#if 0 - /* Check on shared message status now */ - if (test_shared != 0) { - if (test_shared == 1) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Unlink datasets with attributes */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Unlink committed datatype */ - if (test_shared == 2) { - ret = H5Ldelete(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ -#if 0 - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif - } /* end for */ - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(big_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Release memory */ - free(big_value); -} /* test_attr_shared_delete() */ - -/**************************************************************** -** -** test_attr_shared_unlink(): Test basic H5A (attribute) code. -** Tests unlinking object with shared attributes in "compact" & "dense" storage -** -****************************************************************/ -static void -test_attr_shared_unlink(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t my_fcpl; /* File creation property list ID */ - hid_t dataset, dataset2; /* Dataset IDs */ - hid_t attr_tid; /* Attribute's datatype ID */ - hid_t sid, big_sid; /* Dataspace IDs */ - hsize_t big_dims[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; /* Dimensions for "big" attribute */ - hid_t attr; /* Attribute ID */ - hid_t dcpl; /* Dataset creation property list ID */ - char attrname[NAME_BUF_SIZE]; /* Name of attribute on first dataset */ - unsigned max_compact; /* Maximum # of attributes to store compactly */ - unsigned min_dense; /* Minimum # of attributes to store "densely" */ -#if 0 - htri_t is_dense; /* Are attributes stored densely? */ - htri_t is_shared; /* Is attributes shared? */ - hsize_t shared_refcount; /* Reference count of shared attribute */ -#endif - unsigned attr_value; /* Attribute value */ - unsigned *big_value; /* Data for "big" attribute */ -#if 0 - size_t mesg_count; /* # of shared messages */ -#endif - unsigned test_shared; /* Index over shared component type */ - unsigned u; /* Local index variable */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Unlinking Object with Shared Attributes in Compact & Dense Storage\n")); - - /* Allocate & initialize "big" attribute data */ - big_value = (unsigned *)malloc((size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3) * sizeof(unsigned)); - CHECK_PTR(big_value, "malloc"); - memset(big_value, 1, sizeof(unsigned) * (size_t)(SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3)); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create "big" dataspace for "large" attributes */ - big_sid = H5Screate_simple(SPACE1_RANK, big_dims, NULL); - CHECK(big_sid, FAIL, "H5Screate_simple"); - - /* Loop over type of shared components */ - for (test_shared = 0; test_shared < 3; test_shared++) { - /* Make copy of file creation property list */ - my_fcpl = H5Pcopy(fcpl); - CHECK(my_fcpl, FAIL, "H5Pcopy"); - - /* Set up datatype for attributes */ - attr_tid = H5Tcopy(H5T_NATIVE_UINT); - CHECK(attr_tid, FAIL, "H5Tcopy"); - - /* Special setup for each type of shared components */ - if (test_shared == 0) { - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end if */ - else { - /* Set up copy of file creation property list */ - - ret = H5Pset_shared_mesg_nindexes(my_fcpl, (unsigned)3); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - - /* Make attributes > 500 bytes shared */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)500); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - - /* Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) */ - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)1, H5O_SHMESG_DTYPE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - ret = H5Pset_shared_mesg_index(my_fcpl, (unsigned)2, H5O_SHMESG_SDSPACE_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - } /* end else */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close FCPL copy */ - ret = H5Pclose(my_fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); -#endif - - /* Re-open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Commit datatype to file */ - if (test_shared == 2) { - ret = H5Tcommit2(fid, TYPE1_NAME, attr_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - } /* end if */ - - /* Set up to query the object creation properties */ - if (dcpl_g == H5P_DEFAULT) { - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - } - else { - dcpl = H5Pcopy(dcpl_g); - CHECK(dcpl, FAIL, "H5Pcopy"); - } - - /* Create datasets */ - dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - dataset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset2, FAIL, "H5Dcreate2"); -#if 0 - /* Check on dataset's message storage status */ - if (test_shared != 0) { - /* Datasets' datatypes can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - - /* Datasets' dataspace can be shared */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 1, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Retrieve limits for compact/dense attribute storage */ - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Close property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); -#endif - /* Add attributes to each dataset, until after converting to dense storage */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on first dataset */ - attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* ChecFk that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - - /* Alternate between creating "small" & "big" attributes */ - if (u % 2) { - /* Create "small" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); -#endif - /* Write data into the attribute */ - attr_value = u + 1; - ret = H5Awrite(attr, attr_tid, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - } /* end if */ - else { - /* Create "big" attribute on second dataset */ - attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); -#if 0 - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); -#endif - /* Write data into the attribute */ - big_value[0] = u + 1; - ret = H5Awrite(attr, attr_tid, big_value); - CHECK(ret, FAIL, "H5Awrite"); -#if 0 - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); -#endif - } /* end else */ - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); -#if 0 - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - } /* end for */ - - /* Close attribute's datatype */ - ret = H5Tclose(attr_tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close second dataset */ - ret = H5Dclose(dataset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink second dataset */ - ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - -#if 0 - /* Check on first dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); -#endif - /* Check ref count on attributes of first dataset */ - for (u = 0; u < max_compact * 2; u++) { - /* Create attribute name */ - snprintf(attrname, sizeof(attrname), "attr %02u", u); - - /* Open attribute on first dataset */ - attr = H5Aopen(dataset, attrname, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); -#if 0 - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ -#endif - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close Datasets */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Unlink first dataset */ - ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Unlink committed datatype */ - if (test_shared == 2) { - ret = H5Ldelete(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ -#if 0 - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ -#endif - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - if (h5_using_default_driver(NULL)) { - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); - } -#endif - } /* end for */ - - /* Close dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(big_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Release memory */ - free(big_value); -} /* test_attr_shared_unlink() */ - -/**************************************************************** -** -** test_attr_bug1(): Test basic H5A (attribute) code. -** Tests odd sequence of allocating and deallocating space in the file. -** The series of actions below constructs a file with an attribute -** in each object header chunk, except the first. Then, the attributes -** are removed and re-created in a way that makes the object header -** allocation code remove an object header chunk "in the middle" of -** the sequence of the chunks. -** -****************************************************************/ -static void -test_attr_bug1(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Allocating and De-allocating Attributes in Unusual Way\n")); - - /* Create dataspace ID for attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create main group to operate on */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file and create another group, then attribute on first group */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create second group */ - gid = H5Gcreate2(fid, GROUP2_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Re-open first group */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create attribute on first group */ - aid = H5Acreate2(gid, ATTR7_NAME, H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file and create another group, then another attribute on first group */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create third group */ - gid = H5Gcreate2(fid, GROUP3_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Unlink second group */ - ret = H5Ldelete(fid, GROUP2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Re-open first group */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create another attribute on first group */ - aid = H5Acreate2(gid, ATTR8_NAME, H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file and re-create attributes on first group */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open first group */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Delete first attribute */ - ret = H5Adelete(gid, ATTR7_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Re-create first attribute */ - aid = H5Acreate2(gid, ATTR7_NAME, H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete second attribute */ - ret = H5Adelete(gid, ATTR8_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Re-create second attribute */ - aid = H5Acreate2(gid, ATTR8_NAME, H5T_NATIVE_DOUBLE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close dataspace ID */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Gclose"); -} /* test_attr_bug1() */ - -/**************************************************************** -** -** test_attr_bug2(): Test basic H5A (attribute) code. -** Tests deleting a large number of attributes with the -** intention of creating a null message with a size that -** is too large. This routine deletes every other -** attribute, but the original bug could also be -** reproduced by deleting every attribute except a few to -** keep the chunk open. -** -****************************************************************/ -static void -test_attr_bug2(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hid_t gcpl; /* Group creation property list */ - hsize_t dims[2] = {10, 100}; /* Attribute dimensions */ - char aname[16]; /* Attribute name */ - unsigned i; /* index */ - herr_t ret; /* Generic return status */ - htri_t tri_ret; /* htri_t return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Allocating and De-allocating Attributes in Unusual Way\n")); - - /* Create group creation property list */ - gcpl = H5Pcreate(H5P_GROUP_CREATE); - CHECK(gcpl, FAIL, "H5Pcreate"); - - /* Prevent the library from switching to dense attribute storage */ - /* Not doing this with the latest format actually triggers a different bug. - * This will be tested here as soon as it is fixed. -NAF - */ - ret = H5Pset_attr_phase_change(gcpl, BUG2_NATTR + 10, BUG2_NATTR + 5); - CHECK(ret, FAIL, "H5Pset_attr_phase_change"); - - /* Create dataspace ID for attributes */ - sid = H5Screate_simple(2, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create main group to operate on */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, gcpl, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create attributes on group */ - for (i = 0; i < BUG2_NATTR; i++) { - snprintf(aname, sizeof(aname), "%03u", i); - aid = H5Acreate2(gid, aname, H5T_STD_I32LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - } - - /* Delete every other attribute */ - for (i = 1; i < BUG2_NATTR; i += 2) { - snprintf(aname, sizeof(aname), "%03u", i); - ret = H5Adelete(gid, aname); - CHECK(ret, FAIL, "H5Adelete"); - } - - /* Close IDs */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Reopen file and group */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen"); - - /* Open an attribute in the middle */ - i = (BUG2_NATTR / 4) * 2; - snprintf(aname, sizeof(aname), "%03u", i); - aid = H5Aopen(gid, aname, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Aopen"); - - /* Verify that the attribute has the correct datatype */ - tid = H5Aget_type(aid); - CHECK(tid, FAIL, "H5Aget_type"); - - tri_ret = H5Tequal(tid, H5T_STD_I32LE); - VERIFY(tri_ret, true, "H5Tequal"); - - /* Close IDs */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Now test a variation on this bug - where either the size of chunk 0 goes - * down a "notch" or two, or chunk 1 becomes completely null at the same - * time that a null message that is too large is formed */ - dims[0] = 25; - dims[1] = 41; /* 1025*4 byte attribute size */ - - /* Create dataspace ID for attributes */ - sid = H5Screate_simple(2, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create main group to operate on */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, gcpl, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create attributes on group */ - for (i = 0; i < BUG2_NATTR2; i++) { - snprintf(aname, sizeof(aname), "%03u", i); - aid = H5Acreate2(gid, aname, H5T_STD_I32LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - } - - /* Delete every other attribute */ - for (i = 0; i < BUG2_NATTR2; i++) { - snprintf(aname, sizeof(aname), "%03u", i); - ret = H5Adelete(gid, aname); - CHECK(ret, FAIL, "H5Adelete"); - } - - /* Close IDs */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Pclose(gcpl); - CHECK(ret, FAIL, "H5Pclose"); -} /* test_attr_bug2() */ - -/**************************************************************** -** -** test_attr_bug3(): Test basic H5A (attribute) code. -** Tests creating and deleting attributes which use a -** datatype and/or dataspace stored in the same object -** header. -** -****************************************************************/ -static void -test_attr_bug3(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t aid1, aid2; /* Attribute IDs */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t tid1, tid2; /* Datatype IDs */ - hid_t did; /* Dataset ID */ - hsize_t dims1[2] = {2, 2}, dims2[2] = {3, 3}; /* Dimensions */ - int wdata1[2][2]; - unsigned wdata2[3][3]; /* Write buffers */ - unsigned u, v; /* Local index variables */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Attributes in the Same Header as their Datatypes\n")); - - /* Create dataspaces */ - sid1 = H5Screate_simple(2, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - sid2 = H5Screate_simple(2, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create file to operate on */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create datatypes and commit tid1 */ - tid1 = H5Tcopy(H5T_STD_I16BE); - CHECK(tid1, FAIL, "H5Tcopy"); - tid2 = H5Tcopy(H5T_STD_U64LE); - CHECK(tid1, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "dtype", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create dataset */ - did = H5Dcreate2(fid, "dset", tid2, sid2, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Create attribute on datatype, using that datatype as its datatype */ - aid1 = H5Acreate2(tid1, "attr", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Acreate2"); - - /* Create attribute on dataset, using its datatype and dataspace */ - aid2 = H5Acreate2(did, "attr", tid2, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Acreate2"); - - /* Close attributes */ - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Reopen attributes */ - aid1 = H5Aopen(tid1, "attr", H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Aopen"); - aid2 = H5Aopen(did, "attr", H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Aopen"); - - /* Initialize the write buffers */ - for (u = 0; u < dims1[0]; u++) - for (v = 0; v < dims1[1]; v++) - wdata1[u][v] = (int)((u * dims1[1]) + v); - for (u = 0; u < dims2[0]; u++) - for (v = 0; v < dims2[1]; v++) - wdata2[u][v] = (unsigned)((u * dims2[1]) + v); - - /* Write data to the attributes */ - ret = H5Awrite(aid1, H5T_NATIVE_INT, wdata1); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Awrite(aid2, H5T_NATIVE_UINT, wdata2); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attributes */ - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete attributes */ - ret = H5Adelete(tid1, "attr"); - CHECK(ret, FAIL, "H5Adelete"); - ret = H5Adelete(did, "attr"); - CHECK(ret, FAIL, "H5Adelete"); - - /* Recreate attributes */ - aid1 = H5Acreate2(tid1, "attr", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Acreate2"); - aid2 = H5Acreate2(did, "attr", tid2, sid2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Acreate2"); - - /* Delete attributes (note they are still open) */ - ret = H5Adelete(tid1, "attr"); - CHECK(ret, FAIL, "H5Adelete"); - ret = H5Adelete(did, "attr"); - CHECK(ret, FAIL, "H5Adelete"); - - /* Close dataspaces and transient datatype */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close dataset and committed datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Delete dataset and committed datatype */ - ret = H5Ldelete(fid, "dtype", H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Ldelete(fid, "dset", H5P_DEFAULT); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close attributes */ - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_bug3() */ - -/**************************************************************** -** -** test_attr_bug4(): Test basic H5A (attribute) code. -** Attempts to trigger a bug which would result in being -** unable to add an attribute to a named datatype. This -** happened when an object header chunk was too small to -** hold a continuation message and could not be extended. -** -****************************************************************/ -static void -test_attr_bug4(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - hid_t aid1, aid2, aid3; /* Attribute IDs */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hid_t did; /* Dataset ID */ - hsize_t dims[1] = {5}; /* Attribute dimensions */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing that attributes can always be added to named datatypes\n")); - - /* Create dataspace */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Open root group */ - gid = H5Gopen2(fid, "/", H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create committed datatype */ - tid = H5Tcopy(H5T_STD_I32LE); - CHECK(tid, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "dtype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create dataset */ - did = H5Dcreate2(fid, "dset", tid, sid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Create attributes on group and dataset */ - aid1 = H5Acreate2(gid, "attr", tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Acreate2"); - aid2 = H5Acreate2(did, "attr", tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Acreate2"); - - /* Create attribute on datatype (this is the main test) */ - aid3 = H5Acreate2(tid, "attr", tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid3, FAIL, "H5Acreate2"); - - /* Close IDs */ - ret = H5Aclose(aid3); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_bug4() */ - -/**************************************************************** -** -** test_attr_bug5(): Test basic H5A (attribute) code. -** Tests opening an attribute multiple times through -** objects opened through different file handles. -** -****************************************************************/ -static void -test_attr_bug5(hid_t fcpl, hid_t fapl) -{ - hid_t fid1, fid2; /* File IDs */ - hid_t gid1, gid2; /* Group IDs */ - hid_t did1, did2; /* Dataset IDs */ - hid_t tid1, tid2; /* Datatype IDs */ - hid_t aidg1, aidg2, aidd1, aidd2, aidt1, aidt2; /* Attribute IDs */ - hid_t sid; /* Dataspace ID */ - hsize_t dims[1] = {5}; /* Attribute dimensions */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Opening an Attribute Through Multiple Files Concurrently\n")); - - /* Create dataspace ID for attributes and datasets */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Open root group */ - gid1 = H5Gopen2(fid1, "/", H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gopen2"); - - /* Create and commit datatype */ - tid1 = H5Tcopy(H5T_STD_I32LE); - CHECK(tid1, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid1, BUG3_DT_NAME, tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create dataset */ - did1 = H5Dcreate2(fid1, BUG3_DSET_NAME, tid1, sid, H5P_DEFAULT, dcpl_g, H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dcreate2"); - - /* Create attribute on root group */ - aidg1 = H5Acreate2(gid1, BUG3_ATTR_NAME, tid1, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aidg1, FAIL, "H5Acreate2"); - - /* Create attribute on dataset */ - aidd1 = H5Acreate2(did1, BUG3_ATTR_NAME, tid1, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aidd1, FAIL, "H5Acreate2"); - - /* Create attribute on datatype */ - aidt1 = H5Acreate2(tid1, BUG3_ATTR_NAME, tid1, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aidt1, FAIL, "H5Acreate2"); - - /* Close all IDs */ - ret = H5Aclose(aidt1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidd1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidg1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Open file twice */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - fid2 = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Open the root group twice */ - gid1 = H5Gopen2(fid1, "/", H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gopen2"); - gid2 = H5Gopen2(fid2, "/", H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - - /* Open the root group attribute twice */ - aidg1 = H5Aopen(gid1, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidg1, FAIL, "H5Aopen"); - aidg2 = H5Aopen(gid2, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidg1, FAIL, "H5Aopen"); - - /* Open the dataset twice */ - did1 = H5Dopen2(fid1, BUG3_DSET_NAME, H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dopen2"); - did2 = H5Dopen2(fid2, BUG3_DSET_NAME, H5P_DEFAULT); - CHECK(did2, FAIL, "H5Dopen2"); - - /* Open the dataset attribute twice */ - aidd1 = H5Aopen(did1, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidd1, FAIL, "H5Aopen"); - aidd2 = H5Aopen(did2, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidd1, FAIL, "H5Aopen"); - - /* Open the datatype twice */ - tid1 = H5Topen2(fid1, BUG3_DT_NAME, H5P_DEFAULT); - CHECK(tid1, FAIL, "H5Topen2"); - tid2 = H5Topen2(fid2, BUG3_DT_NAME, H5P_DEFAULT); - CHECK(tid2, FAIL, "H5Topen2"); - - /* Open the datatype attribute twice */ - aidt1 = H5Aopen(tid1, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidt1, FAIL, "H5Aopen"); - aidt2 = H5Aopen(tid2, BUG3_ATTR_NAME, H5P_DEFAULT); - CHECK(aidt2, FAIL, "H5Aopen"); - - /* Close all attributes */ - ret = H5Aclose(aidg1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidg2); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidd1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidd2); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidt1); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Aclose(aidt2); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close root groups */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close datasets */ - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(did2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatypes */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close files */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_bug5() */ - -/**************************************************************** -** -** test_attr_bug6(): Test basic H5A (attribute) code. -** Tests if reading an empty attribute is OK. -** -****************************************************************/ -static void -test_attr_bug6(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - hid_t aid1, aid2; /* Attribute IDs */ - hid_t sid; /* Dataspace ID */ - hsize_t dims[ATTR1_RANK] = {ATTR1_DIM1}; /* Attribute dimensions */ - int intar[ATTR1_DIM1]; /* Data reading buffer */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing that empty attribute can be read\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Open root group */ - gid = H5Gopen2(fid, "/", H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create dataspace */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create attribute on group */ - aid1 = H5Acreate2(gid, ATTR1_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open the attribute again */ - aid2 = H5Aopen(gid, ATTR1_NAME, H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Aopen"); - - ret = H5Aread(aid2, H5T_NATIVE_INT, intar); - CHECK(ret, FAIL, "H5Aread"); - - /* Close IDs */ - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_bug6() */ - -/**************************************************************** -** -** test_attr_bug7(): Test basic H5A (attribute) code. -** (Really tests object header allocation code). -** Tests creating and deleting attributes in such a way as -** to change the size of the "chunk #0 size" field. -** Includes testing "skipping" a possible size of the -** field, i.e. going from 1 to 4 bytes or 4 to 1 byte. -** -****************************************************************/ -#if 0 -static void -test_attr_bug7(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hsize_t dims_s = 140; /* Small attribute dimensions */ - hsize_t dims_l = 65480; /* Large attribute dimensions */ - H5A_info_t ainfo; /* Attribute info */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing adding and deleting large attributes\n")); - - /* Create committed datatype to operate on. Use a committed datatype so that - * there is nothing after the object header and the first chunk can expand and - * contract as necessary. */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - tid = H5Tcopy(H5T_STD_I32LE); - CHECK(tid, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, TYPE1_NAME, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* - * Create small attribute - */ - sid = H5Screate_simple(1, &dims_s, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - aid = H5Acreate2(tid, ATTR1_NAME, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close file */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check attribute */ - tid = H5Topen2(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - ret = H5Aget_info_by_name(tid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - - /* - * Create another small attribute. Should cause chunk size field to expand by - * 1 byte (1->2). - */ - aid = H5Acreate2(tid, ATTR2_NAME, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close file */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check attributes */ - tid = H5Topen2(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - ret = H5Aget_info_by_name(tid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - ret = H5Aget_info_by_name(tid, ".", ATTR2_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - - /* - * Create large attribute. Should cause chunk size field to expand by 2 bytes - * (2->4). - */ - ret = H5Sset_extent_simple(sid, 1, &dims_l, NULL); - CHECK(ret, FAIL, "H5Sset_extent_simple"); - aid = H5Acreate2(tid, ATTR3_NAME, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close file */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check attributes */ - tid = H5Topen2(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - ret = H5Aget_info_by_name(tid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - ret = H5Aget_info_by_name(tid, ".", ATTR2_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - ret = H5Aget_info_by_name(tid, ".", ATTR3_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_l) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_l); - - /* - * Delete last two attributes - should merge into a null message that is too - * large, causing the chunk size field to shrink by 3 bytes (4->1). - */ - ret = H5Sset_extent_simple(sid, 1, &dims_l, NULL); - CHECK(ret, FAIL, "H5Sset_extent_simple"); - ret = H5Adelete(tid, ATTR2_NAME); - CHECK(ret, FAIL, "H5Adelete"); - ret = H5Adelete(tid, ATTR3_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check attribute */ - tid = H5Topen2(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - ret = H5Aget_info_by_name(tid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - - /* - * Create large attribute. Should cause chunk size field to expand by 3 bytes - * (1->4). - */ - aid = H5Acreate2(tid, ATTR2_NAME, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close file */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check attributes */ - tid = H5Topen2(fid, TYPE1_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - ret = H5Aget_info_by_name(tid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_s) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_s); - ret = H5Aget_info_by_name(tid, ".", ATTR2_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims_l) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims_l); - - /* Close IDs */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_bug7() */ -#endif - -/**************************************************************** -** -** test_attr_bug8(): Test basic H5A (attribute) code. -** (Really tests object header code). -** Tests adding a link and attribute to a group in such a -** way as to cause the "chunk #0 size" field to expand -** when some object header messages are not loaded into -** cache. Before the bug was fixed, this would prevent -** these messages from being shifted to the correct -** position as the expansion algorithm marked them dirty, -** invalidating the raw form, when there was no native -** form to encode. -** -****************************************************************/ -static void -test_attr_bug8(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hid_t gid; /* Group ID */ - hid_t oid; /* Object ID */ - hsize_t dims = 256; /* Attribute dimensions */ - H5O_info2_t oinfo; /* Object info */ - H5A_info_t ainfo; /* Attribute info */ - H5O_token_t root_token; /* Root group token */ - int cmp_value; /* Result from H5Otoken_cmp */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing attribute expanding object header with undecoded messages\n")); - - /* Create committed datatype to operate on. Use a committed datatype so that - * there is nothing after the object header and the first chunk can expand and - * contract as necessary. */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - gid = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Get root group token */ - ret = H5Oget_info3(fid, &oinfo, H5O_INFO_BASIC); - CHECK(ret, FAIL, "H5Oget_info"); - root_token = oinfo.token; - - /* - * Create link to root group - */ - ret = H5Lcreate_hard(fid, "/", gid, LINK1_NAME, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_hard"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check link */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - oid = H5Oopen(gid, LINK1_NAME, H5P_DEFAULT); - CHECK(oid, FAIL, "H5Oopen"); - ret = H5Oget_info3(oid, &oinfo, H5O_INFO_BASIC); - CHECK(ret, FAIL, "H5Oget_info"); - ret = H5Otoken_cmp(oid, &oinfo.token, &root_token, &cmp_value); - CHECK(ret, FAIL, "H5Otoken_cmp"); - VERIFY(cmp_value, 0, "H5Otoken_cmp"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Oclose(oid); - CHECK(ret, FAIL, "H5Oclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* - * Create attribute. Should cause chunk size field to expand by 1 byte - * (1->2). - */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - sid = H5Screate_simple(1, &dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - aid = H5Acreate2(gid, ATTR1_NAME, H5T_STD_I8LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close file */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Check link and attribute */ - gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - oid = H5Oopen(gid, LINK1_NAME, H5P_DEFAULT); - CHECK(oid, FAIL, "H5Oopen"); - ret = H5Oget_info3(oid, &oinfo, H5O_INFO_BASIC); - CHECK(ret, FAIL, "H5Oget_info"); - ret = H5Otoken_cmp(oid, &oinfo.token, &root_token, &cmp_value); - CHECK(ret, FAIL, "H5Otoken_cmp"); - VERIFY(cmp_value, 0, "H5Otoken_cmp"); - ret = H5Aget_info_by_name(gid, ".", ATTR1_NAME, &ainfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Aget_info_by_name"); - if (ainfo.data_size != dims) - TestErrPrintf("attribute data size different: data_size=%llu, should be %llu\n", - (long long unsigned)ainfo.data_size, (long long unsigned)dims); - - /* Close IDs */ - ret = H5Oclose(oid); - CHECK(ret, FAIL, "H5Oclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_attr_bug8() */ - -/**************************************************************** -** -** test_attr_bug9(): Test basic H5A (attribute) code. -** (Really tests object header code). -** Tests adding several large attributes to an object until -** they convert to dense storage. The total size of all -** attributes is larger than 64K, causing the internal -** object header code to, after merging the deleted -** messages in to a NULL message, shrink the object header -** chunk. Do this twice: once with only attributes in the -** object header chunk and once with a (small) soft link in -** the chunk as well. In both cases, the shrunk chunk will -** initially be too small and a new NULL message must be -** created. -** -****************************************************************/ -static void -test_attr_bug9(hid_t fcpl, hid_t fapl) -{ - hid_t fid = -1; /* File ID */ - hid_t gid = -1; /* Group ID */ - hid_t aid = -1; /* Attribute ID */ - hid_t sid = -1; /* Dataspace ID */ - hsize_t dims[1] = {32768}; /* Attribute dimensions */ - int create_link; /* Whether to create a soft link */ - unsigned max_compact; /* Setting from fcpl */ - unsigned min_dense; /* Setting from fcpl */ - char aname[11]; /* Attribute name */ - unsigned i; /* Local index variable */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing that attributes can always be added to named datatypes\n")); - - /* Create dataspace */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Obtain attribute phase change settings */ - ret = H5Pget_attr_phase_change(fcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Run with and without the soft link */ - for (create_link = 0; create_link < 2; create_link++) { - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create second group */ - gid = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Close second group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open root group */ - gid = H5Gopen2(fid, "/", H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create enough attributes to cause a change to dense storage */ - for (i = 0; i < max_compact + 1; i++) { - /* Create attribute */ - snprintf(aname, sizeof(aname), "%u", i); - aid = H5Acreate2(gid, aname, H5T_NATIVE_CHAR, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create enough soft links that exactly one goes into chunk 1 if - * requested */ - if (i == 0 && create_link) { - ret = H5Lcreate_soft("b", gid, "a", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - ret = H5Lcreate_soft("d", gid, "c", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - ret = H5Lcreate_soft("f", gid, "e", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - } /* end if */ - } /* end for */ - - /* Close IDs */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_bug9() */ - -/**************************************************************** -** -** test_attr_bug10(): Test basic H5A (attribute) code. -** Attempts to trigger a bug which would result in a -** segfault. Create a vlen attribute through a file -** handle, then open the same file through a different -** handle, open the same attribute through the second file -** handle, then close the second file and attribute -** handles, then write to the attribute through the first -** handle. -** -****************************************************************/ -static void -test_attr_bug10(hid_t fcpl, hid_t fapl) -{ - hid_t fid1, fid2; /* File IDs */ - hid_t aid1, aid2; /* Attribute IDs */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hsize_t dims[1] = {1}; /* Attribute dimensions */ - const char *wbuf[1] = {"foo"}; /* Write buffer */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing that vlen attributes can be written to after a second file handle is closed\n")); - - /* Create dataspace */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create VL string datatype */ - tid = H5Tcopy(H5T_C_S1); - CHECK(tid, FAIL, "H5Tcreate"); - ret = H5Tset_size(tid, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create attribute on root group */ - aid1 = H5Acreate2(fid1, "attr", tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid1, FAIL, "H5Acreate2"); - - /* Open the same file again */ - fid2 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid2, FAIL, "H5Fcreate"); - - /* Open the same attribute through the second file handle */ - aid2 = H5Aopen(fid2, "attr", H5P_DEFAULT); - CHECK(aid2, FAIL, "H5Aopen"); - - /* Close the second attribute and file handles */ - ret = H5Aclose(aid2); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Write to the attribute through the first handle */ - ret = H5Awrite(aid1, tid, wbuf); - - /* Close IDs */ - ret = H5Aclose(aid1); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_attr_bug10() */ - -/**************************************************************** -** -** test_attr_delete_dense(): -** This is to verify the error as described in HDFFV-9277 -** is fixed when deleting the last "large" attribute that -** is stored densely. -** -****************************************************************/ -#if 0 /* Native VOL connector only supports large attributes with latest format */ -static void -test_attr_delete_last_dense(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hsize_t dim2[2] = {DIM0, DIM1}; /* Dimension sizes */ - int i, j; /* Local index variables */ - double *data = NULL; /* Pointer to the data buffer */ - herr_t ret; /* Generic return status */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deleting the last large attribute stored densely\n")); - - /* Create the file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create the group */ - gid = H5Gcreate2(fid, GRPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate"); - - /* Create the dataspace */ - sid = H5Screate_simple(RANK, dim2, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Attach the attribute to the group */ - aid = H5Acreate2(gid, ATTRNAME, H5T_IEEE_F64LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Allocate the data buffer */ - data = (double *)malloc((size_t)(DIM0 * DIM1) * sizeof(double)); - CHECK_PTR(data, "malloc"); - - /* Initialize the data */ - for (i = 0; i < DIM0; i++) - for (j = 0; j < DIM1; j++) - *(data + i * DIM1 + j) = i + j; - - /* Write to the attribute */ - ret = H5Awrite(aid, H5T_NATIVE_DOUBLE, data); - CHECK(ret, FAIL, "H5Awrite"); - - /* Closing */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the group */ - gid = H5Gopen2(fid, GRPNAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen"); - - /* Delete the attribute */ - ret = H5Adelete(gid, ATTRNAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Closing */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free the data buffer */ - if (data) - free(data); - -} /* test_attr_delete_last_dense() */ -#endif - -/**************************************************************** -** -** test_attr(): Main H5A (attribute) testing routine. -** -****************************************************************/ -void -test_attr(void) -{ - hid_t fapl = (-1), fapl2 = (-1); /* File access property lists */ - hid_t fcpl = (-1), fcpl2 = (-1); /* File creation property lists */ - hid_t dcpl = -1; /* Dataset creation property list */ - unsigned new_format; /* Whether to use the new format or not */ - unsigned use_shared; /* Whether to use shared attributes or not */ - unsigned minimize_dset_oh; /* Whether to use minimized dataset object headers */ - herr_t ret; /* Generic return value */ - - MESSAGE(5, ("Testing Attributes\n")); - - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* fapl2 uses "latest version of the format" for creating objects in the file */ - fapl2 = H5Pcopy(fapl); - CHECK(fapl2, FAIL, "H5Pcopy"); - ret = H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - /* files with fcpl2 make all attributes ( > 1 byte) shared - * (i.e. all of them :-) */ - fcpl2 = H5Pcopy(fcpl); - CHECK(fcpl2, FAIL, "H5Pcopy"); - ret = H5Pset_shared_mesg_nindexes(fcpl2, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(fcpl2, (unsigned)0, H5O_SHMESG_ATTR_FLAG, (unsigned)1); - CHECK_I(ret, "H5Pset_shared_mesg_index"); - - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcreate"); - - ret = H5Pset_attr_creation_order(dcpl, H5P_CRT_ORDER_TRACKED); - CHECK(ret, FAIL, ""); - - dcpl_g = dcpl; - - for (minimize_dset_oh = 0; minimize_dset_oh <= 1; minimize_dset_oh++) { - if (minimize_dset_oh != 0) - continue; - -#if 0 - if (minimize_dset_oh == 0) { - MESSAGE(7, ("testing with default dataset object headers\n")); - dcpl_g = H5P_DEFAULT; - } - else { - MESSAGE(7, ("testing with minimzied dataset object headers\n")); - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - ret = H5Pset_dset_no_attrs_hint(dcpl, true); - CHECK_I(ret, "H5Pset_dset_no_attrs_hint"); - dcpl_g = dcpl; - } -#endif - - for (new_format = false; new_format <= true; new_format++) { - hid_t my_fapl = fapl; - - if (new_format) - continue; - -#if 0 - /* Set the FAPL for the type of format */ - if (new_format) { - MESSAGE(7, ("testing with new file format\n")); - my_fapl = fapl2; - } - else { - MESSAGE(7, ("testing with old file format\n")); - my_fapl = fapl; - } -#endif - - /* These next two tests use the same file information */ - test_attr_basic_write(my_fapl); /* Test basic H5A writing code */ - test_attr_basic_read(my_fapl); /* Test basic H5A reading code */ - - /* These next two tests use their own file information */ - test_attr_flush(my_fapl); /* Test H5A I/O in the presence of H5Fflush calls */ - test_attr_plist(my_fapl); /* Test attribute property lists */ - - /* These next two tests use the same file information */ - test_attr_compound_write(my_fapl); /* Test complex datatype H5A writing code */ - test_attr_compound_read(my_fapl); /* Test complex datatype H5A reading code */ - - /* These next two tests use the same file information */ - test_attr_scalar_write(my_fapl); /* Test scalar dataspace H5A writing code */ - test_attr_scalar_read(my_fapl); /* Test scalar dataspace H5A reading code */ - - /* These next four tests use the same file information */ - test_attr_mult_write(my_fapl); /* Test H5A writing code for multiple attributes */ - test_attr_mult_read(my_fapl); /* Test H5A reading code for multiple attributes */ - test_attr_iterate(my_fapl); /* Test H5A iterator code */ - test_attr_delete(my_fapl); /* Test H5A code for deleting attributes */ - - /* This next test uses its own file information */ - test_attr_dtype_shared(my_fapl); /* Test using shared datatypes in attributes */ - - /* This next test uses its own file information */ - test_attr_duplicate_ids(my_fapl); - - for (use_shared = false; use_shared <= true; use_shared++) { - hid_t my_fcpl; - - if (new_format == true && use_shared) { - MESSAGE(7, ("testing with shared attributes\n")); - my_fcpl = fcpl2; - } - else { - MESSAGE(7, ("testing without shared attributes\n")); - my_fcpl = fcpl; - } - - test_attr_big(my_fcpl, my_fapl); /* Test storing big attribute */ - test_attr_null_space(my_fcpl, my_fapl); /* Test storing attribute with NULL dataspace */ - test_attr_deprec(fcpl, my_fapl); /* Test deprecated API routines */ - test_attr_many(new_format, my_fcpl, my_fapl); /* Test storing lots of attributes */ - test_attr_info_null_info_pointer(my_fcpl, - my_fapl); /* Test passing a NULL attribute info pointer to - H5Aget_info(_by_name/_by_idx) */ - test_attr_rename_invalid_name( - my_fcpl, - my_fapl); /* Test passing a NULL or empty attribute name to H5Arename(_by_name) */ - test_attr_get_name_invalid_buf( - my_fcpl, my_fapl); /* Test passing NULL buffer to H5Aget_name(_by_idx) */ - - /* New attribute API routine tests */ - test_attr_info_by_idx(new_format, my_fcpl, - my_fapl); /* Test querying attribute info by index */ - test_attr_delete_by_idx(new_format, my_fcpl, my_fapl); /* Test deleting attribute by index */ - test_attr_iterate2(new_format, my_fcpl, - my_fapl); /* Test iterating over attributes by index */ - test_attr_open_by_idx(new_format, my_fcpl, my_fapl); /* Test opening attributes by index */ - test_attr_open_by_name(new_format, my_fcpl, my_fapl); /* Test opening attributes by name */ - test_attr_create_by_name(new_format, my_fcpl, my_fapl); /* Test creating attributes by name */ - - /* Tests that address specific bugs */ - test_attr_bug1(my_fcpl, my_fapl); /* Test odd allocation operations */ - test_attr_bug2(my_fcpl, my_fapl); /* Test many deleted attributes */ - test_attr_bug3(my_fcpl, my_fapl); /* Test "self referential" attributes */ - test_attr_bug4(my_fcpl, my_fapl); /* Test attributes on named datatypes */ - test_attr_bug5(my_fcpl, - my_fapl); /* Test opening/closing attributes through different file handles */ - test_attr_bug6(my_fcpl, my_fapl); /* Test reading empty attribute */ - /* test_attr_bug7 is specific to the "new" object header format, - * and in fact fails if used with the old format due to the - * attributes being larger than 64K */ - test_attr_bug8(my_fcpl, - my_fapl); /* Test attribute expanding object header with undecoded messages */ - test_attr_bug9(my_fcpl, my_fapl); /* Test large attributes converting to dense storage */ - test_attr_bug10(my_fcpl, my_fapl); /* Test writing an attribute after opening and closing - through a different file handle */ - - /* tests specific to the "new format" */ - if (new_format == true) { - /* General attribute tests */ - test_attr_dense_create(my_fcpl, my_fapl); /* Test dense attribute storage creation */ - test_attr_dense_open(my_fcpl, my_fapl); /* Test opening attributes in dense storage */ - test_attr_dense_delete(my_fcpl, my_fapl); /* Test deleting attributes in dense storage */ - test_attr_dense_rename(my_fcpl, my_fapl); /* Test renaming attributes in dense storage */ - test_attr_dense_unlink( - my_fcpl, my_fapl); /* Test unlinking object with attributes in dense storage */ - test_attr_dense_limits(my_fcpl, my_fapl); /* Test dense attribute storage limits */ - test_attr_dense_dup_ids(my_fcpl, - my_fapl); /* Test duplicated IDs for dense attribute storage */ - - /* Attribute creation order tests */ - test_attr_corder_create_basic( - my_fcpl, my_fapl); /* Test creating an object w/attribute creation order info */ - test_attr_corder_create_compact(my_fcpl, - my_fapl); /* Test compact attribute storage on an object - w/attribute creation order info */ - test_attr_corder_create_dense(my_fcpl, - my_fapl); /* Test dense attribute storage on an object - w/attribute creation order info */ - test_attr_corder_create_reopen(my_fcpl, - my_fapl); /* Test creating attributes w/reopening file from - using new format to using old format */ - test_attr_corder_transition(my_fcpl, - my_fapl); /* Test attribute storage transitions on an object - w/attribute creation order info */ - test_attr_corder_delete(my_fcpl, my_fapl); /* Test deleting object using dense storage - w/attribute creation order info */ - - /* More complex tests with exclusively both "new format" and "shared" attributes */ - if (use_shared == true) { - test_attr_shared_write( - my_fcpl, - my_fapl); /* Test writing to shared attributes in compact & dense storage */ - test_attr_shared_rename( - my_fcpl, - my_fapl); /* Test renaming shared attributes in compact & dense storage */ - test_attr_shared_delete( - my_fcpl, - my_fapl); /* Test deleting shared attributes in compact & dense storage */ - test_attr_shared_unlink(my_fcpl, my_fapl); /* Test unlinking object with shared - attributes in compact & dense storage */ - } /* if using shared attributes */ - -#if 0 /* Native VOL connector only supports large attributes with latest format */ - test_attr_delete_last_dense(my_fcpl, my_fapl); - - /* test_attr_bug7 is specific to the "new" object header format, - * and in fact fails if used with the old format due to the - * attributes being larger than 64K */ - test_attr_bug7(my_fcpl, - my_fapl); /* Test creating and deleting large attributes in ohdr chunk 0 */ -#endif - - } /* if using "new format" */ - } /* for unshared/shared attributes */ - } /* for old/new format */ - - if (minimize_dset_oh != 0) { - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - dcpl_g = H5P_DEFAULT; - } - - } /* for default/minimized dataset object headers */ - - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close FCPLs */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fcpl2); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close FAPLs */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl2); - CHECK(ret, FAIL, "H5Pclose"); -} /* test_attr() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_attr - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_attr(void) -{ - H5Fdelete(FILENAME, H5P_DEFAULT); -} diff --git a/test/API/tchecksum.c b/test/API/tchecksum.c deleted file mode 100644 index 62db33c..0000000 --- a/test/API/tchecksum.c +++ /dev/null @@ -1,246 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*------------------------------------------------------------------------- - * - * Created: tchecksum.c - * - * Purpose: Test internal checksum routine(s) - * - *------------------------------------------------------------------------- - */ - -/***********/ -/* Headers */ -/***********/ -#include "testhdf5.h" - -/**********/ -/* Macros */ -/**********/ -#define BUF_LEN 3093 /* No particular value */ - -/*******************/ -/* Local variables */ -/*******************/ - -/**************************************************************** -** -** test_chksum_size_one(): Checksum 1 byte buffer -** -****************************************************************/ -static void -test_chksum_size_one(void) -{ - uint8_t buf[1] = {23}; /* Buffer to checksum */ - uint32_t chksum; /* Checksum value */ - - /* Buffer w/real data */ - chksum = H5_checksum_fletcher32(buf, sizeof(buf)); - VERIFY(chksum, 0x17001700, "H5_checksum_fletcher32"); - - chksum = H5_checksum_crc(buf, sizeof(buf)); - VERIFY(chksum, 0xfa2568b7, "H5_checksum_crc"); - - chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); - VERIFY(chksum, 0xa209c931, "H5_checksum_lookup3"); - - /* Buffer w/zero(s) for data */ - memset(buf, 0, sizeof(buf)); - chksum = H5_checksum_fletcher32(buf, sizeof(buf)); - VERIFY(chksum, 0, "H5_checksum_fletcher32"); - - chksum = H5_checksum_crc(buf, sizeof(buf)); - VERIFY(chksum, 0xfa60fb57, "H5_checksum_crc"); - - chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); - VERIFY(chksum, 0x8ba9414b, "H5_checksum_lookup3"); -} /* test_chksum_size_one() */ - -/**************************************************************** -** -** test_chksum_size_two(): Checksum 2 byte buffer -** -****************************************************************/ -static void -test_chksum_size_two(void) -{ - uint8_t buf[2] = {23, 187}; /* Buffer to checksum */ - uint32_t chksum; /* Checksum value */ - - /* Buffer w/real data */ - chksum = H5_checksum_fletcher32(buf, sizeof(buf)); - VERIFY(chksum, 0x17bb17bb, "H5_checksum_fletcher32"); - - chksum = H5_checksum_crc(buf, sizeof(buf)); - VERIFY(chksum, 0xfc856608, "H5_checksum_crc"); - - chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); - VERIFY(chksum, 0x8ba7a6c9, "H5_checksum_lookup3"); - - /* Buffer w/zero(s) for data */ - memset(buf, 0, sizeof(buf)); - chksum = H5_checksum_fletcher32(buf, sizeof(buf)); - VERIFY(chksum, 0, "H5_checksum_fletcher32"); - - chksum = H5_checksum_crc(buf, sizeof(buf)); - VERIFY(chksum, 0xfc7e9b20, "H5_checksum_crc"); - - chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); - VERIFY(chksum, 0x62cd61b3, "H5_checksum_lookup3"); -} /* test_chksum_size_two() */ - -/**************************************************************** -** -** test_chksum_size_three(): Checksum 3 byte buffer -** -****************************************************************/ -static void -test_chksum_size_three(void) -{ - uint8_t buf[3] = {23, 187, 98}; /* Buffer to checksum */ - uint32_t chksum; /* Checksum value */ - - /* Buffer w/real data */ - chksum = H5_checksum_fletcher32(buf, sizeof(buf)); - VERIFY(chksum, 0x917679bb, "H5_checksum_fletcher32"); - - chksum = H5_checksum_crc(buf, sizeof(buf)); - VERIFY(chksum, 0xfebc5d70, "H5_checksum_crc"); - - chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); - VERIFY(chksum, 0xcebdf4f0, "H5_checksum_lookup3"); - - /* Buffer w/zero(s) for data */ - memset(buf, 0, sizeof(buf)); - chksum = H5_checksum_fletcher32(buf, sizeof(buf)); - VERIFY(chksum, 0, "H5_checksum_fletcher32"); - - chksum = H5_checksum_crc(buf, sizeof(buf)); - VERIFY(chksum, 0xf9cc4c7a, "H5_checksum_crc"); - - chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); - VERIFY(chksum, 0x6bd0060f, "H5_checksum_lookup3"); -} /* test_chksum_size_three() */ - -/**************************************************************** -** -** test_chksum_size_four(): Checksum 4 byte buffer -** -****************************************************************/ -static void -test_chksum_size_four(void) -{ - uint8_t buf[4] = {23, 187, 98, 217}; /* Buffer to checksum */ - uint32_t chksum; /* Checksum value */ - - /* Buffer w/real data */ - chksum = H5_checksum_fletcher32(buf, sizeof(buf)); - VERIFY(chksum, 0x924f7a94, "H5_checksum_fletcher32"); - - chksum = H5_checksum_crc(buf, sizeof(buf)); - VERIFY(chksum, 0xff398a46, "H5_checksum_crc"); - - chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); - VERIFY(chksum, 0x2c88bb51, "H5_checksum_lookup3"); - - /* Buffer w/zero(s) for data */ - memset(buf, 0, sizeof(buf)); - chksum = H5_checksum_fletcher32(buf, sizeof(buf)); - VERIFY(chksum, 0, "H5_checksum_fletcher32"); - - chksum = H5_checksum_crc(buf, sizeof(buf)); - VERIFY(chksum, 0xff117081, "H5_checksum_crc"); - - chksum = H5_checksum_lookup3(buf, sizeof(buf), 0); - VERIFY(chksum, 0x049396b8, "H5_checksum_lookup3"); -} /* test_chksum_size_four() */ - -/**************************************************************** -** -** test_chksum_large(): Checksum larger buffer -** -****************************************************************/ -static void -test_chksum_large(void) -{ - uint8_t *large_buf; /* Buffer for checksum calculations */ - uint32_t chksum; /* Checksum value */ - size_t u; /* Local index variable */ - - /* Allocate the buffer */ - large_buf = (uint8_t *)malloc((size_t)BUF_LEN); - CHECK_PTR(large_buf, "malloc"); - - /* Initialize buffer w/known data */ - for (u = 0; u < BUF_LEN; u++) - large_buf[u] = (uint8_t)(u * 3); - - /* Buffer w/real data */ - chksum = H5_checksum_fletcher32(large_buf, (size_t)BUF_LEN); - VERIFY(chksum, 0x85b4e2a, "H5_checksum_fletcher32"); - - chksum = H5_checksum_crc(large_buf, (size_t)BUF_LEN); - VERIFY(chksum, 0xfbd0f7c0, "H5_checksum_crc"); - - chksum = H5_checksum_lookup3(large_buf, (size_t)BUF_LEN, 0); - VERIFY(chksum, 0x1bd2ee7b, "H5_checksum_lookup3"); - - /* Buffer w/zero(s) for data */ - memset(large_buf, 0, (size_t)BUF_LEN); - chksum = H5_checksum_fletcher32(large_buf, (size_t)BUF_LEN); - VERIFY(chksum, 0, "H5_checksum_fletcher32"); - - chksum = H5_checksum_crc(large_buf, (size_t)BUF_LEN); - VERIFY(chksum, 0xfac8b4c4, "H5_checksum_crc"); - - chksum = H5_checksum_lookup3(large_buf, (size_t)BUF_LEN, 0); - VERIFY(chksum, 0x930c7afc, "H5_checksum_lookup3"); - - /* Release memory for buffer */ - free(large_buf); -} /* test_chksum_large() */ - -/**************************************************************** -** -** test_checksum(): Main checksum testing routine. -** -****************************************************************/ -void -test_checksum(void) -{ - /* Output message about test being performed */ - MESSAGE(5, ("Testing checksum algorithms\n")); - - /* Various checks for fletcher32 checksum algorithm */ - test_chksum_size_one(); /* Test buffer w/only 1 byte */ - test_chksum_size_two(); /* Test buffer w/only 2 bytes */ - test_chksum_size_three(); /* Test buffer w/only 3 bytes */ - test_chksum_size_four(); /* Test buffer w/only 4 bytes */ - test_chksum_large(); /* Test buffer w/larger # of bytes */ - -} /* test_checksum() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_checksum - * - * Purpose: Cleanup temporary test files - * - * Return: none - * - *------------------------------------------------------------------------- - */ -void -cleanup_checksum(void) -{ - /* no file to clean */ -} diff --git a/test/API/tconfig.c b/test/API/tconfig.c deleted file mode 100644 index 3d49524..0000000 --- a/test/API/tconfig.c +++ /dev/null @@ -1,181 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tconfig - * - * Test the definitions in the H5config.h as much as possible - * - *************************************************************/ - -#include "testhdf5.h" - -/* macros definitions */ -/* verify C int type: verify the size of signed and unsigned int type - * with the macro size. - */ -#define vrfy_cint_type(ctype, uctype, ctype_macro) \ - do { \ - /* check signed type size */ \ - vrfy_macrosize(ctype, ctype_macro, #ctype_macro); \ - /* check unsigned type size */ \ - vrfy_macrosize(uctype, ctype_macro, #ctype_macro); \ - } while (0) - -/* verify C type sizes: verify the sizeof type with the macro size. */ -#define vrfy_ctype(type, macro) \ - do { \ - vrfy_macrosize(type, macro, #macro); \ - } while (0) - -/* verify if the sizeof(type) matches size defined in macro. */ -/* Needs this extra step so that we can print the macro name. */ -#define vrfy_macrosize(type, macro, macroname) \ - if (sizeof(type) != (macro)) \ - TestErrPrintf("Error: sizeof(%s) is %zu but %s is %d\n", #type, sizeof(type), macroname, \ - (int)(macro)); - -/* local routine prototypes */ -void test_config_ctypes(void); -void test_exit_definitions(void); - -/*------------------------------------------------------------------------- - * Function: test_configure - * - * Purpose: Main configure definitions testing routine - * - * Return: none (error is fed back via global variable num_errs) - * - *------------------------------------------------------------------------- - */ -void -test_configure(void) -{ - /* Output message about test being performed */ - MESSAGE(5, ("Testing configure definitions\n")); - test_config_ctypes(); - test_exit_definitions(); -} - -/*------------------------------------------------------------------------- - * Function: cleanup_configure - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_configure(void) -{ - /* no file to clean */ -} - -/*------------------------------------------------------------------------- - * Function: test_config_ctypes - * - * Purpose: test C language data type sizes - * - * Return: none (error is fed back via global variable num_errs) - *------------------------------------------------------------------------- - */ -void -test_config_ctypes(void) -{ - /* standard C89 basic types */ - /* char, signed char, unsigned char are three distinct types. */ - vrfy_ctype(char, H5_SIZEOF_CHAR); - vrfy_cint_type(signed char, unsigned char, H5_SIZEOF_CHAR); - vrfy_cint_type(int, unsigned int, H5_SIZEOF_INT); - vrfy_cint_type(short, unsigned short, H5_SIZEOF_SHORT); - vrfy_cint_type(long, unsigned long, H5_SIZEOF_LONG); - vrfy_ctype(float, H5_SIZEOF_FLOAT); - vrfy_ctype(double, H5_SIZEOF_DOUBLE); - vrfy_ctype(long double, H5_SIZEOF_LONG_DOUBLE); - - /* standard C99 basic types */ - vrfy_cint_type(long long, unsigned long long, H5_SIZEOF_LONG_LONG); - vrfy_cint_type(int8_t, uint8_t, H5_SIZEOF_INT8_T); - vrfy_cint_type(int16_t, uint16_t, H5_SIZEOF_INT16_T); - vrfy_cint_type(int32_t, uint32_t, H5_SIZEOF_INT32_T); - vrfy_cint_type(int64_t, uint64_t, H5_SIZEOF_INT64_T); - - /* Some vendors have different sizes for the signed and unsigned */ - /* fast8_t. Need to check them individually. */ -#if H5_SIZEOF_INT_FAST8_T > 0 - vrfy_ctype(int_fast8_t, H5_SIZEOF_INT_FAST8_T); -#endif - -#if H5_SIZEOF_UINT_FAST8_T > 0 - vrfy_ctype(uint_fast8_t, H5_SIZEOF_UINT_FAST8_T); -#endif - -#if H5_SIZEOF_INT_FAST16_T > 0 - vrfy_cint_type(int_fast16_t, uint_fast16_t, H5_SIZEOF_INT_FAST16_T); -#endif - -#if H5_SIZEOF_INT_FAST32_T > 0 - vrfy_cint_type(int_fast32_t, uint_fast32_t, H5_SIZEOF_INT_FAST32_T); -#endif - -#if H5_SIZEOF_INT_FAST64_T > 0 - vrfy_cint_type(int_fast64_t, uint_fast64_t, H5_SIZEOF_INT_FAST64_T); -#endif - -#if H5_SIZEOF_INT_LEAST8_T > 0 - vrfy_cint_type(int_least8_t, uint_least8_t, H5_SIZEOF_INT_LEAST8_T); -#endif - -#if H5_SIZEOF_INT_LEAST16_T > 0 - vrfy_cint_type(int_least16_t, uint_least16_t, H5_SIZEOF_INT_LEAST16_T); -#endif - -#if H5_SIZEOF_INT_LEAST32_T > 0 - vrfy_cint_type(int_least32_t, uint_least32_t, H5_SIZEOF_INT_LEAST32_T); -#endif - -#if H5_SIZEOF_INT_LEAST64_T > 0 - vrfy_cint_type(int_least64_t, uint_least64_t, H5_SIZEOF_INT_LEAST64_T); -#endif - -#if H5_SIZEOF_OFF_T > 0 - vrfy_ctype(off_t, H5_SIZEOF_OFF_T); -#endif - -#if H5_SIZEOF_SIZE_T > 0 - vrfy_ctype(size_t, H5_SIZEOF_SIZE_T); -#endif - -#if H5_SIZEOF_SSIZE_T > 0 - vrfy_ctype(ssize_t, H5_SIZEOF_SSIZE_T); -#endif -} - -/*------------------------------------------------------------------------- - * Function: test_exit_definitions - * - * Purpose: test the exit macros values - * - * Return: none (error is fed back via global variable num_errs) - *------------------------------------------------------------------------- - */ -void -test_exit_definitions(void) -{ - /* Verify the EXIT_SUCCESS and EXIT_FAILURE are 0 and 1 respectively. */ - /* This should be true for POSIX compliant systems. */ - if (EXIT_SUCCESS != 0) - TestErrPrintf("Error: EXIT_SUCCESS is %d, should be %d\n", EXIT_SUCCESS, 0); - if (EXIT_FAILURE != 1) - TestErrPrintf("Error: EXIT_FAILURE is %d, should be %d\n", EXIT_FAILURE, 1); -} diff --git a/test/API/tcoords.c b/test/API/tcoords.c deleted file mode 100644 index 5599def..0000000 --- a/test/API/tcoords.c +++ /dev/null @@ -1,718 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tcoords - * - * Test the element coordinates for dataspace selection. For - * chunked dataset, when the hyperslab selection of some - * dimensions is full, the library optimize it by "flattening" - * the fully selected dimensions. This program tests if the - * coordinates of selected elements are correctly calculated. - * - *************************************************************/ - -#include "testhdf5.h" - -#define FILENAME "coord.h5" - -#define SINGLE_END_DSET "single_end_dset" -#define MULTI_ENDS_SEL_HYPER_DSET "multiple_ends_dset" - -#define NAME_LEN 128 - -/* Data written to the dataset for single block test. Global variable - * for convenience. */ -int da_buffer[2][3][6][2]; - -/*********************************************************** -** -** test_singleEnd_selElements(): Test element selection of only -** one block. -** -*************************************************************/ -static void -test_singleEnd_selElements(hid_t file, bool is_chunked) -{ - hid_t sid, plid, did, msid; - char dset_name[NAME_LEN]; /* Dataset name */ - size_t elmts_numb; - herr_t ret; /* Generic error return */ - int i, j, k; - hsize_t da_dims[4] = {2, 3, 6, 2}; - hsize_t da_chunksize[4] = {1, 3, 3, 2}; - - /* For testing the full selection in the fastest-growing end */ - int mem1_buffer[1][1][6][2]; - hsize_t mem1_dims[4] = {1, 1, 6, 2}; - hsize_t da_elmts1[12][4] = {{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, - {0, 0, 2, 0}, {0, 0, 2, 1}, {0, 0, 3, 0}, {0, 0, 3, 1}, - {0, 0, 4, 0}, {0, 0, 4, 1}, {0, 0, 5, 0}, {0, 0, 5, 1}}; - - /* For testing the full selection in the slowest-growing end */ - int mem2_buffer[2][3][1][1]; - hsize_t mem2_dims[4] = {2, 3, 1, 1}; - hsize_t da_elmts2[6][4] = {{0, 0, 0, 0}, {0, 1, 0, 0}, {0, 2, 0, 0}, - {1, 0, 0, 0}, {1, 1, 0, 0}, {1, 2, 0, 0}}; - - /* For testing the full selection in the middle dimensions */ - int mem3_buffer[1][3][6][1]; - hsize_t mem3_dims[4] = {1, 3, 6, 1}; - hsize_t da_elmts3[18][4] = {{0, 0, 0, 0}, {0, 0, 1, 0}, {0, 0, 2, 0}, {0, 0, 3, 0}, {0, 0, 4, 0}, - {0, 0, 5, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 1, 2, 0}, {0, 1, 3, 0}, - {0, 1, 4, 0}, {0, 1, 5, 0}, {0, 2, 0, 0}, {0, 2, 1, 0}, {0, 2, 2, 0}, - {0, 2, 3, 0}, {0, 2, 4, 0}, {0, 2, 5, 0}}; - - /* Create and write the dataset */ - sid = H5Screate_simple(4, da_dims, da_dims); - CHECK(sid, FAIL, "H5Screate_simple"); - - plid = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plid, FAIL, "H5Pcreate"); - - if (is_chunked) { - ret = H5Pset_chunk(plid, 4, da_chunksize); - CHECK(ret, FAIL, "H5Pset_chunk"); - } - - /* Construct dataset's name */ - memset(dset_name, 0, (size_t)NAME_LEN); - strcat(dset_name, SINGLE_END_DSET); - if (is_chunked) - strcat(dset_name, "_chunked"); - - did = H5Dcreate2(file, dset_name, H5T_NATIVE_INT, sid, H5P_DEFAULT, plid, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Initialize the data to be written to file */ - for (i = 0; i < 2; i++) { - for (j = 0; j < 3; j++) { - for (k = 0; k < 6; k++) { - da_buffer[i][j][k][0] = i * 100 + j * 10 + k; - da_buffer[i][j][k][1] = i * 100 + j * 10 + k + 1; - } - } - } - - ret = H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, da_buffer); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* ****** Case 1: ****** - * Testing the full selection in the fastest-growing end */ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - elmts_numb = 12; - - ret = H5Sselect_elements(sid, H5S_SELECT_SET, elmts_numb, (const hsize_t *)da_elmts1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Dataspace for memory buffer */ - msid = H5Screate_simple(4, mem1_dims, mem1_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem1_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 6; i++) - for (j = 0; j < 2; j++) - if (da_buffer[0][0][i][j] != mem1_buffer[0][0][i][j]) { - TestErrPrintf("%u: Read different values than written at index 0,0,%d,%d\n", __LINE__, i, j); - } - - /* ****** Case 2: ****** - * Testing the full selection in the slowest-growing end */ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - elmts_numb = 6; - - ret = H5Sselect_elements(sid, H5S_SELECT_SET, elmts_numb, (const hsize_t *)da_elmts2); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Dataspace for memory buffer */ - msid = H5Screate_simple(4, mem2_dims, mem2_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem2_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 2; i++) - for (j = 0; j < 3; j++) - if (da_buffer[i][j][0][0] != mem2_buffer[i][j][0][0]) { - TestErrPrintf("%u: Read different values than written at index %d,%d,0,0, da_buffer = %d, " - "mem2_buffer = %d\n", - __LINE__, i, j, da_buffer[i][j][0][0], mem2_buffer[i][j][0][0]); - } - - /* ****** Case 3: ****** - * Testing the full selection in the middle dimensions */ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - elmts_numb = 18; - - ret = H5Sselect_elements(sid, H5S_SELECT_SET, elmts_numb, (const hsize_t *)da_elmts3); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Dataspace for memory buffer */ - msid = H5Screate_simple(4, mem3_dims, mem3_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem3_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 3; i++) - for (j = 0; j < 6; j++) - if (da_buffer[0][i][j][0] != mem3_buffer[0][i][j][0]) { - TestErrPrintf("%u: Read different values than written at index 0,%d,%d,0\n", __LINE__, i, j); - } - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Pclose(plid); - CHECK(ret, FAIL, "H5Pclose"); -} - -/*********************************************************** -** -** test_singleEnd_selHyperslab(): Test full hyperslab selection -** of only one block. -** -*************************************************************/ -static void -test_singleEnd_selHyperslab(hid_t file, bool is_chunked) -{ - hid_t sid, did, msid; - char dset_name[NAME_LEN]; /* Dataset name */ - herr_t ret; /* Generic error return */ - int i, j; - hsize_t da_dims[4] = {2, 3, 6, 2}; - - /* For testing the full selection in the fastest-growing end */ - int mem1_buffer[1][1][6][2]; - hsize_t mem1_dims[4] = {1, 1, 6, 2}; - hsize_t mem1_start[4] = {0, 0, 0, 0}; - hsize_t mem1_count[4] = {1, 1, 1, 1}; - hsize_t mem1_stride[4] = {1, 1, 1, 1}; - hsize_t mem1_block[4] = {1, 1, 6, 2}; - - /* For testing the full selection in the slowest-growing end */ - int mem2_buffer[2][3][1][1]; - hsize_t mem2_dims[4] = {2, 3, 1, 1}; - hsize_t mem2_start[4] = {0, 0, 0, 0}; - hsize_t mem2_count[4] = {1, 1, 1, 1}; - hsize_t mem2_stride[4] = {1, 1, 1, 1}; - hsize_t mem2_block[4] = {2, 3, 1, 1}; - - /* For testing the full selection in the middle dimensions */ - int mem3_buffer[1][3][6][1]; - hsize_t mem3_dims[4] = {1, 3, 6, 1}; - hsize_t mem3_start[4] = {0, 0, 0, 0}; - hsize_t mem3_count[4] = {1, 1, 1, 1}; - hsize_t mem3_stride[4] = {1, 1, 1, 1}; - hsize_t mem3_block[4] = {1, 3, 6, 1}; - - /* Construct dataset's name */ - memset(dset_name, 0, NAME_LEN); - strcat(dset_name, SINGLE_END_DSET); - if (is_chunked) - strcat(dset_name, "_chunked"); - - /* Dataspace for the dataset in file */ - sid = H5Screate_simple(4, da_dims, da_dims); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* ****** Case 1: ****** - * Testing the full selection in the fastest-growing end */ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, mem1_start, mem1_stride, mem1_count, mem1_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Dataspace for memory buffer */ - msid = H5Screate_simple(4, mem1_dims, mem1_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem1_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 6; i++) - for (j = 0; j < 2; j++) - if (da_buffer[0][0][i][j] != mem1_buffer[0][0][i][j]) { - TestErrPrintf("%u: Read different values than written at index 0,0,%d,%d\n", __LINE__, i, j); - } - - /* ****** Case 2: ****** - * Testing the full selection in the slowest-growing end */ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, mem2_start, mem2_stride, mem2_count, mem2_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Dataspace for memory buffer */ - msid = H5Screate_simple(4, mem2_dims, mem2_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem2_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 2; i++) - for (j = 0; j < 3; j++) - if (da_buffer[i][j][0][0] != mem2_buffer[i][j][0][0]) { - TestErrPrintf("%u: Read different values than written at index %d,%d,0,0\n", __LINE__, i, j); - } - - /* ****** Case 3: ****** - * Testing the full selection in the middle dimensions */ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, mem3_start, mem3_stride, mem3_count, mem3_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Dataspace for memory buffer */ - msid = H5Screate_simple(4, mem3_dims, mem3_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem3_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 3; i++) - for (j = 0; j < 6; j++) - if (da_buffer[0][i][j][0] != mem3_buffer[0][i][j][0]) { - TestErrPrintf("%u: Read different values than written at index 0,%d,%d,0\n", __LINE__, i, j); - } - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} - -/*********************************************************** -** -** test_multiple_end(): Test full hyperslab selection of -** multiple blocks. -** -*************************************************************/ -static void -test_multiple_ends(hid_t file, bool is_chunked) -{ - hid_t sid, plid, did, msid; - char dset_name[NAME_LEN]; /* Dataset name */ - herr_t ret; /* Generic error return */ - int i, j, k, l, m, n, p; - hsize_t da_dims[8] = {4, 5, 3, 4, 2, 3, 6, 2}; - hsize_t da_chunksize[8] = {1, 5, 3, 2, 2, 3, 3, 2}; - struct { - int arr[4][5][3][4][2][3][6][2]; - } *data_buf = NULL; - - /* For testing the full selections in the fastest-growing end and in the middle dimensions */ - struct { - int arr[1][1][1][4][2][1][6][2]; - } *mem1_buffer = NULL; - hsize_t mem1_dims[8] = {1, 1, 1, 4, 2, 1, 6, 2}; - hsize_t mem1_start[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - hsize_t mem1_count[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - hsize_t mem1_stride[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - hsize_t mem1_block[8] = {1, 1, 1, 4, 2, 1, 6, 2}; - - /* For testing the full selections in the slowest-growing end and in the middle dimensions */ - struct { - int arr[4][5][1][4][2][1][1][1]; - } *mem2_buffer = NULL; - hsize_t mem2_dims[8] = {4, 5, 1, 4, 2, 1, 1, 1}; - hsize_t mem2_start[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - hsize_t mem2_count[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - hsize_t mem2_stride[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - hsize_t mem2_block[8] = {4, 5, 1, 4, 2, 1, 1, 1}; - - /* For testing two unadjacent full selections in the middle dimensions */ - struct { - int arr[1][5][3][1][1][3][6][1]; - } *mem3_buffer = NULL; - hsize_t mem3_dims[8] = {1, 5, 3, 1, 1, 3, 6, 1}; - hsize_t mem3_start[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - hsize_t mem3_count[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - hsize_t mem3_stride[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - hsize_t mem3_block[8] = {1, 5, 3, 1, 1, 3, 6, 1}; - - /* For testing the full selections in the fastest-growing end and the slowest-growing end */ - struct { - int arr[4][5][1][1][1][1][6][2]; - } *mem4_buffer = NULL; - hsize_t mem4_dims[8] = {4, 5, 1, 1, 1, 1, 6, 2}; - hsize_t mem4_start[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - hsize_t mem4_count[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - hsize_t mem4_stride[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - hsize_t mem4_block[8] = {4, 5, 1, 1, 1, 1, 6, 2}; - - /* For testing the full selections in the fastest-growing end and slowest-growing end, - * also in the middle dimensions */ - struct { - int arr[4][5][1][4][2][1][6][2]; - } *mem5_buffer = NULL; - hsize_t mem5_dims[8] = {4, 5, 1, 4, 2, 1, 6, 2}; - hsize_t mem5_start[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - hsize_t mem5_count[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - hsize_t mem5_stride[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - hsize_t mem5_block[8] = {4, 5, 1, 4, 2, 1, 6, 2}; - - /* Initialize dynamic arrays */ - data_buf = calloc(1, sizeof(*data_buf)); - CHECK_PTR(data_buf, "calloc"); - mem1_buffer = calloc(1, sizeof(*mem1_buffer)); - CHECK_PTR(data_buf, "calloc"); - mem2_buffer = calloc(1, sizeof(*mem2_buffer)); - CHECK_PTR(data_buf, "calloc"); - mem3_buffer = calloc(1, sizeof(*mem3_buffer)); - CHECK_PTR(data_buf, "calloc"); - mem4_buffer = calloc(1, sizeof(*mem4_buffer)); - CHECK_PTR(data_buf, "calloc"); - mem5_buffer = calloc(1, sizeof(*mem5_buffer)); - CHECK_PTR(data_buf, "calloc"); - - /* Create and write the dataset */ - sid = H5Screate_simple(8, da_dims, da_dims); - CHECK(sid, FAIL, "H5Screate_simple"); - - plid = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plid, FAIL, "H5Pcreate"); - - if (is_chunked) { - ret = H5Pset_chunk(plid, 8, da_chunksize); - CHECK(ret, FAIL, "H5Pset_chunk"); - } - - /* Construct dataset's name */ - memset(dset_name, 0, NAME_LEN); - strcat(dset_name, MULTI_ENDS_SEL_HYPER_DSET); - if (is_chunked) - strcat(dset_name, "_chunked"); - - did = H5Dcreate2(file, dset_name, H5T_NATIVE_INT, sid, H5P_DEFAULT, plid, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - for (i = 0; i < 4; i++) - for (j = 0; j < 5; j++) - for (k = 0; k < 3; k++) - for (l = 0; l < 4; l++) - for (m = 0; m < 2; m++) - for (n = 0; n < 3; n++) - for (p = 0; p < 6; p++) { - data_buf->arr[i][j][k][l][m][n][p][0] = - i * 1000000 + j * 100000 + k * 10000 + l * 1000 + m * 100 + n * 10 + p; - data_buf->arr[i][j][k][l][m][n][p][1] = i * 1000000 + j * 100000 + k * 10000 + - l * 1000 + m * 100 + n * 10 + p + 1; - } - - ret = H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, data_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* ****** Case 1: ****** - * Testing the full selections in the fastest-growing end and in the middle dimensions*/ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, mem1_start, mem1_stride, mem1_count, mem1_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - msid = H5Screate_simple(8, mem1_dims, mem1_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem1_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 4; i++) - for (j = 0; j < 2; j++) - for (k = 0; k < 6; k++) - for (l = 0; l < 2; l++) - if (data_buf->arr[0][0][0][i][j][0][k][l] != mem1_buffer->arr[0][0][0][i][j][0][k][l]) { - TestErrPrintf("%u: Read different values than written at index 0,0,0,%d,%d,0,%d,%d\n", - __LINE__, i, j, k, l); - } - - /* ****** Case 2: ****** - * Testing the full selections in the slowest-growing end and in the middle dimensions*/ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, mem2_start, mem2_stride, mem2_count, mem2_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - msid = H5Screate_simple(8, mem2_dims, mem2_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem2_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 4; i++) - for (j = 0; j < 5; j++) - for (k = 0; k < 4; k++) - for (l = 0; l < 2; l++) - if (data_buf->arr[i][j][0][k][l][0][0][0] != mem2_buffer->arr[i][j][0][k][l][0][0][0]) { - TestErrPrintf("%u: Read different values than written at index %d,%d,0,%d,%d,0,0,0\n", - __LINE__, i, j, k, l); - } - - /* ****** Case 3: ****** - * Testing two unadjacent full selections in the middle dimensions */ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, mem3_start, mem3_stride, mem3_count, mem3_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - msid = H5Screate_simple(8, mem3_dims, mem3_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem3_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 5; i++) - for (j = 0; j < 3; j++) - for (k = 0; k < 3; k++) - for (l = 0; l < 6; l++) - if (data_buf->arr[0][i][j][0][0][k][l][0] != mem3_buffer->arr[0][i][j][0][0][k][l][0]) { - TestErrPrintf("%u: Read different values than written at index 0,%d,%d,0,0,%d,%d,0\n", - __LINE__, i, j, k, l); - } - - /* ****** Case 4: ****** - * Testing the full selections in the fastest-growing end and the slowest-growing end */ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, mem4_start, mem4_stride, mem4_count, mem4_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - msid = H5Screate_simple(8, mem4_dims, mem4_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem4_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 4; i++) - for (j = 0; j < 5; j++) - for (k = 0; k < 6; k++) - for (l = 0; l < 2; l++) - if (data_buf->arr[i][j][0][0][0][0][k][l] != mem4_buffer->arr[i][j][0][0][0][0][k][l]) { - TestErrPrintf("%u: Read different values than written at index %d,%d,0,0,0,0,%d,%d\n", - __LINE__, i, j, k, l); - } - - /* ****** Case 5: ****** - * Testing the full selections in the fastest-growing end and the slowest-growing end, - * and also in the middle dimensions */ - did = H5Dopen2(file, dset_name, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Select the elements in the dataset */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, mem5_start, mem5_stride, mem5_count, mem5_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - msid = H5Screate_simple(8, mem5_dims, mem5_dims); - CHECK(msid, FAIL, "H5Screate_simple"); - - ret = H5Sselect_all(msid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(did, H5T_NATIVE_INT, msid, sid, H5P_DEFAULT, mem5_buffer); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - for (i = 0; i < 4; i++) - for (j = 0; j < 5; j++) - for (k = 0; k < 4; k++) - for (l = 0; l < 2; l++) - for (m = 0; m < 6; m++) - for (n = 0; n < 2; n++) - if (data_buf->arr[i][j][0][k][l][0][m][n] != - mem5_buffer->arr[i][j][0][k][l][0][m][n]) { - TestErrPrintf( - "%u: Read different values than written at index %d,%d,0,%d,%d,0,%d,%d\n", - __LINE__, i, j, k, l, m, n); - } - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Pclose(plid); - CHECK(ret, FAIL, "H5Pclose"); - - free(data_buf); - free(mem1_buffer); - free(mem2_buffer); - free(mem3_buffer); - free(mem4_buffer); - free(mem5_buffer); -} - -/**************************************************************** -** -** test_coords(): Main testing routine. -** -****************************************************************/ -void -test_coords(void) -{ - hid_t fid; - bool is_chunk[2] = {true, false}; - int i; - herr_t ret; /* Generic error return */ - - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - for (i = 0; i < 2; i++) { - /* Test H5Sselect_elements with selection of one block of data */ - test_singleEnd_selElements(fid, is_chunk[i]); - - /* Test H5Sselect_hyperslab with selection of one block of data */ - test_singleEnd_selHyperslab(fid, is_chunk[i]); - - /* Test H5Sselect_hyperslab with selection of multiple blocks of data */ - test_multiple_ends(fid, is_chunk[i]); - } - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} - -/*------------------------------------------------------------------------- - * Function: cleanup_coords - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_coords(void) -{ - H5Fdelete(FILENAME, H5P_DEFAULT); -} diff --git a/test/API/testhdf5.c b/test/API/testhdf5.c deleted file mode 100644 index ca5d0e4..0000000 --- a/test/API/testhdf5.c +++ /dev/null @@ -1,716 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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 - testhdf5.c - HDF5 testing framework main file. - - REMARKS - General test wrapper for HDF5 base library test programs - - DESIGN - Each test function should be implemented as function having no - parameters and returning void (i.e. no return value). They should be put - into the list of AddTest() calls in main() below. Functions which depend - on other functionality should be placed below the AddTest() call for the - base functionality testing. - Each test module should include testhdf5.h and define a unique set of - names for test files they create. - - BUGS/LIMITATIONS - - - */ - -/* ANY new test needs to have a prototype in testhdf5.h */ -#include "testhdf5.h" - -int nerrors = 0; - -char *paraprefix = NULL; /* for command line option para-prefix */ - -/* Length of multi-file VFD filename buffers */ -#define H5TEST_MULTI_FILENAME_LEN 1024 - -uint64_t vol_cap_flags_g = H5VL_CAP_FLAG_NONE; - -/* - * This routine is designed to provide equivalent functionality to 'printf' - * and allow easy replacement for environments which don't have stdin/stdout - * available. (i.e. Windows & the Mac) - */ -H5_ATTR_FORMAT(printf, 1, 2) -int -print_func(const char *format, ...) -{ - va_list arglist; - int ret_value; - - va_start(arglist, format); - ret_value = vprintf(format, arglist); - va_end(arglist); - return ret_value; -} - -/* - * This routine is designed to provide equivalent functionality to 'printf' - * and also increment the error count for the testing framework. - */ -int -TestErrPrintf(const char *format, ...) -{ - va_list arglist; - int ret_value; - - /* Increment the error count */ - nerrors++; - - /* Print the requested information */ - va_start(arglist, format); - ret_value = vprintf(format, arglist); - va_end(arglist); - - /* Return the length of the string produced (like printf() does) */ - return ret_value; -} - -#ifdef H5_HAVE_PARALLEL -/*------------------------------------------------------------------------- - * Function: getenv_all - * - * Purpose: Used to get the environment that the root MPI task has. - * name specifies which environment variable to look for - * val is the string to which the value of that environment - * variable will be copied. - * - * NOTE: The pointer returned by this function is only - * valid until the next call to getenv_all and the data - * stored there must be copied somewhere else before any - * further calls to getenv_all take place. - * - * Return: pointer to a string containing the value of the environment variable - * NULL if the variable doesn't exist in task 'root's environment. - *------------------------------------------------------------------------- - */ -char * -getenv_all(MPI_Comm comm, int root, const char *name) -{ - int mpi_size, mpi_rank, mpi_initialized, mpi_finalized; - int len; - static char *env = NULL; - - assert(name); - - MPI_Initialized(&mpi_initialized); - MPI_Finalized(&mpi_finalized); - - if (mpi_initialized && !mpi_finalized) { - MPI_Comm_rank(comm, &mpi_rank); - MPI_Comm_size(comm, &mpi_size); - assert(root < mpi_size); - - /* The root task does the getenv call - * and sends the result to the other tasks */ - if (mpi_rank == root) { - env = getenv(name); - if (env) { - len = (int)strlen(env); - MPI_Bcast(&len, 1, MPI_INT, root, comm); - MPI_Bcast(env, len, MPI_CHAR, root, comm); - } - else { - /* len -1 indicates that the variable was not in the environment */ - len = -1; - MPI_Bcast(&len, 1, MPI_INT, root, comm); - } - } - else { - MPI_Bcast(&len, 1, MPI_INT, root, comm); - if (len >= 0) { - if (env == NULL) - env = (char *)malloc((size_t)len + 1); - else if (strlen(env) < (size_t)len) - env = (char *)realloc(env, (size_t)len + 1); - - MPI_Bcast(env, len, MPI_CHAR, root, comm); - env[len] = '\0'; - } - else { - if (env) - free(env); - env = NULL; - } - } -#ifndef NDEBUG - MPI_Barrier(comm); -#endif - } - else { - /* use original getenv */ - if (env) - free(env); - env = getenv(name); - } /* end if */ - - return env; -} - -#endif - -/*------------------------------------------------------------------------- - * Function: h5_fileaccess - * - * Purpose: Returns a file access template which is the default template - * but with a file driver, VOL connector, or libver bound set - * according to a constant or environment variable - * - * Return: Success: A file access property list - * Failure: H5I_INVALID_HID - * - *------------------------------------------------------------------------- - */ -hid_t -h5_fileaccess(void) -{ - hid_t fapl_id = H5I_INVALID_HID; - - if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) - goto error; - - /* Finally, check for libver bounds */ - if (h5_get_libver_fapl(fapl_id) < 0) - goto error; - - return fapl_id; - -error: - if (fapl_id != H5I_INVALID_HID) - H5Pclose(fapl_id); - return H5I_INVALID_HID; -} /* end h5_fileaccess() */ - -/*------------------------------------------------------------------------- - * Function: h5_get_libver_fapl - * - * Purpose: Sets the library version bounds for a FAPL according to the - * value in the constant or environment variable "HDF5_LIBVER_BOUNDS". - * - * Return: Success: 0 - * Failure: -1 - * - *------------------------------------------------------------------------- - */ -herr_t -h5_get_libver_fapl(hid_t fapl) -{ - const char *env = NULL; /* HDF5_DRIVER environment variable */ - const char *tok = NULL; /* strtok pointer */ - char *lasts = NULL; /* Context pointer for strtok_r() call */ - char buf[1024]; /* buffer for tokenizing HDF5_DRIVER */ - - /* Get the environment variable, if it exists */ - env = getenv("HDF5_LIBVER_BOUNDS"); -#ifdef HDF5_LIBVER_BOUNDS - /* Use the environment variable, then the compile-time constant */ - if (!env) - env = HDF5_LIBVER_BOUNDS; -#endif - - /* If the environment variable was not set, just return - * without modifying the FAPL. - */ - if (!env || !*env) - goto done; - - /* Get the first 'word' of the environment variable. - * If it's nothing (environment variable was whitespace) - * just return the default fapl. - */ - strncpy(buf, env, sizeof(buf)); - buf[sizeof(buf) - 1] = '\0'; - if (NULL == (tok = HDstrtok_r(buf, " \t\n\r", &lasts))) - goto done; - - if (!strcmp(tok, "latest")) { - /* use the latest format */ - if (H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) - goto error; - } /* end if */ - else { - /* Unknown setting */ - goto error; - } /* end else */ - -done: - return 0; - -error: - return -1; -} /* end h5_get_libver_fapl() */ - -#ifndef HDF5_PARAPREFIX -#define HDF5_PARAPREFIX "" -#endif -static char * -h5_fixname_real(const char *base_name, hid_t fapl, const char *_suffix, char *fullname, size_t size, - bool nest_printf, bool subst_for_superblock) -{ - const char *prefix = NULL; - const char *driver_env_var = NULL; /* HDF5_DRIVER environment variable */ - char *ptr, last = '\0'; - const char *suffix = _suffix; - size_t i, j; - hid_t driver = -1; - int isppdriver = 0; /* if the driver is MPI parallel */ - - if (!base_name || !fullname || size < 1) - return NULL; - - memset(fullname, 0, size); - - /* Determine if driver is set by environment variable. If it is, - * only generate a suffix if fixing the filename for the superblock - * file. */ - driver_env_var = getenv(HDF5_DRIVER); - if (driver_env_var && (H5P_DEFAULT == fapl) && subst_for_superblock) - fapl = H5P_FILE_ACCESS_DEFAULT; - - /* figure out the suffix */ - if (H5P_DEFAULT != fapl) { - if ((driver = H5Pget_driver(fapl)) < 0) - return NULL; - - if (suffix) { - if (H5FD_FAMILY == driver) { - if (subst_for_superblock) - suffix = "-000000.h5"; - else - suffix = nest_printf ? "-%%06d.h5" : "-%06d.h5"; - } - else if (H5FD_MULTI == driver) { - - /* Check the HDF5_DRIVER environment variable in case - * we are using the split driver since both of those - * use the multi VFD under the hood. - */ - if (driver_env_var && !strcmp(driver_env_var, "split")) { - /* split VFD */ - if (subst_for_superblock) - suffix = ".h5.meta"; - } - else { - /* multi VFD */ - if (subst_for_superblock) - suffix = "-s.h5"; - else - suffix = NULL; - } - } - } - } - - /* Must first check fapl is not H5P_DEFAULT (-1) because H5FD_XXX - * could be of value -1 if it is not defined. - */ - isppdriver = ((H5P_DEFAULT != fapl) || driver_env_var) && (H5FD_MPIO == driver); -#if 0 - /* Check HDF5_NOCLEANUP environment setting. - * (The #ifdef is needed to prevent compile failure in case MPI is not - * configured.) - */ - if (isppdriver) { -#ifdef H5_HAVE_PARALLEL - if (getenv_all(MPI_COMM_WORLD, 0, HDF5_NOCLEANUP)) - SetTestNoCleanup(); -#endif /* H5_HAVE_PARALLEL */ - } - else { - if (getenv(HDF5_NOCLEANUP)) - SetTestNoCleanup(); - } -#endif - /* Check what prefix to use for test files. Process HDF5_PARAPREFIX and - * HDF5_PREFIX. - * Use different ones depending on parallel or serial driver used. - * (The #ifdef is needed to prevent compile failure in case MPI is not - * configured.) - */ - if (isppdriver) { -#ifdef H5_HAVE_PARALLEL - /* - * For parallel: - * First use command line option, then the environment - * variable, then try the constant - */ - static int explained = 0; - - prefix = (paraprefix ? paraprefix : getenv_all(MPI_COMM_WORLD, 0, "HDF5_PARAPREFIX")); - - if (!prefix && !explained) { - /* print hint by process 0 once. */ - int mpi_rank; - - MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); - - if (mpi_rank == 0) - printf("*** Hint ***\n" - "You can use environment variable HDF5_PARAPREFIX to " - "run parallel test files in a\n" - "different directory or to add file type prefix. e.g.,\n" - " HDF5_PARAPREFIX=pfs:/PFS/user/me\n" - " export HDF5_PARAPREFIX\n" - "*** End of Hint ***\n"); - - explained = true; -#ifdef HDF5_PARAPREFIX - prefix = HDF5_PARAPREFIX; -#endif /* HDF5_PARAPREFIX */ - } -#endif /* H5_HAVE_PARALLEL */ - } - else { - /* - * For serial: - * First use the environment variable, then try the constant - */ - prefix = getenv("HDF5_PREFIX"); - -#ifdef HDF5_PREFIX - if (!prefix) - prefix = HDF5_PREFIX; -#endif /* HDF5_PREFIX */ - } - - /* Prepend the prefix value to the base name */ - if (prefix && *prefix) { - if (isppdriver) { - /* This is a parallel system */ - char *subdir; - - if (!strcmp(prefix, HDF5_PARAPREFIX)) { - /* - * If the prefix specifies the HDF5_PARAPREFIX directory, then - * default to using the "/tmp/$USER" or "/tmp/$LOGIN" - * directory instead. - */ - char *user, *login; - - user = getenv("USER"); - login = getenv("LOGIN"); - subdir = (user ? user : login); - - if (subdir) { - for (i = 0; i < size && prefix[i]; i++) - fullname[i] = prefix[i]; - - fullname[i++] = '/'; - - for (j = 0; i < size && subdir[j]; ++i, ++j) - fullname[i] = subdir[j]; - } - } - - if (!fullname[0]) { - /* We didn't append the prefix yet */ - strncpy(fullname, prefix, size); - fullname[size - 1] = '\0'; - } - - if (strlen(fullname) + strlen(base_name) + 1 < size) { - /* - * Append the base_name with a slash first. Multiple - * slashes are handled below. - */ - h5_stat_t buf; - - if (HDstat(fullname, &buf) < 0) - /* The directory doesn't exist just yet */ - if (HDmkdir(fullname, (mode_t)0755) < 0 && errno != EEXIST) - /* - * We couldn't make the "/tmp/${USER,LOGIN}" - * subdirectory. Default to PREFIX's original - * prefix value. - */ - strcpy(fullname, prefix); - - strcat(fullname, "/"); - strcat(fullname, base_name); - } - else { - /* Buffer is too small */ - return NULL; - } - } - else { - if (snprintf(fullname, size, "%s/%s", prefix, base_name) == (int)size) - /* Buffer is too small */ - return NULL; - } - } - else if (strlen(base_name) >= size) { - /* Buffer is too small */ - return NULL; - } - else { - strcpy(fullname, base_name); - } - - /* Append a suffix */ - if (suffix) { - if (strlen(fullname) + strlen(suffix) >= size) - return NULL; - - strcat(fullname, suffix); - } - - /* Remove any double slashes in the filename */ - for (ptr = fullname, i = j = 0; ptr && i < size; i++, ptr++) { - if (*ptr != '/' || last != '/') - fullname[j++] = *ptr; - - last = *ptr; - } - - return fullname; -} - -char * -h5_fixname(const char *base_name, hid_t fapl, char *fullname, size_t size) -{ - return (h5_fixname_real(base_name, fapl, ".h5", fullname, size, false, false)); -} - -char * -h5_fixname_superblock(const char *base_name, hid_t fapl_id, char *fullname, size_t size) -{ - return (h5_fixname_real(base_name, fapl_id, ".h5", fullname, size, false, true)); -} - -bool -h5_using_default_driver(const char *drv_name) -{ - bool ret_val = true; - - assert(H5_DEFAULT_VFD == H5FD_SEC2); - - if (!drv_name) - drv_name = getenv(HDF5_DRIVER); - - if (drv_name) - return (!strcmp(drv_name, "sec2") || !strcmp(drv_name, "nomatch")); - - return ret_val; -} - -herr_t -h5_driver_is_default_vfd_compatible(hid_t fapl_id, bool *default_vfd_compatible) -{ - unsigned long feat_flags = 0; - hid_t driver_id = H5I_INVALID_HID; - herr_t ret_value = SUCCEED; - - assert(fapl_id >= 0); - assert(default_vfd_compatible); - - if (fapl_id == H5P_DEFAULT) - fapl_id = H5P_FILE_ACCESS_DEFAULT; - - if ((driver_id = H5Pget_driver(fapl_id)) < 0) - return FAIL; - - if (H5FDdriver_query(driver_id, &feat_flags) < 0) - return FAIL; - - *default_vfd_compatible = (feat_flags & H5FD_FEAT_DEFAULT_VFD_COMPATIBLE); - - return ret_value; -} /* end h5_driver_is_default_vfd_compatible() */ - -int -main(int argc, char *argv[]) -{ -#if defined(H5_PARALLEL_TEST) - MPI_Init(&argc, &argv); -#else - (void)argc; - (void)argv; -#endif - - printf("===================================\n"); - printf("HDF5 TESTS START\n"); - printf("===================================\n"); - - /* Initialize testing framework */ - /* TestInit(argv[0], NULL, NULL); */ - - /* Tests are generally arranged from least to most complexity... */ - /* AddTest("config", test_configure, cleanup_configure, "Configure definitions", NULL); */ - printf("** CONFIGURE DEFINITIONS **\n"); - test_configure(); - printf("\n"); - - /* AddTest("metadata", test_metadata, cleanup_metadata, "Encoding/decoding metadata", NULL); */ - - /* AddTest("checksum", test_checksum, cleanup_checksum, "Checksum algorithm", NULL); */ - printf("** CHECKSUM ALGORITHM **\n"); - test_checksum(); - printf("\n"); - - /* AddTest("tst", test_tst, NULL, "Ternary Search Trees", NULL); */ - - /* AddTest("heap", test_heap, NULL, "Memory Heaps", NULL); */ - - /* AddTest("skiplist", test_skiplist, NULL, "Skip Lists", NULL); */ - - /* AddTest("refstr", test_refstr, NULL, "Reference Counted Strings", NULL); */ - - /* AddTest("file", test_file, cleanup_file, "Low-Level File I/O", NULL); */ - printf("** LOW-LEVEL FILE I/O **\n"); - test_file(); - printf("\n"); - - /* AddTest("objects", test_h5o, cleanup_h5o, "Generic Object Functions", NULL); */ - printf("** GENERIC OBJECT FUNCTIONS **\n"); - test_h5o(); - printf("\n"); - - /* AddTest("h5s", test_h5s, cleanup_h5s, "Dataspaces", NULL); */ - printf("** DATASPACES **\n"); - test_h5s(); - printf("\n"); - - /* AddTest("coords", test_coords, cleanup_coords, "Dataspace coordinates", NULL); */ - printf("** DATASPACE COORDINATES **\n"); - test_coords(); - printf("\n"); - - /* AddTest("sohm", test_sohm, cleanup_sohm, "Shared Object Header Messages", NULL); */ - - /* AddTest("attr", test_attr, cleanup_attr, "Attributes", NULL); */ - printf("** ATTRIBUTES **\n"); - test_attr(); - printf("\n"); - - /* AddTest("select", test_select, cleanup_select, "Selections", NULL); */ - printf("** SELECTIONS **\n"); - test_select(); - printf("\n"); - - /* AddTest("time", test_time, cleanup_time, "Time Datatypes", NULL); */ - printf("** TIME DATATYPES**\n"); - test_time(); - printf("\n"); - - /* AddTest("ref_deprec", test_reference_deprec, cleanup_reference_deprec, "Deprecated References", NULL); - */ - - /* AddTest("ref", test_reference, cleanup_reference, "References", NULL); */ - printf("** REFERENCES **\n"); - test_reference(); - printf("\n"); - - /* AddTest("vltypes", test_vltypes, cleanup_vltypes, "Variable-Length Datatypes", NULL); */ - printf("** VARIABLE-LENGTH DATATYPES **\n"); - test_vltypes(); - printf("\n"); - - /* AddTest("vlstrings", test_vlstrings, cleanup_vlstrings, "Variable-Length Strings", NULL); */ - printf("** VARIABLE-LENGTH STRINGS **\n"); - test_vlstrings(); - printf("\n"); - - /* AddTest("iterate", test_iterate, cleanup_iterate, "Group & Attribute Iteration", NULL); */ - printf("** GROUP & ATTRIBUTE ITERATION **\n"); - test_iterate(); - printf("\n"); - - /* AddTest("array", test_array, cleanup_array, "Array Datatypes", NULL); */ - printf("** ARRAY DATATYPES **\n"); - test_array(); - printf("\n"); - - /* AddTest("genprop", test_genprop, cleanup_genprop, "Generic Properties", NULL); */ - printf("** GENERIC PROPERTIES **\n"); - test_genprop(); - printf("\n"); - - /* AddTest("unicode", test_unicode, cleanup_unicode, "UTF-8 Encoding", NULL); */ - printf("** UTF-8 ENCODING **\n"); - test_unicode(); - printf("\n"); - - /* AddTest("id", test_ids, NULL, "User-Created Identifiers", NULL); */ - printf("** USER-CREATED IDENTIFIERS **\n"); - test_ids(); - printf("\n"); - - /* AddTest("misc", test_misc, cleanup_misc, "Miscellaneous", NULL); */ - printf("** MISCELLANEOUS **\n"); - test_misc(); - printf("\n"); - - /* Display testing information */ - /* TestInfo(argv[0]); */ - - /* Parse command line arguments */ - /* TestParseCmdLine(argc,argv); */ - - /* Perform requested testing */ - /* PerformTests(); */ - - /* Display test summary, if requested */ - /* if (GetTestSummary()) - TestSummary(); */ - - /* Clean up test files, if allowed */ - if (/* GetTestCleanup() && */ !getenv("HDF5_NOCLEANUP")) { - /* TestCleanup(); */ - - printf("TEST CLEANUP\n"); - - H5E_BEGIN_TRY - cleanup_configure(); - cleanup_checksum(); - cleanup_file(); - cleanup_h5o(); - cleanup_h5s(); - cleanup_coords(); - cleanup_attr(); - cleanup_select(); - cleanup_time(); - cleanup_reference(); - cleanup_vltypes(); - cleanup_vlstrings(); - cleanup_iterate(); - cleanup_array(); - cleanup_genprop(); - cleanup_unicode(); - cleanup_misc(); - H5E_END_TRY - - printf("\n"); - } - - /* Release test infrastructure */ - /* TestShutdown(); */ - - /* Exit failure if errors encountered; else exit success. */ - /* No need to print anything since PerformTests() already does. */ - if (nerrors /* GetTestNumErrs() */ > 0) { - printf("** HDF5 tests failed with %d errors **\n", nerrors); - exit(EXIT_FAILURE); - } - else { - printf("** HDF5 tests ran successfully **\n"); - exit(EXIT_SUCCESS); - } -} /* end main() */ diff --git a/test/API/testhdf5.h b/test/API/testhdf5.h deleted file mode 100644 index 4e9e81d..0000000 --- a/test/API/testhdf5.h +++ /dev/null @@ -1,351 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * This header file contains information required for testing the HDF5 library. - */ - -#ifndef TESTHDF5_H -#define TESTHDF5_H - -/* Include generic testing header also */ -/* #include "h5test.h" */ -#include "hdf5.h" -#include "H5private.h" - -#define VERBO_NONE 0 /* None */ -#define VERBO_DEF 3 /* Default */ -#define VERBO_LO 5 /* Low */ -#define VERBO_MED 7 /* Medium */ -#define VERBO_HI 9 /* High */ - -/* Turn off verbose reporting by default */ -#define VERBOSE_MED (false) -#define VERBOSE_HI (false) - -/* Use %ld to print the value because long should cover most cases. */ -/* Used to make certain a return value _is_not_ a value */ -#define CHECK(ret, val, where) \ - do { \ - if (VERBOSE_HI) { \ - print_func(" Call to routine: %15s at line %4d " \ - "in %s returned %ld \n", \ - where, (int)__LINE__, __FILE__, (long)(ret)); \ - } \ - if ((ret) == (val)) { \ - TestErrPrintf("*** UNEXPECTED RETURN from %s is %ld at line %4d " \ - "in %s\n", \ - where, (long)(ret), (int)__LINE__, __FILE__); \ - H5Eprint2(H5E_DEFAULT, stdout); \ - } \ - } while (0) - -#define CHECK_I(ret, where) \ - do { \ - if (VERBOSE_HI) { \ - print_func(" Call to routine: %15s at line %4d in %s returned %ld\n", (where), (int)__LINE__, \ - __FILE__, (long)(ret)); \ - } \ - if ((ret) < 0) { \ - TestErrPrintf("*** UNEXPECTED RETURN from %s is %ld line %4d in %s\n", (where), (long)(ret), \ - (int)__LINE__, __FILE__); \ - H5Eprint2(H5E_DEFAULT, stdout); \ - } \ - } while (0) - -/* Check that a pointer is valid (i.e.: not NULL) */ -#define CHECK_PTR(ret, where) \ - { \ - if (VERBOSE_HI) { \ - print_func(" Call to routine: %15s at line %4d in %s returned %p\n", (where), (int)__LINE__, \ - __FILE__, ((const void *)ret)); \ - } \ - if (!(ret)) { \ - TestErrPrintf("*** UNEXPECTED RETURN from %s is NULL line %4d in %s\n", (where), (int)__LINE__, \ - __FILE__); \ - H5Eprint2(H5E_DEFAULT, stdout); \ - } \ - } - -/* Check that a pointer is NULL */ -#define CHECK_PTR_NULL(ret, where) \ - { \ - if (VERBOSE_HI) { \ - print_func(" Call to routine: %15s at line %4d in %s returned %p\n", (where), (int)__LINE__, \ - __FILE__, ((const void *)ret)); \ - } \ - if (ret) { \ - TestErrPrintf("*** UNEXPECTED RETURN from %s is not NULL line %4d in %s\n", (where), \ - (int)__LINE__, __FILE__); \ - H5Eprint2(H5E_DEFAULT, stdout); \ - } \ - } - -/* Check that two pointers are equal */ -#define CHECK_PTR_EQ(ret, val, where) \ - { \ - if (VERBOSE_HI) { \ - print_func(" Call to routine: %15s at line %4d in %s returned %p\n", (where), (int)__LINE__, \ - __FILE__, (const void *)(ret)); \ - } \ - if (ret != val) { \ - TestErrPrintf( \ - "*** UNEXPECTED RETURN from %s: returned value of %p is not equal to %p line %4d in %s\n", \ - (where), (const void *)(ret), (const void *)(val), (int)__LINE__, __FILE__); \ - H5Eprint2(H5E_DEFAULT, stdout); \ - } \ - } - -/* Used to make certain a return value _is_ a value */ -#define VERIFY(_x, _val, where) \ - do { \ - long __x = (long)_x, __val = (long)_val; \ - if (VERBOSE_HI) { \ - print_func(" Call to routine: %15s at line %4d in %s had value " \ - "%ld \n", \ - (where), (int)__LINE__, __FILE__, __x); \ - } \ - if ((__x) != (__val)) { \ - TestErrPrintf("*** UNEXPECTED VALUE from %s should be %ld, but is %ld at line %4d " \ - "in %s\n", \ - (where), __val, __x, (int)__LINE__, __FILE__); \ - H5Eprint2(H5E_DEFAULT, stdout); \ - } \ - } while (0) - -/* Used to make certain a (non-'long' type's) return value _is_ a value */ -#define VERIFY_TYPE(_x, _val, _type, _format, where) \ - do { \ - _type __x = (_type)_x, __val = (_type)_val; \ - if (VERBOSE_HI) { \ - print_func(" Call to routine: %15s at line %4d in %s had value " _format " \n", (where), \ - (int)__LINE__, __FILE__, __x); \ - } \ - if ((__x) != (__val)) { \ - TestErrPrintf("*** UNEXPECTED VALUE from %s should be " _format ", but is " _format \ - " at line %4d " \ - "in %s\n", \ - (where), __val, __x, (int)__LINE__, __FILE__); \ - H5Eprint2(H5E_DEFAULT, stdout); \ - } \ - } while (0) - -/* Used to make certain a string return value _is_ a value */ -#define VERIFY_STR(x, val, where) \ - do { \ - if (VERBOSE_HI) { \ - print_func(" Call to routine: %15s at line %4d in %s had value " \ - "%s \n", \ - (where), (int)__LINE__, __FILE__, x); \ - } \ - if (strcmp(x, val) != 0) { \ - TestErrPrintf("*** UNEXPECTED VALUE from %s should be %s, but is %s at line %4d " \ - "in %s\n", \ - where, val, x, (int)__LINE__, __FILE__); \ - H5Eprint2(H5E_DEFAULT, stdout); \ - } \ - } while (0) - -/* Used to document process through a test and to check for errors */ -#define RESULT(ret, func) \ - do { \ - if (VERBOSE_MED) { \ - print_func(" Call to routine: %15s at line %4d in %s returned " \ - "%ld\n", \ - func, (int)__LINE__, __FILE__, (long)(ret)); \ - } \ - if (VERBOSE_HI) \ - H5Eprint2(H5E_DEFAULT, stdout); \ - if ((ret) == FAIL) { \ - TestErrPrintf("*** UNEXPECTED RETURN from %s is %ld at line %4d " \ - "in %s\n", \ - func, (long)(ret), (int)__LINE__, __FILE__); \ - H5Eprint2(H5E_DEFAULT, stdout); \ - } \ - } while (0) - -/* Used to document process through a test */ -#if defined(H5_HAVE_PARALLEL) && defined(H5_PARALLEL_TEST) -#define MESSAGE(V, A) \ - { \ - int mpi_rank; \ - \ - MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); \ - if (mpi_rank == 0 && VERBO_LO /* HDGetTestVerbosity() */ >= (V)) \ - print_func A; \ - } -#else /* H5_HAVE_PARALLEL */ -#define MESSAGE(V, A) \ - { \ - if (VERBO_LO /* HDGetTestVerbosity() */ >= (V)) \ - print_func A; \ - } -#endif /* H5_HAVE_PARALLEL */ - -/* Used to indicate an error that is complex to check for */ -#define ERROR(where) \ - do { \ - if (VERBOSE_HI) \ - print_func(" Call to routine: %15s at line %4d in %s returned " \ - "invalid result\n", \ - where, (int)__LINE__, __FILE__); \ - TestErrPrintf("*** UNEXPECTED RESULT from %s at line %4d in %s\n", where, (int)__LINE__, __FILE__); \ - } while (0) - -/* definitions for command strings */ -#define VERBOSITY_STR "Verbosity" -#define SKIP_STR "Skip" -#define TEST_STR "Test" -#define CLEAN_STR "Cleanup" - -#define AT() printf(" at %s:%d in %s()...\n", __FILE__, __LINE__, __func__); -#define TESTING(WHAT) \ - { \ - printf("Testing %-62s", WHAT); \ - fflush(stdout); \ - } -#define TESTING_2(WHAT) \ - { \ - printf(" Testing %-60s", WHAT); \ - fflush(stdout); \ - } -#define PASSED() \ - { \ - puts(" PASSED"); \ - fflush(stdout); \ - } -#define H5_FAILED() \ - { \ - puts("*FAILED*"); \ - fflush(stdout); \ - } -#define H5_WARNING() \ - { \ - puts("*WARNING*"); \ - fflush(stdout); \ - } -#define SKIPPED() \ - { \ - puts(" -SKIP-"); \ - fflush(stdout); \ - } -#define PUTS_ERROR(s) \ - { \ - puts(s); \ - AT(); \ - goto error; \ - } -#define TEST_ERROR \ - { \ - H5_FAILED(); \ - AT(); \ - goto error; \ - } -#define STACK_ERROR \ - { \ - H5Eprint2(H5E_DEFAULT, stdout); \ - goto error; \ - } -#define FAIL_STACK_ERROR \ - { \ - H5_FAILED(); \ - AT(); \ - H5Eprint2(H5E_DEFAULT, stdout); \ - goto error; \ - } -#define FAIL_PUTS_ERROR(s) \ - { \ - H5_FAILED(); \ - AT(); \ - puts(s); \ - goto error; \ - } - -#ifdef __cplusplus -extern "C" { -#endif - -extern int nerrors; - -int print_func(const char *format, ...); -int TestErrPrintf(const char *format, ...); -hid_t h5_fileaccess(void); -/* Functions that will replace components of a FAPL */ -herr_t h5_get_vfd_fapl(hid_t fapl_id); -herr_t h5_get_libver_fapl(hid_t fapl_id); -char *h5_fixname(const char *base_name, hid_t fapl, char *fullname, size_t size); -char *h5_fixname_superblock(const char *base_name, hid_t fapl, char *fullname, size_t size); -bool h5_using_default_driver(const char *drv_name); -herr_t h5_driver_is_default_vfd_compatible(hid_t fapl_id, bool *default_vfd_compatible); - -#ifdef H5_HAVE_PARALLEL -char *getenv_all(MPI_Comm comm, int root, const char *name); -#endif - -/* Prototypes for the test routines */ -void test_metadata(void); -void test_checksum(void); -void test_refstr(void); -void test_file(void); -void test_h5o(void); -void test_h5t(void); -void test_h5s(void); -void test_coords(void); -void test_h5d(void); -void test_attr(void); -void test_select(void); -void test_time(void); -void test_reference(void); -void test_reference_deprec(void); -void test_vltypes(void); -void test_vlstrings(void); -void test_iterate(void); -void test_array(void); -void test_genprop(void); -void test_configure(void); -void test_h5_system(void); -void test_misc(void); -void test_ids(void); -void test_skiplist(void); -void test_sohm(void); -void test_unicode(void); - -/* Prototypes for the cleanup routines */ -void cleanup_metadata(void); -void cleanup_checksum(void); -void cleanup_file(void); -void cleanup_h5o(void); -void cleanup_h5s(void); -void cleanup_coords(void); -void cleanup_attr(void); -void cleanup_select(void); -void cleanup_time(void); -void cleanup_reference(void); -void cleanup_reference_deprec(void); -void cleanup_vltypes(void); -void cleanup_vlstrings(void); -void cleanup_iterate(void); -void cleanup_array(void); -void cleanup_genprop(void); -void cleanup_configure(void); -void cleanup_h5_system(void); -void cleanup_sohm(void); -void cleanup_misc(void); -void cleanup_unicode(void); - -/* Extern global variables */ -extern uint64_t vol_cap_flags_g; - -#ifdef __cplusplus -} -#endif -#endif /* TESTHDF5_H */ diff --git a/test/API/tfile.c b/test/API/tfile.c deleted file mode 100644 index 6b316d4..0000000 --- a/test/API/tfile.c +++ /dev/null @@ -1,8369 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tfile - * - * Test the low-level file I/O features. - * - *************************************************************/ - -#include "testhdf5.h" -/* #include "H5srcdir.h" */ - -/* #include "H5Iprivate.h" */ -/* #include "H5Pprivate.h" */ -/* #include "H5VLprivate.h" */ /* Virtual Object Layer */ - -#if 0 -/* - * This file needs to access private information from the H5F package. - * This file also needs to access the file testing code. - */ -#define H5F_FRIEND /*suppress error about including H5Fpkg */ -#define H5F_TESTING -#include "H5Fpkg.h" /* File access */ - -#define H5FD_FRIEND /*suppress error about including H5FDpkg.h */ -#define H5FD_TESTING -#include "H5FDpkg.h" - -#define H5D_FRIEND /*suppress error about including H5Dpkg */ -#include "H5Dpkg.h" /* Dataset access */ - -#define H5S_FRIEND /*suppress error about including H5Spkg */ -#include "H5Spkg.h" /* Dataspace */ - -#define H5T_FRIEND /*suppress error about including H5Tpkg */ -#include "H5Tpkg.h" /* Datatype */ - -#define H5A_FRIEND /*suppress error about including H5Apkg */ -#include "H5Apkg.h" /* Attributes */ - -#define H5O_FRIEND /*suppress error about including H5Opkg */ -#include "H5Opkg.h" /* Object headers */ -#endif - -#define BAD_USERBLOCK_SIZE1 (hsize_t)1 -#define BAD_USERBLOCK_SIZE2 (hsize_t)2 -#define BAD_USERBLOCK_SIZE3 (hsize_t)3 -#define BAD_USERBLOCK_SIZE4 (hsize_t)64 -#define BAD_USERBLOCK_SIZE5 (hsize_t)511 -#define BAD_USERBLOCK_SIZE6 (hsize_t)513 -#define BAD_USERBLOCK_SIZE7 (hsize_t)6144 - -#define F1_USERBLOCK_SIZE (hsize_t)0 -#define F1_OFFSET_SIZE sizeof(haddr_t) -#define F1_LENGTH_SIZE sizeof(hsize_t) -#define F1_SYM_LEAF_K 4 -#define F1_SYM_INTERN_K 16 -#define FILE1 "tfile1.h5" -#define SFILE1 "sys_file1" - -#define REOPEN_FILE "tfile_reopen.h5" -#define REOPEN_DSET "dset" - -#define F2_USERBLOCK_SIZE (hsize_t)512 -#define F2_OFFSET_SIZE 8 -#define F2_LENGTH_SIZE 8 -#define F2_SYM_LEAF_K 8 -#define F2_SYM_INTERN_K 32 -#define F2_RANK 2 -#define F2_DIM0 4 -#define F2_DIM1 6 -#define F2_DSET "dset" -#define FILE2 "tfile2.h5" - -#define F3_USERBLOCK_SIZE (hsize_t)0 -#define F3_OFFSET_SIZE F2_OFFSET_SIZE -#define F3_LENGTH_SIZE F2_LENGTH_SIZE -#define F3_SYM_LEAF_K F2_SYM_LEAF_K -#define F3_SYM_INTERN_K F2_SYM_INTERN_K -#define FILE3 "tfile3.h5" - -#define GRP_NAME "/group" -#define DSET_NAME "dataset" -#define ATTR_NAME "attr" -#define TYPE_NAME "type" -#define FILE4 "tfile4.h5" - -#define OBJ_ID_COUNT_0 0 -#define OBJ_ID_COUNT_1 1 -#define OBJ_ID_COUNT_2 2 -#define OBJ_ID_COUNT_3 3 -#define OBJ_ID_COUNT_4 4 -#define OBJ_ID_COUNT_6 6 -#define OBJ_ID_COUNT_8 8 - -#define GROUP1 "Group1" -#define DSET1 "Dataset1" -#define DSET2 "/Group1/Dataset2" - -#define TESTA_GROUPNAME "group" -#define TESTA_DSETNAME "dataset" -#define TESTA_ATTRNAME "attribute" -#define TESTA_DTYPENAME "compound" -#define TESTA_NAME_BUF_SIZE 64 -#define TESTA_RANK 2 -#define TESTA_NX 4 -#define TESTA_NY 5 - -#define USERBLOCK_SIZE ((hsize_t)512) - -/* Declarations for test_filespace_*() */ -#define FILENAME_LEN 1024 /* length of file name */ -#define DSETNAME "dset" /* Name of dataset */ -#define NELMTS(X) (sizeof(X) / sizeof(X[0])) /* # of elements */ -#define READ_OLD_BUFSIZE 1024 /* Buffer for holding file data */ -#define FILE5 "tfile5.h5" /* Test file */ -#define TEST_THRESHOLD10 10 /* Free space section threshold */ -#define FSP_SIZE_DEF 4096 /* File space page size default */ -#define FSP_SIZE512 512 /* File space page size */ -#define FSP_SIZE1G (1024 * 1024 * 1024) /* File space page size */ - -/* Declaration for test_libver_macros2() */ -#define FILE6 "tfile6.h5" /* Test file */ - -/* Declaration for test_get_obj_ids() */ -#define FILE7 "tfile7.h5" /* Test file */ -#define NGROUPS 2 -#define NDSETS 4 - -/* Declaration for test_incr_filesize() */ -#define FILE8 "tfile8.h5" /* Test file */ - -/* Files created under 1.6 branch and 1.8 branch--used in test_filespace_compatible() */ -const char *OLD_FILENAME[] = { - "filespace_1_6.h5", /* 1.6 HDF5 file */ - "filespace_1_8.h5" /* 1.8 HDF5 file */ -}; - -/* Files created in 1.10.0 release --used in test_filespace_1.10.0_compatible() */ -/* These files are copied from release 1.10.0 tools/h5format_convert/testfiles */ -const char *OLD_1_10_0_FILENAME[] = { - "h5fc_ext1_i.h5", /* 0 */ - "h5fc_ext1_f.h5", /* 1 */ - "h5fc_ext2_if.h5", /* 2 */ - "h5fc_ext2_sf.h5", /* 3 */ - "h5fc_ext3_isf.h5", /* 4 */ - "h5fc_ext_none.h5" /* 5 */ -}; - -/* Files used in test_filespace_round_compatible() */ -const char *FSPACE_FILENAMES[] = { - "fsm_aggr_nopersist.h5", /* H5F_FILE_SPACE_AGGR, not persisting free-space */ - "fsm_aggr_persist.h5", /* H5F_FILE_SPACE_AGGR, persisting free-space */ - "paged_nopersist.h5", /* H5F_FILE_SPACE_PAGE, not persisting free-space */ - "paged_persist.h5", /* H5F_FILE_SPACE_PAGE, persisting free-space */ - "aggr.h5", /* H5F_FILE_SPACE_AGGR */ - "none.h5" /* H5F_FILE_SPACE_NONE */ -}; - -const char *FILESPACE_NAME[] = {"tfilespace.h5", NULL}; - -/* Declarations for test_libver_bounds_copy(): */ -/* SRC_FILE: source file created under 1.8 branch with latest format */ -/* DST_FILE: destination file for copying the dataset in SRC_FILE */ -/* DSET_DS1: the dataset created in SRC_FILE to be copied to DST_FILE */ -#define SRC_FILE "fill18.h5" -#define DST_FILE "fill18_copy.h5" -#define DSET_DS1 "DS1" - -#if 0 -/* Local test function declarations for version bounds */ -static void test_libver_bounds_low_high(const char *env_h5_drvr); -static void test_libver_bounds_super(hid_t fapl, const char *env_h5_drvr); -static void test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr, htri_t non_def_fsm); -static void test_libver_bounds_super_open(hid_t fapl, hid_t fcpl, htri_t is_swmr, htri_t non_def_fsm); -static void test_libver_bounds_obj(hid_t fapl); -static void test_libver_bounds_dataset(hid_t fapl); -static void test_libver_bounds_dataspace(hid_t fapl); -static void test_libver_bounds_datatype(hid_t fapl); -static void test_libver_bounds_datatype_check(hid_t fapl, hid_t tid); -static void test_libver_bounds_attributes(hid_t fapl); -#endif - -#define DSET_NULL "DSET_NULL" -#define DSET "DSET" -#define DSETA "DSETA" -#define DSETB "DSETB" -#define DSETC "DSETC" - -#if 0 -static void -create_objects(hid_t, hid_t, hid_t *, hid_t *, hid_t *, hid_t *); -static void -test_obj_count_and_id(hid_t, hid_t, hid_t, hid_t, hid_t, hid_t); -static void -check_file_id(hid_t, hid_t); -#endif - -#if 0 -/* Helper routine used by test_rw_noupdate() */ -static int cal_chksum(const char *file, uint32_t *chksum); - -static void test_rw_noupdate(void); -#endif - -/**************************************************************** -** -** test_file_create(): Low-level file creation I/O test routine. -** -****************************************************************/ -static void -test_file_create(void) -{ - hid_t fid1 = H5I_INVALID_HID; - hid_t fid2 = H5I_INVALID_HID; - hid_t fid3 = H5I_INVALID_HID; /* HDF5 File IDs */ - hid_t tmpl1, tmpl2; /* file creation templates */ - hsize_t ublock; /* sizeof userblock */ - size_t parm; /* file-creation parameters */ - size_t parm2; /* file-creation parameters */ - unsigned iparm; - unsigned iparm2; - herr_t ret; /*generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Low-Level File Creation I/O\n")); - - /* First ensure the file does not exist */ - H5E_BEGIN_TRY - { - H5Fdelete(FILE1, H5P_DEFAULT); - } - H5E_END_TRY - - /* Try opening a non-existent file */ - H5E_BEGIN_TRY - { - fid1 = H5Fopen(FILE1, H5F_ACC_RDWR, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(fid1, FAIL, "H5Fopen"); - - /* Test create with various sequences of H5F_ACC_EXCL and */ - /* H5F_ACC_TRUNC flags */ - - /* Create with H5F_ACC_EXCL */ - fid1 = H5Fcreate(FILE1, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) { - /* - * try to create the same file with H5F_ACC_TRUNC. This should fail - * because fid1 is the same file and is currently open. - */ - H5E_BEGIN_TRY - { - fid2 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Fcreate"); - } - - /* Close all files */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - H5E_BEGIN_TRY - { - ret = H5Fclose(fid2); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fclose"); /*file should not have been open */ - - /* - * Try again with H5F_ACC_EXCL. This should fail because the file already - * exists from the previous steps. - */ - H5E_BEGIN_TRY - { - fid1 = H5Fcreate(FILE1, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(fid1, FAIL, "H5Fcreate"); - - /* Test create with H5F_ACC_TRUNC. This will truncate the existing file. */ - fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) { - /* - * Try to truncate first file again. This should fail because fid1 is the - * same file and is currently open. - */ - H5E_BEGIN_TRY - { - fid2 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Fcreate"); - } - - /* - * Try with H5F_ACC_EXCL. This should fail too because the file already - * exists. - */ - H5E_BEGIN_TRY - { - fid2 = H5Fcreate(FILE1, H5F_ACC_EXCL, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Fcreate"); - - /* Get the file-creation template */ - tmpl1 = H5Fget_create_plist(fid1); - CHECK(tmpl1, FAIL, "H5Fget_create_plist"); - - /* Get the file-creation parameters */ - ret = H5Pget_userblock(tmpl1, &ublock); - CHECK(ret, FAIL, "H5Pget_userblock"); - VERIFY(ublock, F1_USERBLOCK_SIZE, "H5Pget_userblock"); - - ret = H5Pget_sizes(tmpl1, &parm, &parm2); - CHECK(ret, FAIL, "H5Pget_sizes"); - VERIFY(parm, F1_OFFSET_SIZE, "H5Pget_sizes"); - VERIFY(parm2, F1_LENGTH_SIZE, "H5Pget_sizes"); - - ret = H5Pget_sym_k(tmpl1, &iparm, &iparm2); - CHECK(ret, FAIL, "H5Pget_sym_k"); - VERIFY(iparm, F1_SYM_INTERN_K, "H5Pget_sym_k"); - VERIFY(iparm2, F1_SYM_LEAF_K, "H5Pget_sym_k"); - - /* Release file-creation template */ - ret = H5Pclose(tmpl1); - CHECK(ret, FAIL, "H5Pclose"); - -#ifdef LATER - /* Double-check that the atom has been vaporized */ - ret = H5Pclose(tmpl1); - VERIFY(ret, FAIL, "H5Pclose"); -#endif - - if (h5_using_default_driver(NULL)) { - - /* Create a new file with a non-standard file-creation template */ - tmpl1 = H5Pcreate(H5P_FILE_CREATE); - CHECK(tmpl1, FAIL, "H5Pcreate"); - - /* Try setting some bad userblock sizes */ - H5E_BEGIN_TRY - { - ret = H5Pset_userblock(tmpl1, BAD_USERBLOCK_SIZE1); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_userblock"); - H5E_BEGIN_TRY - { - ret = H5Pset_userblock(tmpl1, BAD_USERBLOCK_SIZE2); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_userblock"); - H5E_BEGIN_TRY - { - ret = H5Pset_userblock(tmpl1, BAD_USERBLOCK_SIZE3); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_userblock"); - H5E_BEGIN_TRY - { - ret = H5Pset_userblock(tmpl1, BAD_USERBLOCK_SIZE4); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_userblock"); - H5E_BEGIN_TRY - { - ret = H5Pset_userblock(tmpl1, BAD_USERBLOCK_SIZE5); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_userblock"); - H5E_BEGIN_TRY - { - ret = H5Pset_userblock(tmpl1, BAD_USERBLOCK_SIZE6); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_userblock"); - H5E_BEGIN_TRY - { - ret = H5Pset_userblock(tmpl1, BAD_USERBLOCK_SIZE7); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_userblock"); - - /* Set the new file-creation parameters */ - ret = H5Pset_userblock(tmpl1, F2_USERBLOCK_SIZE); - CHECK(ret, FAIL, "H5Pset_userblock"); - - ret = H5Pset_sizes(tmpl1, (size_t)F2_OFFSET_SIZE, (size_t)F2_LENGTH_SIZE); - CHECK(ret, FAIL, "H5Pset_sizes"); - - ret = H5Pset_sym_k(tmpl1, F2_SYM_INTERN_K, F2_SYM_LEAF_K); - CHECK(ret, FAIL, "H5Pset_sym_k"); - - /* - * Try to create second file, with non-standard file-creation template - * params. - */ - fid2 = H5Fcreate(FILE2, H5F_ACC_TRUNC, tmpl1, H5P_DEFAULT); - CHECK(fid2, FAIL, "H5Fcreate"); - - /* Release file-creation template */ - ret = H5Pclose(tmpl1); - CHECK(ret, FAIL, "H5Pclose"); - - /* Make certain we can create a dataset properly in the file with the userblock */ - { - hid_t dataset_id, dataspace_id; /* identifiers */ - hsize_t dims[F2_RANK]; - unsigned data[F2_DIM0][F2_DIM1]; - unsigned i, j; - - /* Create the data space for the dataset. */ - dims[0] = F2_DIM0; - dims[1] = F2_DIM1; - dataspace_id = H5Screate_simple(F2_RANK, dims, NULL); - CHECK(dataspace_id, FAIL, "H5Screate_simple"); - - /* Create the dataset. */ - dataset_id = H5Dcreate2(fid2, F2_DSET, H5T_NATIVE_UINT, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(dataset_id, FAIL, "H5Dcreate2"); - - for (i = 0; i < F2_DIM0; i++) - for (j = 0; j < F2_DIM1; j++) - data[i][j] = i * 10 + j; - - /* Write data to the new dataset */ - ret = H5Dwrite(dataset_id, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* End access to the dataset and release resources used by it. */ - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Terminate access to the data space. */ - ret = H5Sclose(dataspace_id); - CHECK(ret, FAIL, "H5Sclose"); - } - - /* Get the file-creation template */ - tmpl1 = H5Fget_create_plist(fid2); - CHECK(tmpl1, FAIL, "H5Fget_create_plist"); - - /* Get the file-creation parameters */ - ret = H5Pget_userblock(tmpl1, &ublock); - CHECK(ret, FAIL, "H5Pget_userblock"); - VERIFY(ublock, F2_USERBLOCK_SIZE, "H5Pget_userblock"); - - ret = H5Pget_sizes(tmpl1, &parm, &parm2); - CHECK(ret, FAIL, "H5Pget_sizes"); - VERIFY(parm, F2_OFFSET_SIZE, "H5Pget_sizes"); - VERIFY(parm2, F2_LENGTH_SIZE, "H5Pget_sizes"); - - ret = H5Pget_sym_k(tmpl1, &iparm, &iparm2); - CHECK(ret, FAIL, "H5Pget_sym_k"); - VERIFY(iparm, F2_SYM_INTERN_K, "H5Pget_sym_k"); - VERIFY(iparm2, F2_SYM_LEAF_K, "H5Pget_sym_k"); - - /* Clone the file-creation template */ - tmpl2 = H5Pcopy(tmpl1); - CHECK(tmpl2, FAIL, "H5Pcopy"); - - /* Release file-creation template */ - ret = H5Pclose(tmpl1); - CHECK(ret, FAIL, "H5Pclose"); - - /* Set the new file-creation parameter */ - ret = H5Pset_userblock(tmpl2, F3_USERBLOCK_SIZE); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* - * Try to create second file, with non-standard file-creation template - * params - */ - fid3 = H5Fcreate(FILE3, H5F_ACC_TRUNC, tmpl2, H5P_DEFAULT); - CHECK(fid3, FAIL, "H5Fcreate"); - - /* Release file-creation template */ - ret = H5Pclose(tmpl2); - CHECK(ret, FAIL, "H5Pclose"); - - /* Get the file-creation template */ - tmpl1 = H5Fget_create_plist(fid3); - CHECK(tmpl1, FAIL, "H5Fget_create_plist"); - - /* Get the file-creation parameters */ - ret = H5Pget_userblock(tmpl1, &ublock); - CHECK(ret, FAIL, "H5Pget_userblock"); - VERIFY(ublock, F3_USERBLOCK_SIZE, "H5Pget_userblock"); - - ret = H5Pget_sizes(tmpl1, &parm, &parm2); - CHECK(ret, FAIL, "H5Pget_sizes"); - VERIFY(parm, F3_OFFSET_SIZE, "H5Pget_sizes"); - VERIFY(parm2, F3_LENGTH_SIZE, "H5Pget_sizes"); - - ret = H5Pget_sym_k(tmpl1, &iparm, &iparm2); - CHECK(ret, FAIL, "H5Pget_sym_k"); - VERIFY(iparm, F3_SYM_INTERN_K, "H5Pget_sym_k"); - VERIFY(iparm2, F3_SYM_LEAF_K, "H5Pget_sym_k"); - - /* Release file-creation template */ - ret = H5Pclose(tmpl1); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close second file */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close third file */ - ret = H5Fclose(fid3); - CHECK(ret, FAIL, "H5Fclose"); - } - - /* Close first file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_file_create() */ - -/**************************************************************** -** -** test_file_open(): Low-level file open I/O test routine. -** -****************************************************************/ -static void -test_file_open(const char *env_h5_drvr) -{ - hid_t fid1; /*HDF5 File IDs */ -#if 0 - hid_t fid2; - hid_t did; /*dataset ID */ - hid_t fapl_id; /*file access property list ID */ -#endif - hid_t tmpl1; /*file creation templates */ - hsize_t ublock; /*sizeof user block */ - size_t parm; /*file-creation parameters */ - size_t parm2; /*file-creation parameters */ - unsigned iparm; - unsigned iparm2; - unsigned intent; - herr_t ret; /*generic return value */ - - /* - * Test single file open - */ - - /* Only run this test with sec2/default driver */ - if (!h5_using_default_driver(env_h5_drvr)) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Low-Level File Opening I/O\n")); - - /* Open first file */ - fid1 = H5Fopen(FILE2, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Get the intent */ - ret = H5Fget_intent(fid1, &intent); - CHECK(ret, FAIL, "H5Fget_intent"); - VERIFY(intent, H5F_ACC_RDWR, "H5Fget_intent"); - - /* Get the file-creation template */ - tmpl1 = H5Fget_create_plist(fid1); - CHECK(tmpl1, FAIL, "H5Fget_create_plist"); - - /* Get the file-creation parameters */ - ret = H5Pget_userblock(tmpl1, &ublock); - CHECK(ret, FAIL, "H5Pget_userblock"); - VERIFY(ublock, F2_USERBLOCK_SIZE, "H5Pget_userblock"); - - ret = H5Pget_sizes(tmpl1, &parm, &parm2); - CHECK(ret, FAIL, "H5Pget_sizes"); - VERIFY(parm, F2_OFFSET_SIZE, "H5Pget_sizes"); - VERIFY(parm2, F2_LENGTH_SIZE, "H5Pget_sizes"); - - ret = H5Pget_sym_k(tmpl1, &iparm, &iparm2); - CHECK(ret, FAIL, "H5Pget_sym_k"); - VERIFY(iparm, F2_SYM_INTERN_K, "H5Pget_sym_k"); - VERIFY(iparm2, F2_SYM_LEAF_K, "H5Pget_sym_k"); - - /* Release file-creation template */ - ret = H5Pclose(tmpl1); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close first file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* - * Test two file opens: one is opened H5F_ACC_RDONLY and H5F_CLOSE_WEAK. - * It's closed with an object left open. Then another is opened - * H5F_ACC_RDWR, which should fail. - */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 2 File Openings - SKIPPED for now due to no file close degree support\n")); -#if 0 - /* Create file access property list */ - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl_id, FAIL, "H5Pcreate"); - - /* Set file close mode to H5F_CLOSE_WEAK */ - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_WEAK); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - /* Open file for first time */ - fid1 = H5Fopen(FILE2, H5F_ACC_RDONLY, fapl_id); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Check the intent */ - ret = H5Fget_intent(fid1, &intent); - CHECK(ret, FAIL, "H5Fget_intent"); - VERIFY(intent, H5F_ACC_RDONLY, "H5Fget_intent"); - - /* Open dataset */ - did = H5Dopen2(fid1, F2_DSET, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Check that the intent works even if NULL is passed in */ - ret = H5Fget_intent(fid1, NULL); - CHECK(ret, FAIL, "H5Fget_intent"); - - /* Close first open */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open file for second time, which should fail. */ - H5E_BEGIN_TRY - { - fid2 = H5Fopen(FILE2, H5F_ACC_RDWR, fapl_id); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Fopen"); - - /* Check that the intent fails for an invalid ID */ - H5E_BEGIN_TRY - { - ret = H5Fget_intent(fid1, &intent); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fget_intent"); - - /* Close dataset from first open */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Pclose(fapl_id); - CHECK(ret, FAIL, "H5Pclose"); -#endif -} /* test_file_open() */ - -/**************************************************************** -** -** test_file_reopen(): File reopen test routine. -** -****************************************************************/ -static void -test_file_reopen(void) -{ - hid_t fid = -1; /* file ID from initial open */ - hid_t rfid = -1; /* file ID from reopen */ - hid_t did = -1; /* dataset ID (both opens) */ - hid_t sid = -1; /* dataspace ID for dataset creation */ - hsize_t dims = 6; /* dataspace size */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing File Re-opening\n")); - - /* Create file via first ID */ - fid = H5Fcreate(REOPEN_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK_I(fid, "H5Fcreate"); - - /* Create a dataset in the file */ - sid = H5Screate_simple(1, &dims, &dims); - CHECK_I(sid, "H5Screate_simple"); - did = H5Dcreate2(fid, REOPEN_DSET, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK_I(did, "H5Dcreate2"); - - /* Close dataset and dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Reopen the file with a different file ID */ - rfid = H5Freopen(fid); - CHECK_I(rfid, "H5Freopen"); - - /* Reopen the dataset through the reopen file ID */ - did = H5Dopen2(rfid, REOPEN_DSET, H5P_DEFAULT); - CHECK_I(did, "H5Dopen2"); - - /* Close and clean up */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(rfid); - CHECK(ret, FAIL, "H5Fclose"); - H5Fdelete(REOPEN_FILE, H5P_DEFAULT); - -} /* test_file_reopen() */ - -/**************************************************************** -** -** test_file_close(): low-level file close test routine. -** It mainly tests behavior with close degree. -** -*****************************************************************/ -static void -test_file_close(void) -{ -#if 0 - hid_t fid1, fid2; - hid_t fapl_id, access_id; - hid_t dataset_id, group_id1, group_id2, group_id3; - H5F_close_degree_t fc_degree; - herr_t ret; -#endif - - /* Output message about test being performed */ - MESSAGE(5, ("Testing File Closing with file close degrees - SKIPPED for now due to no file close degree " - "support\n")); -#if 0 - /* Test behavior while opening file multiple times with different - * file close degree value - */ - fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl_id, FAIL, "H5Pcreate"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_STRONG); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - ret = H5Pget_fclose_degree(fapl_id, &fc_degree); - VERIFY(fc_degree, H5F_CLOSE_STRONG, "H5Pget_fclose_degree"); - - /* should fail */ - H5E_BEGIN_TRY - { - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Fopen"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_DEFAULT); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - /* should succeed */ - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Close first open */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close second open */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Test behavior while opening file multiple times with different file - * close degree - */ - fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_WEAK); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - ret = H5Pget_fclose_degree(fapl_id, &fc_degree); - VERIFY(fc_degree, H5F_CLOSE_WEAK, "H5Pget_fclose_degree"); - - /* should succeed */ - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Close first open */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close second open */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Test behavior while opening file multiple times with file close - * degree STRONG */ - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_STRONG); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - CHECK(fid1, FAIL, "H5Fcreate"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_WEAK); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - /* should fail */ - H5E_BEGIN_TRY - { - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Fopen"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_STRONG); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - /* should succeed */ - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Create a dataset and a group in each file open respectively */ - create_objects(fid1, fid2, NULL, NULL, NULL, NULL); - - /* Close first open */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close second open */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Test behavior while opening file multiple times with file close - * degree SEMI */ - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_SEMI); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - CHECK(fid1, FAIL, "H5Fcreate"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_DEFAULT); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - /* should fail */ - H5E_BEGIN_TRY - { - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Fopen"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_SEMI); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - /* should succeed */ - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Create a dataset and a group in each file open respectively */ - create_objects(fid1, fid2, &dataset_id, &group_id1, &group_id2, &group_id3); - - /* Close first open, should fail since it is SEMI and objects are - * still open. */ - H5E_BEGIN_TRY - { - ret = H5Fclose(fid1); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fclose"); - - /* Close second open, should fail since it is SEMI and objects are - * still open. */ - H5E_BEGIN_TRY - { - ret = H5Fclose(fid2); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fclose"); - - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close first open */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Gclose(group_id1); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(group_id2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close second open, should fail since it is SEMI and one group ID is - * still open. */ - H5E_BEGIN_TRY - { - ret = H5Fclose(fid2); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fclose"); - - /* Same check with H5Idec_ref() (should fail also) */ - H5E_BEGIN_TRY - { - ret = H5Idec_ref(fid2); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Idec_ref"); - - ret = H5Gclose(group_id3); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close second open again. Should succeed. */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Test behavior while opening file multiple times with file close - * degree WEAK */ - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_WEAK); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - CHECK(fid1, FAIL, "H5Fcreate"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_SEMI); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - /* should fail */ - H5E_BEGIN_TRY - { - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Fopen"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_DEFAULT); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - /* should succeed */ - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Create a dataset and a group in each file open respectively */ - create_objects(fid1, fid2, &dataset_id, &group_id1, &group_id2, &group_id3); - - /* Create more new files and test object count and ID list functions */ - test_obj_count_and_id(fid1, fid2, dataset_id, group_id1, group_id2, group_id3); - - /* Close first open */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close second open. File will be finally closed after all objects - * are closed. */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Gclose(group_id1); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(group_id2); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(group_id3); - CHECK(ret, FAIL, "H5Gclose"); - - /* Test behavior while opening file multiple times with file close - * degree DEFAULT */ - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_DEFAULT); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - CHECK(fid1, FAIL, "H5Fcreate"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_SEMI); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - /* should fail */ - H5E_BEGIN_TRY - { - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Fopen"); - - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_DEFAULT); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); - - /* should succeed */ - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, fapl_id); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Create a dataset and a group in each file open respectively */ - create_objects(fid1, fid2, &dataset_id, &group_id1, &group_id2, &group_id3); - - access_id = H5Fget_access_plist(fid1); - CHECK(access_id, FAIL, "H5Fget_access_plist"); - - ret = H5Pget_fclose_degree(access_id, &fc_degree); - CHECK(ret, FAIL, "H5Pget_fclose_degree"); - - switch (fc_degree) { - case H5F_CLOSE_STRONG: - /* Close first open */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - /* Close second open */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - break; - case H5F_CLOSE_SEMI: - /* Close first open */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Gclose(group_id1); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(group_id2); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(group_id3); - CHECK(ret, FAIL, "H5Gclose"); - /* Close second open */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - break; - case H5F_CLOSE_WEAK: - /* Close first open */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - /* Close second open */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Gclose(group_id1); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(group_id2); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(group_id3); - CHECK(ret, FAIL, "H5Gclose"); - break; - case H5F_CLOSE_DEFAULT: - default: - CHECK(fc_degree, H5F_CLOSE_DEFAULT, "H5Pget_fclose_degree"); - break; - } - - /* Close file access property list */ - ret = H5Pclose(fapl_id); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(access_id); - CHECK(ret, FAIL, "H5Pclose"); -#endif -} - -/**************************************************************** -** -** create_objects(): routine called by test_file_close to create -** a dataset and a group in file. -** -****************************************************************/ -#if 0 -static void -create_objects(hid_t fid1, hid_t fid2, hid_t *ret_did, hid_t *ret_gid1, hid_t *ret_gid2, hid_t *ret_gid3) -{ - ssize_t oid_count; - herr_t ret; - - /* Check reference counts of file IDs and opened object IDs. - * The verification is hard-coded. If in any case, this testing - * is changed, remember to check this part and update the macros. - */ - { - oid_count = H5Fget_obj_count(fid1, H5F_OBJ_ALL); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_2, "H5Fget_obj_count"); - - oid_count = H5Fget_obj_count(fid1, H5F_OBJ_DATASET | H5F_OBJ_GROUP | H5F_OBJ_DATATYPE | H5F_OBJ_ATTR); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_0, "H5Fget_obj_count"); - - oid_count = H5Fget_obj_count(fid2, H5F_OBJ_ALL); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_2, "H5Fget_obj_count"); - - oid_count = H5Fget_obj_count(fid2, H5F_OBJ_DATASET | H5F_OBJ_GROUP | H5F_OBJ_DATATYPE | H5F_OBJ_ATTR); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_0, "H5Fget_obj_count"); - } - - /* create a dataset in the first file open */ - { - hid_t dataset_id, dataspace_id; /* identifiers */ - hsize_t dims[F2_RANK]; - unsigned data[F2_DIM0][F2_DIM1]; - unsigned i, j; - - /* Create the data space for the dataset. */ - dims[0] = F2_DIM0; - dims[1] = F2_DIM1; - dataspace_id = H5Screate_simple(F2_RANK, dims, NULL); - CHECK(dataspace_id, FAIL, "H5Screate_simple"); - - /* Create the dataset. */ - dataset_id = - H5Dcreate2(fid1, "/dset", H5T_NATIVE_UINT, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset_id, FAIL, "H5Dcreate2"); - - for (i = 0; i < F2_DIM0; i++) - for (j = 0; j < F2_DIM1; j++) - data[i][j] = i * 10 + j; - - /* Write data to the new dataset */ - ret = H5Dwrite(dataset_id, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); - CHECK(ret, FAIL, "H5Dwrite"); - - if (ret_did != NULL) - *ret_did = dataset_id; - - /* Terminate access to the data space. */ - ret = H5Sclose(dataspace_id); - CHECK(ret, FAIL, "H5Sclose"); - } - - /* Create a group in the second file open */ - { - hid_t gid1, gid2, gid3; - gid1 = H5Gcreate2(fid2, "/group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gcreate2"); - if (ret_gid1 != NULL) - *ret_gid1 = gid1; - - gid2 = H5Gopen2(fid2, "/group", H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - if (ret_gid2 != NULL) - *ret_gid2 = gid2; - - gid3 = H5Gopen2(fid2, "/group", H5P_DEFAULT); - CHECK(gid3, FAIL, "H5Gopen2"); - if (ret_gid3 != NULL) - *ret_gid3 = gid3; - } - - /* Check reference counts of file IDs and opened object IDs. - * The verification is hard-coded. If in any case, this testing - * is changed, remember to check this part and update the macros. - */ - { - oid_count = H5Fget_obj_count(fid1, H5F_OBJ_ALL); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_6, "H5Fget_obj_count"); - - oid_count = H5Fget_obj_count(fid1, H5F_OBJ_DATASET | H5F_OBJ_GROUP | H5F_OBJ_DATATYPE | H5F_OBJ_ATTR); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_4, "H5Fget_obj_count"); - - oid_count = H5Fget_obj_count(fid2, H5F_OBJ_ALL); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_6, "H5Fget_obj_count"); - - oid_count = H5Fget_obj_count(fid2, H5F_OBJ_DATASET | H5F_OBJ_GROUP | H5F_OBJ_DATATYPE | H5F_OBJ_ATTR); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_4, "H5Fget_obj_count"); - } -} -#endif - -/**************************************************************** -** -** test_get_obj_ids(): Test the bug and the fix for Jira 8528. -** H5Fget_obj_ids overfilled the list of -** object IDs by one. This is an enhancement -** for test_obj_count_and_id(). -** -****************************************************************/ -static void -test_get_obj_ids(void) -{ - hid_t fid, gid[NGROUPS], dset[NDSETS]; - hid_t filespace; - hsize_t file_dims[F2_RANK] = {F2_DIM0, F2_DIM1}; - ssize_t oid_count, ret_count; - hid_t *oid_list = NULL; - herr_t ret; - int i, m, n; - ssize_t oid_list_size = NDSETS; - char gname[64], dname[64]; - - MESSAGE(5, ("Testing retrieval of object IDs\n")); - - /* Create a new file */ - fid = H5Fcreate(FILE7, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - filespace = H5Screate_simple(F2_RANK, file_dims, NULL); - CHECK(filespace, FAIL, "H5Screate_simple"); - - /* creates NGROUPS groups under the root group */ - for (m = 0; m < NGROUPS; m++) { - snprintf(gname, sizeof(gname), "group%d", m); - gid[m] = H5Gcreate2(fid, gname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid[m], FAIL, "H5Gcreate2"); - } - - /* create NDSETS datasets under the root group */ - for (n = 0; n < NDSETS; n++) { - snprintf(dname, sizeof(dname), "dataset%d", n); - dset[n] = H5Dcreate2(fid, dname, H5T_NATIVE_INT, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset[n], FAIL, "H5Dcreate2"); - } - - /* The number of opened objects should be NGROUPS + NDSETS + 1. One is opened file. */ - oid_count = H5Fget_obj_count(fid, H5F_OBJ_ALL); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, (NGROUPS + NDSETS + 1), "H5Fget_obj_count"); - - oid_list = (hid_t *)calloc((size_t)oid_list_size, sizeof(hid_t)); - CHECK_PTR(oid_list, "calloc"); - - /* Call the public function H5F_get_obj_ids to use H5F__get_objects. User reported having problem here. - * that the returned size (ret_count) from H5Fget_obj_ids is one greater than the size passed in - * (oid_list_size) */ - ret_count = H5Fget_obj_ids(fid, H5F_OBJ_ALL, (size_t)oid_list_size, oid_list); - CHECK(ret_count, FAIL, "H5Fget_obj_ids"); - VERIFY(ret_count, oid_list_size, "H5Fget_obj_count"); - - /* Close all object IDs on the list except the file ID. The first ID is supposed to be file ID according - * to the library design */ - for (i = 0; i < ret_count; i++) { - if (fid != oid_list[i]) { - ret = H5Oclose(oid_list[i]); - CHECK(ret, FAIL, "H5Oclose"); - } - } - - /* The number of opened objects should be NGROUPS + 1 + 1. The first one is opened file. The second one - * is the dataset ID left open from the previous around of H5Fget_obj_ids */ - oid_count = H5Fget_obj_count(fid, H5F_OBJ_ALL); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, NGROUPS + 2, "H5Fget_obj_count"); - - /* Get the IDs of the left opened objects */ - ret_count = H5Fget_obj_ids(fid, H5F_OBJ_ALL, (size_t)oid_list_size, oid_list); - CHECK(ret_count, FAIL, "H5Fget_obj_ids"); - VERIFY(ret_count, oid_list_size, "H5Fget_obj_count"); - - /* Close all object IDs on the list except the file ID. The first ID is still the file ID */ - for (i = 0; i < ret_count; i++) { - if (fid != oid_list[i]) { - ret = H5Oclose(oid_list[i]); - CHECK(ret, FAIL, "H5Oclose"); - } - } - - H5Sclose(filespace); - H5Fclose(fid); - - free(oid_list); - - /* Reopen the file to check whether H5Fget_obj_count and H5Fget_obj_ids still works - * when the file is closed first */ - fid = H5Fopen(FILE7, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open NDSETS datasets under the root group */ - for (n = 0; n < NDSETS; n++) { - snprintf(dname, sizeof(dname), "dataset%d", n); - dset[n] = H5Dopen2(fid, dname, H5P_DEFAULT); - CHECK(dset[n], FAIL, "H5Dcreate2"); - } - - /* Close the file first */ - H5Fclose(fid); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_MORE) { - /* Get the number of all opened objects */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, NDSETS, "H5Fget_obj_count"); - - oid_list = (hid_t *)calloc((size_t)oid_count, sizeof(hid_t)); - CHECK_PTR(oid_list, "calloc"); - - /* Get the list of all opened objects */ - ret_count = H5Fget_obj_ids((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL, (size_t)oid_count, oid_list); - CHECK(ret_count, FAIL, "H5Fget_obj_ids"); - VERIFY(ret_count, NDSETS, "H5Fget_obj_ids"); - - H5E_BEGIN_TRY - { - /* Close all open objects with H5Oclose */ - for (n = 0; n < oid_count; n++) - H5Oclose(oid_list[n]); - } - H5E_END_TRY - - free(oid_list); - } -} - -/**************************************************************** -** -** test_get_file_id(): Test H5Iget_file_id() -** -*****************************************************************/ -static void -test_get_file_id(void) -{ -#if 0 - hid_t fid, fid2, fid3; - hid_t datatype_id, dataset_id, dataspace_id, group_id, attr_id; - hid_t plist; - hsize_t dims[F2_RANK]; - unsigned intent; - herr_t ret; -#endif - - MESSAGE(5, ("Testing H5Iget_file_id - SKIPPED for now due to no H5Iget_file_id support\n")); -#if 0 - /* Create a file */ - fid = H5Fcreate(FILE4, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Check the intent */ - ret = H5Fget_intent(fid, &intent); - CHECK(ret, FAIL, "H5Fget_intent"); - VERIFY(intent, H5F_ACC_RDWR, "H5Fget_intent"); - - /* Test H5Iget_file_id() */ - check_file_id(fid, fid); - - /* Create a group in the file. Make a duplicated file ID from the group. - * And close this duplicated ID - */ - group_id = H5Gcreate2(fid, GRP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group_id, FAIL, "H5Gcreate2"); - - /* Test H5Iget_file_id() */ - check_file_id(fid, group_id); - - /* Close the file and get file ID from the group ID */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Test H5Iget_file_id() */ - check_file_id((hid_t)-1, group_id); - - ret = H5Gclose(group_id); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open the file again. Test H5Iget_file_id() */ - fid = H5Fopen(FILE4, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - group_id = H5Gopen2(fid, GRP_NAME, H5P_DEFAULT); - CHECK(group_id, FAIL, "H5Gopen2"); - - /* Test H5Iget_file_id() */ - check_file_id(fid, group_id); - - /* Open the file for second time. Test H5Iget_file_id() */ - fid3 = H5Freopen(fid); - CHECK(fid3, FAIL, "H5Freopen"); - - /* Test H5Iget_file_id() */ - check_file_id(fid3, fid3); - - ret = H5Fclose(fid3); - CHECK(ret, FAIL, "H5Fclose"); - - /* Create a dataset in the group. Make a duplicated file ID from the - * dataset. And close this duplicated ID. - */ - dims[0] = F2_DIM0; - dims[1] = F2_DIM1; - dataspace_id = H5Screate_simple(F2_RANK, dims, NULL); - CHECK(dataspace_id, FAIL, "H5Screate_simple"); - - dataset_id = - H5Dcreate2(group_id, DSET_NAME, H5T_NATIVE_INT, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset_id, FAIL, "H5Dcreate2"); - - /* Test H5Iget_file_id() */ - check_file_id(fid, dataset_id); - - /* Create an attribute for the dataset. Make a duplicated file ID from - * this attribute. And close it. - */ - attr_id = H5Acreate2(dataset_id, ATTR_NAME, H5T_NATIVE_INT, dataspace_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Acreate2"); - - /* Test H5Iget_file_id() */ - check_file_id(fid, attr_id); - - /* Create a named datatype. Make a duplicated file ID from - * this attribute. And close it. - */ - datatype_id = H5Tcopy(H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tcopy"); - - ret = H5Tcommit2(fid, TYPE_NAME, datatype_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Test H5Iget_file_id() */ - check_file_id(fid, datatype_id); - - /* Create a property list and try to get file ID from it. - * Supposed to fail. - */ - plist = H5Pcreate(H5P_FILE_ACCESS); - CHECK(plist, FAIL, "H5Pcreate"); - - H5E_BEGIN_TRY - { - fid2 = H5Iget_file_id(plist); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Iget_file_id"); - - /* Close objects */ - ret = H5Pclose(plist); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Tclose(datatype_id); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Sclose(dataspace_id); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Gclose(group_id); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -#endif -} - -/**************************************************************** -** -** check_file_id(): Internal function of test_get_file_id() -** -*****************************************************************/ -#if 0 -static void -check_file_id(hid_t fid, hid_t object_id) -{ - hid_t new_fid; - herr_t ret; - - /* Return a duplicated file ID even not expecting user to do it. - * And close this duplicated ID - */ - new_fid = H5Iget_file_id(object_id); - - if (fid >= 0) - VERIFY(new_fid, fid, "H5Iget_file_id"); - else - CHECK(new_fid, FAIL, "H5Iget_file_id"); - - ret = H5Fclose(new_fid); - CHECK(ret, FAIL, "H5Fclose"); -} -#endif - -/**************************************************************** -** -** test_obj_count_and_id(): test object count and ID list functions. -** -****************************************************************/ -#if 0 -static void -test_obj_count_and_id(hid_t fid1, hid_t fid2, hid_t did, hid_t gid1, hid_t gid2, hid_t gid3) -{ - hid_t fid3, fid4; - ssize_t oid_count, ret_count; - herr_t ret; - - /* Create two new files */ - fid3 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid3, FAIL, "H5Fcreate"); - fid4 = H5Fcreate(FILE3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid4, FAIL, "H5Fcreate"); - - /* test object count of all files IDs open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_FILE); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_4, "H5Fget_obj_count"); - - /* test object count of all datasets open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_DATASET); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_1, "H5Fget_obj_count"); - - /* test object count of all groups open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_GROUP); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_3, "H5Fget_obj_count"); - - /* test object count of all named datatypes open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_DATATYPE); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_0, "H5Fget_obj_count"); - - /* test object count of all attributes open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_ATTR); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_0, "H5Fget_obj_count"); - - /* test object count of all objects currently open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_8, "H5Fget_obj_count"); - - if (oid_count > 0) { - hid_t *oid_list; - - oid_list = (hid_t *)calloc((size_t)oid_count, sizeof(hid_t)); - if (oid_list != NULL) { - int i; - - ret_count = H5Fget_obj_ids((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL, (size_t)oid_count, oid_list); - CHECK(ret_count, FAIL, "H5Fget_obj_ids"); - - for (i = 0; i < oid_count; i++) { - H5I_type_t id_type; - - id_type = H5Iget_type(oid_list[i]); - switch (id_type) { - case H5I_FILE: - if (oid_list[i] != fid1 && oid_list[i] != fid2 && oid_list[i] != fid3 && - oid_list[i] != fid4) - ERROR("H5Fget_obj_ids"); - break; - - case H5I_GROUP: - if (oid_list[i] != gid1 && oid_list[i] != gid2 && oid_list[i] != gid3) - ERROR("H5Fget_obj_ids"); - break; - - case H5I_DATASET: - VERIFY(oid_list[i], did, "H5Fget_obj_ids"); - break; - - case H5I_MAP: - /* TODO: Not supported in native VOL connector yet */ - - case H5I_UNINIT: - case H5I_BADID: - case H5I_DATATYPE: - case H5I_DATASPACE: - case H5I_ATTR: - case H5I_VFL: - case H5I_VOL: - case H5I_GENPROP_CLS: - case H5I_GENPROP_LST: - case H5I_ERROR_CLASS: - case H5I_ERROR_MSG: - case H5I_ERROR_STACK: - case H5I_SPACE_SEL_ITER: - case H5I_EVENTSET: - case H5I_NTYPES: - default: - ERROR("H5Fget_obj_ids"); - } /* end switch */ - } /* end for */ - - free(oid_list); - } /* end if */ - } /* end if */ - - /* close the two new files */ - ret = H5Fclose(fid3); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(fid4); - CHECK(ret, FAIL, "H5Fclose"); -} -#endif - -/**************************************************************** -** -** test_file_perm(): low-level file test routine. -** This test verifies that a file can be opened for both -** read-only and read-write access and things will be handled -** appropriately. -** -*****************************************************************/ -static void -test_file_perm(void) -{ - hid_t file; /* File opened with read-write permission */ - hid_t filero; /* Same file opened with read-only permission */ - hid_t dspace; /* Dataspace ID */ - hid_t dset; /* Dataset ID */ - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Low-Level File Permissions\n")); - - dspace = H5Screate(H5S_SCALAR); - CHECK(dspace, FAIL, "H5Screate"); - - /* Create the file (with read-write permission) */ - file = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* Create a dataset with the read-write file handle */ - dset = H5Dcreate2(file, F2_DSET, H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open the file (with read-only permission) */ - filero = H5Fopen(FILE2, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(filero, FAIL, "H5Fopen"); - - /* Create a dataset with the read-only file handle (should fail) */ - H5E_BEGIN_TRY - { - dset = H5Dcreate2(filero, F2_DSET, H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(dset, FAIL, "H5Dcreate2"); - if (dset != FAIL) { - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - } /* end if */ - - ret = H5Fclose(filero); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - -} /* end test_file_perm() */ - -/**************************************************************** -** -** test_file_perm2(): low-level file test routine. -** This test verifies that no object can be created in a -** file that is opened for read-only. -** -*****************************************************************/ -static void -test_file_perm2(void) -{ - hid_t file; /* File opened with read-write permission */ - hid_t filero; /* Same file opened with read-only permission */ - hid_t dspace; /* Dataspace ID */ - hid_t group; /* Group ID */ - hid_t dset; /* Dataset ID */ - hid_t type; /* Datatype ID */ - hid_t attr; /* Attribute ID */ - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Low-Level File Permissions again\n")); - - dspace = H5Screate(H5S_SCALAR); - CHECK(dspace, FAIL, "H5Screate"); - - /* Create the file (with read-write permission) */ - file = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open the file (with read-only permission) */ - filero = H5Fopen(FILE2, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(filero, FAIL, "H5Fopen"); - - /* Create a group with the read-only file handle (should fail) */ - H5E_BEGIN_TRY - { - group = H5Gcreate2(filero, "MY_GROUP", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(group, FAIL, "H5Gcreate2"); - - /* Create a dataset with the read-only file handle (should fail) */ - H5E_BEGIN_TRY - { - dset = H5Dcreate2(filero, F2_DSET, H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(dset, FAIL, "H5Dcreate2"); - - /* Create an attribute with the read-only file handle (should fail) */ - H5E_BEGIN_TRY - { - attr = H5Acreate2(filero, "MY_ATTR", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(attr, FAIL, "H5Acreate2"); - - type = H5Tcopy(H5T_NATIVE_SHORT); - CHECK(type, FAIL, "H5Tcopy"); - - /* Commit a datatype with the read-only file handle (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Tcommit2(filero, "MY_DTYPE", type, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Tcommit2"); - - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Fclose(filero); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); -} /* end test_file_perm2() */ - -/**************************************************************** -** -** test_file_is_accessible(): low-level file test routine. -** Clone of test_file_ishdf5 but uses the newer VOL-enabled -** H5Fis_accessible() API call. -** -*****************************************************************/ -#define FILE_IS_ACCESSIBLE "tfile_is_accessible" -#define FILE_IS_ACCESSIBLE_NON_HDF5 "tfile_is_accessible_non_hdf5" -static void -test_file_is_accessible(const char *env_h5_drvr) -{ - hid_t fid = H5I_INVALID_HID; /* File opened with read-write permission */ - hid_t fcpl_id = H5I_INVALID_HID; /* File creation property list */ - hid_t fapl_id = H5I_INVALID_HID; /* File access property list */ -#if 0 - int fd; /* POSIX file descriptor */ -#endif - char filename[FILENAME_LEN]; /* Filename to use */ - char non_hdf5_filename[FILENAME_LEN]; /* Base name of non-hdf5 file */ - char non_hdf5_sb_filename[FILENAME_LEN]; /* Name of non-hdf5 superblock file */ -#if 0 - ssize_t nbytes; /* Number of bytes written */ - unsigned u; /* Local index variable */ - unsigned char buf[1024]; /* Buffer of data to write */ -#endif - htri_t is_hdf5; /* Whether a file is an HDF5 file */ -#if 0 - int posix_ret; /* Return value from POSIX calls */ -#endif - bool driver_is_default_compatible; - herr_t ret; /* Return value from HDF5 calls */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Detection of HDF5 Files\n")); - - /* Get FAPL */ - fapl_id = h5_fileaccess(); - CHECK(fapl_id, H5I_INVALID_HID, "H5Pcreate"); - - if (h5_driver_is_default_vfd_compatible(fapl_id, &driver_is_default_compatible) < 0) { - TestErrPrintf("Can't check if VFD is compatible with default VFD"); - return; - } - - /* Fix up filenames */ - h5_fixname(FILE_IS_ACCESSIBLE, fapl_id, filename, sizeof(filename)); - h5_fixname(FILE_IS_ACCESSIBLE_NON_HDF5, fapl_id, non_hdf5_filename, sizeof(non_hdf5_filename)); - h5_fixname_superblock(FILE_IS_ACCESSIBLE_NON_HDF5, fapl_id, non_hdf5_sb_filename, - sizeof(non_hdf5_sb_filename)); - - /****************/ - /* Normal usage */ - /****************/ - - /* Create a file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Verify that the file is an HDF5 file */ - is_hdf5 = H5Fis_accessible(filename, fapl_id); - VERIFY(is_hdf5, true, "H5Fis_accessible"); - - /*****************************************/ - /* Newly created file that is still open */ - /*****************************************/ - - /* On Windows, file locking is mandatory so this check ensures that - * H5Fis_accessible() works on files that have an exclusive lock. - * Previous versions of this API call created an additional file handle - * and attempted to read through it, which will not work when locks - * are enforced by the OS. - */ - - /* Create a file and hold it open */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Verify that the file is an HDF5 file */ - is_hdf5 = H5Fis_accessible(filename, fapl_id); - VERIFY(is_hdf5, true, "H5Fis_accessible"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*******************************/ - /* Non-default user block size */ - /*******************************/ - - /* This test is not currently working for the family VFD. - * There are failures when creating files with userblocks. - */ - if (0 != strcmp(env_h5_drvr, "family")) { - /* Create a file creation property list with a non-default user block size */ - fcpl_id = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl_id, H5I_INVALID_HID, "H5Pcreate"); - - ret = H5Pset_userblock(fcpl_id, (hsize_t)2048); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* Create file with non-default user block */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl_id, fapl_id); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Release file-creation property list */ - ret = H5Pclose(fcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Verify that the file is an HDF5 file */ - is_hdf5 = H5Fis_accessible(filename, fapl_id); - VERIFY(is_hdf5, true, "H5Fis_accessible"); - } /* end if */ -#if 0 - if (driver_is_default_compatible) { - /***********************/ - /* EMPTY non-HDF5 file */ - /***********************/ - - /* Create non-HDF5 file and check it */ - fd = HDopen(non_hdf5_sb_filename, O_RDWR | O_CREAT | O_TRUNC, H5_POSIX_CREATE_MODE_RW); - CHECK(fd, (-1), "HDopen"); - - /* Close the file */ - posix_ret = HDclose(fd); - CHECK(posix_ret, (-1), "HDclose"); - - /* Verify that the file is NOT an HDF5 file using the base filename */ - is_hdf5 = H5Fis_accessible(non_hdf5_filename, fapl_id); - VERIFY(is_hdf5, false, "H5Fis_accessible (empty non-HDF5 file)"); - - /***************************/ - /* Non-empty non-HDF5 file */ - /***************************/ - - /* Create non-HDF5 file and check it */ - fd = HDopen(non_hdf5_sb_filename, O_RDWR | O_CREAT | O_TRUNC, H5_POSIX_CREATE_MODE_RW); - CHECK(fd, (-1), "HDopen"); - - /* Initialize information to write */ - for (u = 0; u < 1024; u++) - buf[u] = (unsigned char)u; - - /* Write some information */ - nbytes = HDwrite(fd, buf, (size_t)1024); - VERIFY(nbytes, 1024, "HDwrite"); - - /* Close the file */ - posix_ret = HDclose(fd); - CHECK(posix_ret, (-1), "HDclose"); - - /* Verify that the file is not an HDF5 file */ - is_hdf5 = H5Fis_accessible(non_hdf5_filename, fapl_id); - VERIFY(is_hdf5, false, "H5Fis_accessible (non-HDF5 file)"); - } - - /* Clean up files */ - h5_delete_test_file(filename, fapl_id); - h5_delete_test_file(non_hdf5_filename, fapl_id); -#endif - H5Fdelete(filename, fapl_id); - - /* Close property list */ - ret = H5Pclose(fapl_id); - CHECK(ret, FAIL, "H5Pclose"); - -} /* end test_file_is_accessible() */ - -/**************************************************************** -** -** test_file_ishdf5(): low-level file test routine. -** This test checks whether the H5Fis_hdf5() routine is working -** correctly in various situations. -** -*****************************************************************/ -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS -static void -test_file_ishdf5(const char *env_h5_drvr) -{ - hid_t fid = H5I_INVALID_HID; /* File opened with read-write permission */ - hid_t fcpl_id = H5I_INVALID_HID; /* File creation property list */ - hid_t fapl_id = H5I_INVALID_HID; /* File access property list */ - int fd; /* POSIX file descriptor */ - char filename[FILENAME_LEN]; /* Filename to use */ - char sb_filename[FILENAME_LEN]; /* Name of file w/ superblock */ - ssize_t nbytes; /* Number of bytes written */ - unsigned u; /* Local index variable */ - unsigned char buf[1024]; /* Buffer of data to write */ - htri_t is_hdf5; /* Whether a file is an HDF5 file */ - int posix_ret; /* Return value from POSIX calls */ - herr_t ret; /* Return value from HDF5 calls */ - - if (!h5_using_default_driver(env_h5_drvr)) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Detection of HDF5 Files (using deprecated H5Fis_hdf5() call)\n")); - - /* Get FAPL */ - fapl_id = h5_fileaccess(); - CHECK(fapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Fix up filenames - * For VFDs that create multiple files, we also need the name - * of the file with the superblock. With single-file VFDs, this - * will be equal to the one from h5_fixname(). - */ - h5_fixname(FILE_IS_ACCESSIBLE, fapl_id, filename, sizeof(filename)); - h5_fixname_superblock(FILE_IS_ACCESSIBLE, fapl_id, sb_filename, sizeof(filename)); - - /****************/ - /* Normal usage */ - /****************/ - - /* Create a file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Verify that the file is an HDF5 file */ - is_hdf5 = H5Fis_hdf5(sb_filename); - VERIFY(is_hdf5, true, "H5Fis_hdf5"); - - /*******************************/ - /* Non-default user block size */ - /*******************************/ - - /* Create a file creation property list with a non-default user block size */ - fcpl_id = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl_id, H5I_INVALID_HID, "H5Pcreate"); - - ret = H5Pset_userblock(fcpl_id, (hsize_t)2048); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* Create file with non-default user block */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl_id, fapl_id); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Release file creation property list */ - ret = H5Pclose(fcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Verify that the file is an HDF5 file */ - is_hdf5 = H5Fis_hdf5(sb_filename); - VERIFY(is_hdf5, true, "H5Fis_hdf5"); - - /***************************/ - /* Non-empty non-HDF5 file */ - /***************************/ - - /* Create non-HDF5 file. Use the calculated superblock - * filename to avoid the format strings that will make - * open(2) sad. - */ - fd = HDopen(sb_filename, O_RDWR | O_CREAT | O_TRUNC, H5_POSIX_CREATE_MODE_RW); - CHECK(fd, (-1), "HDopen"); - - /* Initialize information to write */ - for (u = 0; u < 1024; u++) - buf[u] = (unsigned char)u; - - /* Write some information */ - nbytes = HDwrite(fd, buf, (size_t)1024); - VERIFY(nbytes, 1024, "HDwrite"); - - /* Close the file */ - posix_ret = HDclose(fd); - CHECK(posix_ret, (-1), "HDclose"); - - /* Verify that the file is not an HDF5 file */ - is_hdf5 = H5Fis_hdf5(sb_filename); - VERIFY(is_hdf5, false, "H5Fis_hdf5"); - - /* Clean up files */ -#if 0 - h5_delete_test_file(filename, fapl_id); -#endif - H5Fdelete(filename, fapl_id); - - /* Close property list */ - ret = H5Pclose(fapl_id); - CHECK(ret, FAIL, "H5Pclose"); - -} /* end test_file_ishdf5() */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - -/**************************************************************** -** -** test_file_delete(): tests H5Fdelete for all VFDs -** -*****************************************************************/ -#define FILE_DELETE "test_file_delete.h5" -#define FILE_DELETE_NOT_HDF5 "test_file_delete_not_hdf5" -static void -test_file_delete(hid_t fapl_id) -{ - hid_t fid = H5I_INVALID_HID; /* File to be deleted */ - char filename[FILENAME_LEN]; /* Filename to use */ - htri_t is_hdf5; /* Whether a file is an HDF5 file */ -#if 0 - int fd; /* POSIX file descriptor */ - int iret; -#endif - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deletion of HDF5 Files\n")); - - /*************/ - /* HDF5 FILE */ - /*************/ - - /* Get fapl-dependent filename */ - h5_fixname(FILE_DELETE, fapl_id, filename, sizeof(filename)); - - /* Create a file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Close file */ - ret = H5Fclose(fid); - VERIFY(ret, SUCCEED, "H5Fclose"); - - /* Verify that the file is an HDF5 file */ - is_hdf5 = H5Fis_accessible(filename, fapl_id); - VERIFY(is_hdf5, true, "H5Fis_accessible"); - - /* Delete the file */ - ret = H5Fdelete(filename, fapl_id); - VERIFY(ret, SUCCEED, "H5Fdelete"); - - /* Verify that the file is NO LONGER an HDF5 file */ - /* This should fail since there is no file */ - H5E_BEGIN_TRY - { - is_hdf5 = H5Fis_accessible(filename, fapl_id); - } - H5E_END_TRY - VERIFY(is_hdf5, FAIL, "H5Fis_accessible"); - -#if 0 - /* Just in case deletion fails - silent on errors */ - h5_delete_test_file(FILE_DELETE, fapl_id); - - /*****************/ - /* NON-HDF5 FILE */ - /*****************/ - - /* Get fapl-dependent filename */ - h5_fixname(FILE_DELETE_NOT_HDF5, fapl_id, filename, sizeof(filename)); - - /* Create a non-HDF5 file */ - fd = HDopen(filename, O_RDWR | O_CREAT | O_TRUNC, H5_POSIX_CREATE_MODE_RW); - CHECK_I(fd, "HDopen"); - - /* Close the file */ - ret = HDclose(fd); - VERIFY(ret, 0, "HDclose"); - - /* Verify that the file is not an HDF5 file */ - /* Note that you can get a FAIL result when h5_fixname() - * perturbs the filename as a file with that exact name - * may not have been created since we created it with - * open(2) and not the library. - */ - H5E_BEGIN_TRY - { - is_hdf5 = H5Fis_accessible(filename, fapl_id); - } - H5E_END_TRY - CHECK(is_hdf5, true, "H5Fis_accessible"); - - /* Try to delete it (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Fdelete(filename, fapl_id); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fdelete"); - - /* Delete the file */ - iret = H5Fdelete(filename, H5P_DEFAULT); - VERIFY(iret, 0, "H5Fdelete"); -#endif -} /* end test_file_delete() */ - -/**************************************************************** -** -** test_file_open_dot(): low-level file test routine. -** This test checks whether opening objects with "." for a name -** works correctly in various situations. -** -*****************************************************************/ -static void -test_file_open_dot(void) -{ - hid_t fid; /* File ID */ - hid_t gid, gid2; /* Group IDs */ - hid_t did; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid, tid2; /* Datatype IDs */ - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing opening objects with \".\" for a name\n")); - - /* Create a new HDF5 file to work with */ - fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a group in the HDF5 file */ - gid = H5Gcreate2(fid, GRP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create a dataspace for creating datasets */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a dataset with no name using the file ID */ - H5E_BEGIN_TRY - { - did = H5Dcreate2(fid, ".", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(did, FAIL, "H5Dcreate2"); - - /* Create a dataset with no name using the group ID */ - H5E_BEGIN_TRY - { - did = H5Dcreate2(gid, ".", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(did, FAIL, "H5Dcreate2"); - - /* Open a dataset with no name using the file ID */ - H5E_BEGIN_TRY - { - did = H5Dopen2(fid, ".", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(did, FAIL, "H5Dopen2"); - - /* Open a dataset with no name using the group ID */ - H5E_BEGIN_TRY - { - did = H5Dopen2(gid, ".", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(did, FAIL, "H5Dopen2"); - - /* Make a copy of a datatype to use for creating a named datatype */ - tid = H5Tcopy(H5T_NATIVE_INT); - CHECK(tid, FAIL, "H5Tcopy"); - - /* Create a named datatype with no name using the file ID */ - H5E_BEGIN_TRY - { - ret = H5Tcommit2(fid, ".", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Tcommit2"); - - /* Create a named datatype with no name using the group ID */ - H5E_BEGIN_TRY - { - ret = H5Tcommit2(gid, ".", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Tcommit2"); - - /* Open a named datatype with no name using the file ID */ - H5E_BEGIN_TRY - { - tid2 = H5Topen2(fid, ".", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tid2, FAIL, "H5Topen2"); - - /* Open a named datatype with no name using the group ID */ - H5E_BEGIN_TRY - { - tid2 = H5Topen2(gid, ".", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tid2, FAIL, "H5Topen2"); - - /* Create a group with no name using the file ID */ - H5E_BEGIN_TRY - { - gid2 = H5Gcreate2(fid, ".", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(gid2, FAIL, "H5Gcreate2"); - - /* Create a group with no name using the group ID */ - H5E_BEGIN_TRY - { - gid2 = H5Gcreate2(gid, ".", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(gid2, FAIL, "H5Gcreate2"); - - /* Open a group with no name using the file ID (should open the root group) */ - gid2 = H5Gopen2(fid, ".", H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open a group with no name using the group ID (should open the group again) */ - gid2 = H5Gopen2(gid, ".", H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close everything */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_file_open_dot() */ - -/**************************************************************** -** -** test_file_open_overlap(): low-level file test routine. -** This test checks whether opening files in an overlapping way -** (as opposed to a nested manner) works correctly. -** -*****************************************************************/ -static void -test_file_open_overlap(void) -{ - hid_t fid1, fid2; - hid_t did1, did2; - hid_t gid; - hid_t sid; - ssize_t nobjs; /* # of open objects */ - unsigned intent; -#if 0 - unsigned long fileno1, fileno2; /* File number */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing opening overlapping file opens\n")); - - /* Create file */ - fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Open file also */ - fid2 = H5Fopen(FILE1, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Check the intent */ - ret = H5Fget_intent(fid1, &intent); - CHECK(ret, FAIL, "H5Fget_intent"); - VERIFY(intent, H5F_ACC_RDWR, "H5Fget_intent"); -#if 0 - /* Check the file numbers */ - fileno1 = 0; - ret = H5Fget_fileno(fid1, &fileno1); - CHECK(ret, FAIL, "H5Fget_fileno"); - fileno2 = 0; - ret = H5Fget_fileno(fid2, &fileno2); - CHECK(ret, FAIL, "H5Fget_fileno"); - VERIFY(fileno1, fileno2, "H5Fget_fileno"); - - /* Check that a file number pointer of NULL is ignored */ - ret = H5Fget_fileno(fid1, NULL); - CHECK(ret, FAIL, "H5Fget_fileno"); -#endif - - /* Create a group in file */ - gid = H5Gcreate2(fid1, GROUP1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create dataset in group w/first file ID */ - did1 = H5Dcreate2(gid, DSET1, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dcreate2"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_MORE) { - /* Check number of objects opened in first file */ - nobjs = H5Fget_obj_count(fid1, H5F_OBJ_LOCAL | H5F_OBJ_ALL); - VERIFY(nobjs, 3, "H5Fget_obj_count"); /* 3 == file, dataset & group */ - } - - /* Close dataset */ - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close first file ID */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Create dataset with second file ID */ - did2 = H5Dcreate2(fid2, DSET2, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did2, FAIL, "H5Dcreate2"); - - /* Check number of objects opened in first file */ - nobjs = H5Fget_obj_count(fid2, H5F_OBJ_ALL); - VERIFY(nobjs, 2, "H5Fget_obj_count"); /* 3 == file & dataset */ - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close second dataset */ - ret = H5Dclose(did2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close second file */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_file_open_overlap() */ - -/**************************************************************** -** -** test_file_getname(): low-level file test routine. -** This test checks whether H5Fget_name works correctly. -** -*****************************************************************/ -static void -test_file_getname(void) -{ - /* Compound datatype */ - typedef struct s1_t { - unsigned int a; - float b; - } s1_t; - - hid_t file_id; - hid_t group_id; - hid_t dataset_id; - hid_t space_id; - hid_t type_id; - hid_t attr_id; - hsize_t dims[TESTA_RANK] = {TESTA_NX, TESTA_NY}; - char name[TESTA_NAME_BUF_SIZE]; - ssize_t name_len; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing H5Fget_name() functionality\n")); - - /* Create a new file_id using default properties. */ - file_id = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Get and verify file name */ - name_len = H5Fget_name(file_id, name, (size_t)TESTA_NAME_BUF_SIZE); - CHECK(name_len, FAIL, "H5Fget_name"); - VERIFY_STR(name, FILE1, "H5Fget_name"); - - /* Create a group in the root group */ - group_id = H5Gcreate2(file_id, TESTA_GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group_id, FAIL, "H5Gcreate2"); - - /* Get and verify file name */ - name_len = H5Fget_name(group_id, name, (size_t)TESTA_NAME_BUF_SIZE); - CHECK(name_len, FAIL, "H5Fget_name"); - VERIFY_STR(name, FILE1, "H5Fget_name"); - - /* Create the data space */ - space_id = H5Screate_simple(TESTA_RANK, dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - - /* Try get file name from data space. Supposed to fail because - * it's illegal operation. */ - H5E_BEGIN_TRY - { - name_len = H5Fget_name(space_id, name, (size_t)TESTA_NAME_BUF_SIZE); - } - H5E_END_TRY - VERIFY(name_len, FAIL, "H5Fget_name"); - - /* Create a new dataset */ - dataset_id = - H5Dcreate2(file_id, TESTA_DSETNAME, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset_id, FAIL, "H5Dcreate2"); - - /* Get and verify file name */ - name_len = H5Fget_name(dataset_id, name, (size_t)TESTA_NAME_BUF_SIZE); - CHECK(name_len, FAIL, "H5Fget_name"); - VERIFY_STR(name, FILE1, "H5Fget_name"); - - /* Create an attribute for the dataset */ - attr_id = H5Acreate2(dataset_id, TESTA_ATTRNAME, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate2"); - - /* Get and verify file name */ - name_len = H5Fget_name(attr_id, name, (size_t)TESTA_NAME_BUF_SIZE); - CHECK(name_len, FAIL, "H5Fget_name"); - VERIFY_STR(name, FILE1, "H5Fget_name"); - - /* Create a compound datatype */ - type_id = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(type_id, FAIL, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(type_id, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(type_id, "b", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Save it on file */ - ret = H5Tcommit2(file_id, TESTA_DTYPENAME, type_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Get and verify file name */ - name_len = H5Fget_name(type_id, name, (size_t)TESTA_NAME_BUF_SIZE); - CHECK(name_len, FAIL, "H5Fget_name"); - VERIFY_STR(name, FILE1, "H5Fget_name"); - - /* Close things down */ - ret = H5Tclose(type_id); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Gclose(group_id); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_file_getname() */ - -/**************************************************************** -** -** test_file_double_root_open(): low-level file test routine. -** This test checks whether opening the root group from two -** different files works correctly. -** -*****************************************************************/ -static void -test_file_double_root_open(void) -{ - hid_t file1_id, file2_id; - hid_t grp1_id, grp2_id; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing double root group open\n")); - - file1_id = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file1_id, FAIL, "H5Fcreate"); - file2_id = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file2_id, FAIL, "H5Fopen"); - - grp1_id = H5Gopen2(file1_id, "/", H5P_DEFAULT); - CHECK(grp1_id, FAIL, "H5Gopen2"); - grp2_id = H5Gopen2(file2_id, "/", H5P_DEFAULT); - CHECK(grp2_id, FAIL, "H5Gopen2"); - - /* Note "asymmetric" close order */ - ret = H5Gclose(grp1_id); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(grp2_id); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(file1_id); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(file2_id); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_file_double_root_open() */ - -/**************************************************************** -** -** test_file_double_group_open(): low-level file test routine. -** This test checks whether opening the same group from two -** different files works correctly. -** -*****************************************************************/ -static void -test_file_double_group_open(void) -{ - hid_t file1_id, file2_id; - hid_t grp1_id, grp2_id; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing double non-root group open\n")); - - file1_id = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file1_id, FAIL, "H5Fcreate"); - file2_id = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file2_id, FAIL, "H5Fopen"); - - grp1_id = H5Gcreate2(file1_id, GRP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp1_id, FAIL, "H5Gcreate2"); - grp2_id = H5Gopen2(file2_id, GRP_NAME, H5P_DEFAULT); - CHECK(grp2_id, FAIL, "H5Gopen2"); - - /* Note "asymmetric" close order */ - ret = H5Gclose(grp1_id); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(grp2_id); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(file1_id); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(file2_id); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_file_double_group_open() */ - -/**************************************************************** -** -** test_file_double_dataset_open(): low-level file test routine. -** This test checks whether opening the same dataset from two -** different files works correctly. -** -*****************************************************************/ -static void -test_file_double_dataset_open(void) -{ - hid_t file1_id, file2_id; - hid_t dset1_id, dset2_id; - hid_t space_id; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing double dataset open\n")); - - file1_id = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file1_id, FAIL, "H5Fcreate"); - file2_id = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file2_id, FAIL, "H5Fopen"); - - /* Create dataspace for dataset */ - space_id = H5Screate(H5S_SCALAR); - CHECK(space_id, FAIL, "H5Screate"); - - dset1_id = - H5Dcreate2(file1_id, DSET_NAME, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset1_id, FAIL, "H5Dcreate2"); - dset2_id = H5Dopen2(file2_id, DSET_NAME, H5P_DEFAULT); - CHECK(dset2_id, FAIL, "H5Dopen2"); - - /* Close "supporting" dataspace */ - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - - /* Note "asymmetric" close order */ - ret = H5Dclose(dset1_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2_id); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Fclose(file1_id); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(file2_id); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_file_double_dataset_open() */ - -/**************************************************************** -** -** test_file_double_file_dataset_open(): -** This test checks multi-opens of files & datasets: -** It simulates the multi-thread test program from DLS -** which exposes the file pointer segmentation fault failure. -** NOTE: The order on when the files and datasets are open/close -** is important. -** -*****************************************************************/ -static void -test_file_double_file_dataset_open(bool new_format) -{ - hid_t fapl = -1; /* File access property list */ - hid_t dcpl = -1; /* Dataset creation property list */ - hid_t fid1 = -1, fid2 = -1; /* File IDs */ - hid_t did1 = -1, did2 = -1; /* Dataset IDs */ - hid_t sid1 = -1, sid2 = -1; /* Dataspace IDs */ - hid_t tid1 = -1, tid2 = -1; /* Datatype IDs */ - hsize_t dims[1] = {5}, dims2[2] = {1, 4}; /* Dimension sizes */ - hsize_t e_ext_dims[1] = {7}; /* Expanded dimension sizes */ - hsize_t s_ext_dims[1] = {3}; /* Shrunk dimension sizes */ - hsize_t max_dims0[1] = {8}; /* Maximum dimension sizes */ - hsize_t max_dims1[1] = {H5S_UNLIMITED}; /* Maximum dimension sizes for extensible array index */ - hsize_t max_dims2[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* Maximum dimension sizes for v2 B-tree index */ - hsize_t chunks[1] = {2}, chunks2[2] = {4, 5}; /* Chunk dimension sizes */ -#if 0 - hsize_t size; /* File size */ -#endif - char filename[FILENAME_LEN]; /* Filename to use */ - const char *data[] = {"String 1", "String 2", "String 3", "String 4", "String 5"}; /* Input Data */ - const char *e_data[] = {"String 1", "String 2", "String 3", "String 4", - "String 5", "String 6", "String 7"}; /* Input Data */ - char *buffer[5]; /* Output buffer */ - int wbuf[4] = {1, 2, 3, 4}; /* Input data */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing double file and dataset open/close\n")); - - /* Setting up test file */ - fapl = h5_fileaccess(); - CHECK(fapl, FAIL, "H5Pcreate"); - if (new_format) { - ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - } /* end if */ - h5_fixname(FILE1, fapl, filename, sizeof filename); - - /* Create the test file */ - fid1 = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create a chunked dataset with fixed array indexing */ - sid1 = H5Screate_simple(1, dims, max_dims0); - CHECK(sid1, FAIL, "H5Screate_simple"); - tid1 = H5Tcopy(H5T_C_S1); - CHECK(tid1, FAIL, "H5Tcopy"); - ret = H5Tset_size(tid1, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - ret = H5Pset_chunk(dcpl, 1, chunks); - CHECK(ret, FAIL, "H5Pset_chunk"); - - did1 = H5Dcreate2(fid1, "dset_fa", tid1, sid1, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dcreate2"); - - /* Closing */ - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a chunked dataset with extensible array indexing */ - sid1 = H5Screate_simple(1, dims, max_dims1); - CHECK(sid1, FAIL, "H5Screate_simple"); - tid1 = H5Tcopy(H5T_C_S1); - CHECK(tid1, FAIL, "H5Tcopy"); - ret = H5Tset_size(tid1, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - ret = H5Pset_chunk(dcpl, 1, chunks); - CHECK(ret, FAIL, "H5Pset_chunk"); - - did1 = H5Dcreate2(fid1, "dset_ea", tid1, sid1, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dcreate2"); - - /* Write to the dataset */ - ret = H5Dwrite(did1, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Closing */ - /* (Leave sid1 open for later use) */ - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a chunked dataset with v2 btree indexing */ - sid2 = H5Screate_simple(2, dims2, max_dims2); - CHECK(sid2, FAIL, "H5Screate_simple"); - - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - ret = H5Pset_chunk(dcpl, 2, chunks2); - CHECK(ret, FAIL, "H5Pset_chunk"); - - did2 = H5Dcreate2(fid1, "dset_bt2", H5T_NATIVE_INT, sid2, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did2, FAIL, "H5Dcreate2"); - - /* Write to the dataset */ - ret = H5Dwrite(did2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Closing */ - ret = H5Dclose(did2); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* - * Scenario 1 - */ - - /* First file open */ - fid1 = H5Fopen(filename, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* First file's dataset open */ - did1 = H5Dopen2(fid1, "/dset_fa", H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dopen2"); - - tid1 = H5Tcopy(did1); - CHECK(tid1, FAIL, "H5Tcopy"); - - /* First file's dataset write */ - ret = H5Dwrite(did1, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Second file open */ - fid2 = H5Fopen(filename, H5F_ACC_RDWR, fapl); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Second file's dataset open */ - did2 = H5Dopen2(fid2, "/dset_fa", H5P_DEFAULT); - CHECK(did2, FAIL, "H5Dopen2"); - - tid2 = H5Tcopy(did2); - CHECK(tid2, FAIL, "H5Tcopy"); - - /* First file's dataset close */ - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - - /* First file close */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Second file's dataset write */ - ret = H5Dwrite(did2, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Second file's dataset close */ - ret = H5Dclose(did2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Second file close */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Closing */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* - * Scenario 2 - */ - - /* First file open */ - fid1 = H5Fopen(filename, H5F_ACC_RDONLY, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Second file open */ - fid2 = H5Fopen(filename, H5F_ACC_RDONLY, fapl); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Second file's dataset open */ - did2 = H5Dopen2(fid2, "/dset_ea", H5P_DEFAULT); - CHECK(did2, FAIL, "H5Dopen2"); - - tid2 = H5Tcopy(did2); - CHECK(tid2, FAIL, "H5Tcopy"); - - /* First file's dataset open */ - did1 = H5Dopen2(fid1, "/dset_ea", H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dopen2"); - - tid1 = H5Tcopy(did1); - CHECK(tid1, FAIL, "H5Tcopy"); - - /* Second file's dataset read */ - memset(buffer, 0, sizeof(char *) * 5); - ret = H5Dread(did2, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer); - CHECK(ret, FAIL, "H5Dread"); - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, buffer); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Second file's dataset close */ - ret = H5Dclose(did2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Second file close */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* First file's dataset read */ - memset(buffer, 0, sizeof(char *) * 5); - ret = H5Dread(did1, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer); - CHECK(ret, FAIL, "H5Dread"); - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, buffer); - CHECK(ret, FAIL, "H5Treclaim"); - - /* First file's dataset close */ - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - - /* First file close */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Closing */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* - * Scenario 3 - */ - - /* First file open */ - fid1 = H5Fopen(filename, H5F_ACC_RDONLY, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* First file's dataset open */ - did1 = H5Dopen2(fid1, "/dset_bt2", H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dopen2"); -#if 0 - /* First file's get storage size */ - size = H5Dget_storage_size(did1); - CHECK(size, 0, "H5Dget_storage_size"); -#endif - /* Second file open */ - fid2 = H5Fopen(filename, H5F_ACC_RDONLY, fapl); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Second file's dataset open */ - did2 = H5Dopen2(fid2, "/dset_bt2", H5P_DEFAULT); - CHECK(did2, FAIL, "H5Dopen2"); - - /* First file's dataset close */ - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - - /* First file close */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Second file's get storage size */ - size = H5Dget_storage_size(did2); - CHECK(size, 0, "H5Dget_storage_size"); -#endif - /* Second file's dataset close */ - ret = H5Dclose(did2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Second file close */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* - * Scenario 4 - * --trigger H5AC_protect: Assertion `f->shared' failed - * from second call to - * H5Dset_extent->...H5D__earray_idx_remove->H5EA_get...H5EA__iblock_protect...H5AC_protect - */ - /* First file open */ - fid1 = H5Fopen(filename, H5F_ACC_RDWR, fapl); - CHECK(fid1, FAIL, "H5Fopen"); - - /* First file's dataset open */ - did1 = H5Dopen2(fid1, "/dset_ea", H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dopen2"); - - tid1 = H5Tcopy(did1); - CHECK(tid1, FAIL, "H5Tcopy"); - - /* Extend the dataset */ - ret = H5Dset_extent(did1, e_ext_dims); - CHECK(ret, FAIL, "H5Dset_extent"); - - /* Write to the dataset */ - ret = H5Dwrite(did1, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, e_data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Second file open */ - fid2 = H5Fopen(filename, H5F_ACC_RDWR, fapl); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Second file's dataset open */ - did2 = H5Dopen2(fid2, "/dset_ea", H5P_DEFAULT); - CHECK(did2, FAIL, "H5Dopen2"); - - /* First file's dataset close */ - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Dclose"); - - /* First file close */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Shrink the dataset */ - ret = H5Dset_extent(did2, s_ext_dims); - CHECK(ret, FAIL, "H5Dset_extent"); - - /* Second file's dataset close */ - ret = H5Dclose(did2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Second file close */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close the data type */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close FAPL */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); -} /* end test_file_double_dataset_open() */ - -/**************************************************************** -** -** test_file_double_datatype_open(): low-level file test routine. -** This test checks whether opening the same named datatype from two -** different files works correctly. -** -*****************************************************************/ -static void -test_file_double_datatype_open(void) -{ - hid_t file1_id, file2_id; - hid_t type1_id, type2_id; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing double datatype open\n")); - - file1_id = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file1_id, FAIL, "H5Fcreate"); - file2_id = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file2_id, FAIL, "H5Fopen"); - - type1_id = H5Tcopy(H5T_NATIVE_INT); - CHECK(type1_id, FAIL, "H5Tcopy"); - ret = H5Tcommit2(file1_id, TYPE_NAME, type1_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - type2_id = H5Topen2(file2_id, TYPE_NAME, H5P_DEFAULT); - CHECK(type2_id, FAIL, "H5Topen2"); - - /* Note "asymmetric" close order */ - ret = H5Tclose(type1_id); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(type2_id); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Fclose(file1_id); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(file2_id); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_file_double_dataset_open() */ - -/**************************************************************** -** -** test_userblock_file_size(): low-level file test routine. -** This test checks that the presence of a userblock -** affects the file size in the expected manner, and that -** the filesize is not changed by reopening the file. It -** creates two files which are identical except that one -** contains a userblock, and verifies that their file sizes -** differ exactly by the userblock size. -** -*****************************************************************/ -#if 0 -static void -test_userblock_file_size(const char *env_h5_drvr) -{ - hid_t file1_id, file2_id; - hid_t group1_id, group2_id; - hid_t dset1_id, dset2_id; - hid_t space_id; - hid_t fcpl2_id; - hsize_t dims[2] = {3, 4}; -#if 0 - hsize_t filesize1, filesize2, filesize; - unsigned long fileno1, fileno2; /* File number */ -#endif - herr_t ret; /* Generic return value */ - - /* Don't run with multi/split, family or direct drivers */ - if (!strcmp(env_h5_drvr, "multi") || !strcmp(env_h5_drvr, "split") || - !strcmp(env_h5_drvr, "family") || !strcmp(env_h5_drvr, "direct")) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing file size with user block\n")); - - /* Create property list with userblock size set */ - fcpl2_id = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl2_id, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl2_id, USERBLOCK_SIZE); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* Create files. Only file2 with have a userblock. */ - file1_id = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file1_id, FAIL, "H5Fcreate"); - file2_id = H5Fcreate(FILE2, H5F_ACC_TRUNC, fcpl2_id, H5P_DEFAULT); - CHECK(file2_id, FAIL, "H5Fcreate"); -#if 0 - /* Check the file numbers */ - fileno1 = 0; - ret = H5Fget_fileno(file1_id, &fileno1); - CHECK(ret, FAIL, "H5Fget_fileno"); - fileno2 = 0; - ret = H5Fget_fileno(file2_id, &fileno2); - CHECK(ret, FAIL, "H5Fget_fileno"); - CHECK(fileno1, fileno2, "H5Fget_fileno"); -#endif - /* Create groups */ - group1_id = H5Gcreate2(file1_id, GROUP1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group1_id, FAIL, "H5Gcreate2"); - group2_id = H5Gcreate2(file2_id, GROUP1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group2_id, FAIL, "H5Gcreate2"); - - /* Create dataspace */ - space_id = H5Screate_simple(2, dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - - /* Create datasets */ - dset1_id = H5Dcreate2(file1_id, DSET2, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset1_id, FAIL, "H5Dcreate2"); - dset2_id = H5Dcreate2(file2_id, DSET2, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset2_id, FAIL, "H5Dcreate2"); - - /* Close IDs */ - ret = H5Dclose(dset1_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(dset2_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Gclose(group1_id); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(group2_id); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Pclose(fcpl2_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close files */ - ret = H5Fclose(file1_id); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(file2_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Reopen files */ - file1_id = H5Fopen(FILE1, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file1_id, FAIL, "H5Fopen"); - file2_id = H5Fopen(FILE2, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file2_id, FAIL, "H5Fopen"); -#if 0 - /* Check file sizes */ - ret = H5Fget_filesize(file1_id, &filesize1); - CHECK(ret, FAIL, "H5Fget_filesize"); - ret = H5Fget_filesize(file2_id, &filesize2); - CHECK(ret, FAIL, "H5Fget_filesize"); - - /* Verify that the file sizes differ exactly by the userblock size */ - VERIFY_TYPE((unsigned long long)filesize2, (unsigned long long)(filesize1 + USERBLOCK_SIZE), - unsigned long long, "%llu", "H5Fget_filesize"); -#endif - /* Close files */ - ret = H5Fclose(file1_id); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(file2_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Reopen files */ - file1_id = H5Fopen(FILE1, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file1_id, FAIL, "H5Fopen"); - file2_id = H5Fopen(FILE2, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file2_id, FAIL, "H5Fopen"); -#if 0 - /* Verify file sizes did not change */ - ret = H5Fget_filesize(file1_id, &filesize); - CHECK(ret, FAIL, "H5Fget_filesize"); - VERIFY(filesize, filesize1, "H5Fget_filesize"); - ret = H5Fget_filesize(file2_id, &filesize); - CHECK(ret, FAIL, "H5Fget_filesize"); - VERIFY(filesize, filesize2, "H5Fget_filesize"); -#endif - /* Close files */ - ret = H5Fclose(file1_id); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(file2_id); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_userblock_file_size() */ -#endif - -/**************************************************************** -** -** test_cached_stab_info(): low-level file test routine. -** This test checks that new files are created with cached -** symbol table information in the superblock (when using -** the old format). This is necessary to ensure backwards -** compatibility with versions from 1.3.0 to 1.6.3. -** -*****************************************************************/ -#if 0 -static void -test_cached_stab_info(void) -{ - hid_t file_id; - hid_t group_id; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing cached symbol table information\n")); - - /* Create file */ - file_id = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Create group */ - group_id = H5Gcreate2(file_id, GROUP1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group_id, FAIL, "H5Gcreate2"); - - /* Close file and group */ - ret = H5Gclose(group_id); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Reopen file */ - file_id = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fopen"); -#if 0 - /* Verify the cached symbol table information */ - ret = H5F__check_cached_stab_test(file_id); - CHECK(ret, FAIL, "H5F__check_cached_stab_test"); -#endif - /* Close file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_cached_stab_info() */ -#endif - -#if 0 -/* - * To calculate the checksum for a file. - * This is a helper routine for test_rw_noupdate(). - */ -static int -cal_chksum(const char *file, uint32_t *chksum) -{ - int curr_num_errs = nerrors; /* Retrieve the current # of errors */ - int fdes = -1; /* File descriptor */ - void *file_data = NULL; /* Copy of file data */ - ssize_t bytes_read; /* # of bytes read */ - h5_stat_t sb; /* Stat buffer for file */ - herr_t ret; /* Generic return value */ - - /* Open the file */ - fdes = HDopen(file, O_RDONLY); - CHECK(fdes, FAIL, "HDopen"); - - /* Retrieve the file's size */ - ret = HDfstat(fdes, &sb); - CHECK(fdes, FAIL, "HDfstat"); - - /* Allocate space for the file data */ - file_data = malloc((size_t)sb.st_size); - CHECK_PTR(file_data, "malloc"); - - if (file_data) { - /* Read file's data into memory */ - bytes_read = HDread(fdes, file_data, (size_t)sb.st_size); - CHECK(bytes_read == sb.st_size, false, "malloc"); - - /* Calculate checksum */ - *chksum = H5_checksum_lookup3(file_data, sizeof(file_data), 0); - - /* Free memory */ - free(file_data); - } - - /* Close the file */ - ret = HDclose(fdes); - CHECK(ret, FAIL, "HDclose"); - - return ((nerrors == curr_num_errs) ? 0 : -1); -} /* cal_chksum() */ -#endif - -/**************************************************************** -** -** test_rw_noupdate(): low-level file test routine. -** This test checks to ensure that opening and closing a file -** with read/write permissions does not write anything to the -** file if the file does not change. -** Due to the implementation of file locking (status_flags in -** the superblock is used), this test is changed to use checksum -** instead of timestamp to verify the file is not changed. -** -*****************************************************************/ -#if 0 -static void -test_rw_noupdate(void) -{ - herr_t ret; /* Generic return value */ - hid_t fid; /* File ID */ - uint32_t chksum1, chksum2; /* Checksum value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing to verify that nothing is written if nothing is changed.\n")); - - /* Create and Close a HDF5 File */ - fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Calculate checksum for the file */ - ret = cal_chksum(FILE1, &chksum1); - CHECK(ret, FAIL, "cal_chksum"); - - /* Open and close File With Read/Write Permission */ - fid = H5Fopen(FILE1, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Calculate checksum for the file */ - ret = cal_chksum(FILE1, &chksum2); - CHECK(ret, FAIL, "cal_chksum"); - - /* The two checksums are the same, i.e. the file is not changed */ - VERIFY(chksum1, chksum2, "Checksum"); - -} /* end test_rw_noupdate() */ -#endif - -/**************************************************************** -** -** test_userblock_alignment_helper1(): helper routine for -** test_userblock_alignment() test, to handle common testing -** -*****************************************************************/ -#if 0 -static int -test_userblock_alignment_helper1(hid_t fcpl, hid_t fapl) -{ - hid_t fid; /* File ID */ - int curr_num_errs = nerrors(); /* Retrieve the current # of errors */ - herr_t ret; /* Generic return value */ - - /* Create a file with FAPL & FCPL */ - fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Only proceed further if file ID is OK */ - if (fid > 0) { - hid_t gid; /* Group ID */ - hid_t sid; /* Dataspace ID */ - hid_t did; /* Dataset ID */ - int val = 2; /* Dataset value */ - - /* Create a group */ - gid = H5Gcreate2(fid, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create a dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - did = H5Dcreate2(gid, "dataset", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Write value to dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &val); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end if */ - - return ((nerrors == curr_num_errs) ? 0 : -1); -} /* end test_userblock_alignment_helper1() */ - -/**************************************************************** -** -** test_userblock_alignment_helper2(): helper routine for -** test_userblock_alignment() test, to handle common testing -** -*****************************************************************/ -static int -test_userblock_alignment_helper2(hid_t fapl, bool open_rw) -{ - hid_t fid; /* File ID */ - int curr_num_errs = nerrors(); /* Retrieve the current # of errors */ - herr_t ret; /* Generic return value */ - - /* Re-open file */ - fid = H5Fopen(FILE1, (open_rw ? H5F_ACC_RDWR : H5F_ACC_RDONLY), fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Only proceed further if file ID is OK */ - if (fid > 0) { - hid_t gid; /* Group ID */ - hid_t did; /* Dataset ID */ - int val = -1; /* Dataset value */ - - /* Open group */ - gid = H5Gopen2(fid, "group1", H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Open dataset */ - did = H5Dopen2(gid, "dataset", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Read value from dataset */ - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &val); - CHECK(ret, FAIL, "H5Dread"); - VERIFY(val, 2, "H5Dread"); - - /* Close dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Only create new objects if file is open R/W */ - if (open_rw) { - hid_t gid2; /* Group ID */ - - /* Create a new group */ - gid2 = H5Gcreate2(gid, "group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Close new group */ - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - } /* end if */ - - /* Close group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end if */ - - return ((nerrors == curr_num_errs) ? 0 : -1); -} /* end test_userblock_alignment_helper2() */ - -/**************************************************************** -** -** test_userblock_alignment(): low-level file test routine. -** This test checks to ensure that files with both a userblock and a -** object [allocation] alignment size set interact properly. -** -*****************************************************************/ -static void -test_userblock_alignment(const char *env_h5_drvr) -{ - hid_t fid; /* File ID */ - hid_t fcpl; /* File creation property list ID */ - hid_t fapl; /* File access property list ID */ - herr_t ret; /* Generic return value */ - - /* Only run with sec2 driver */ - if (!h5_using_default_driver(env_h5_drvr)) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing that non-zero userblocks and object alignment interact correctly.\n")); - - /* Case 1: - * Userblock size = 0, alignment != 0 - * Outcome: - * Should succeed - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)0); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper1(fcpl, fapl); - CHECK(ret, FAIL, "test_userblock_alignment_helper1"); - ret = test_userblock_alignment_helper2(fapl, true); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Case 2: - * Userblock size = 512, alignment = 16 - * (userblock is integral mult. of alignment) - * Outcome: - * Should succeed - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)16); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper1(fcpl, fapl); - CHECK(ret, FAIL, "test_userblock_alignment_helper1"); - ret = test_userblock_alignment_helper2(fapl, true); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Case 3: - * Userblock size = 512, alignment = 512 - * (userblock is equal to alignment) - * Outcome: - * Should succeed - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper1(fcpl, fapl); - CHECK(ret, FAIL, "test_userblock_alignment_helper1"); - ret = test_userblock_alignment_helper2(fapl, true); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Case 4: - * Userblock size = 512, alignment = 3 - * (userblock & alignment each individually valid, but userblock is - * non-integral multiple of alignment) - * Outcome: - * Should fail at file creation - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Create a file with FAPL & FCPL */ - H5E_BEGIN_TRY - { - fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl); - } - H5E_END_TRY - VERIFY(fid, FAIL, "H5Fcreate"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Case 5: - * Userblock size = 512, alignment = 1024 - * (userblock & alignment each individually valid, but userblock is - * less than alignment) - * Outcome: - * Should fail at file creation - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)1024); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Create a file with FAPL & FCPL */ - H5E_BEGIN_TRY - { - fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl); - } - H5E_END_TRY - VERIFY(fid, FAIL, "H5Fcreate"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Case 6: - * File created with: - * Userblock size = 512, alignment = 512 - * File re-opened for read-only & read-write access with: - * Userblock size = 512, alignment = 1024 - * Outcome: - * Should succeed - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper1(fcpl, fapl); - CHECK(ret, FAIL, "test_userblock_alignment_helper1"); - - /* Change alignment in FAPL */ - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)1024); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper2(fapl, false); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - ret = test_userblock_alignment_helper2(fapl, true); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); -} /* end test_userblock_alignment() */ - -/**************************************************************** -** -** test_userblock_alignment_paged(): low-level file test routine. -** This test checks to ensure that files with both a userblock and -** alignment interact properly: -** -- alignment via H5Pset_alignment -** -- alignment via paged aggregation -** -*****************************************************************/ -static void -test_userblock_alignment_paged(const char *env_h5_drvr) -{ - hid_t fid; /* File ID */ - hid_t fcpl; /* File creation property list ID */ - hid_t fapl; /* File access property list ID */ - herr_t ret; /* Generic return value */ - - /* Only run with sec2 driver */ - if (!h5_using_default_driver(env_h5_drvr)) - return; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing interaction between userblock and alignment (via paged aggregation and " - "H5Pset_alignment)\n")); - - /* - * Case 1: - * Userblock size = 0 - * Alignment in use = 4096 - * Strategy = H5F_FILE_SPACE_PAGE; fsp_size = alignment = 4096 - * Outcome: - * Should succeed: - * userblock is 0 and alignment != 0 - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)0); - CHECK(ret, FAIL, "H5Pset_userblock"); - - /* Create file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Set the "use the latest version of the format" bounds */ - ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, false, (hsize_t)1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper1(fcpl, fapl); - CHECK(ret, FAIL, "test_userblock_alignment_helper1"); - ret = test_userblock_alignment_helper2(fapl, true); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case 2a: - * Userblock size = 1024 - * Alignment in use = 512 - * Strategy = H5F_FILE_SPACE_PAGE; fsp_size = alignment = 512 - * H5Pset_alignment() is 3 - * Outcome: - * Should succeed: - * userblock (1024) is integral mult. of alignment (512) - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)1024); - CHECK(ret, FAIL, "H5Pset_userblock"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, false, (hsize_t)1); - ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512); - - /* Create file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper1(fcpl, fapl); - CHECK(ret, FAIL, "test_userblock_alignment_helper1"); - ret = test_userblock_alignment_helper2(fapl, true); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case 2b: - * Userblock size = 1024 - * Alignment in use = 3 - * Strategy = H5F_FILE_SPACE_AGGR; fsp_size = 512 - * (via default file creation property) - * H5Pset_alignment() is 3 - * Outcome: - * Should fail at file creation: - * userblock (1024) is non-integral mult. of alignment (3) - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)1024); - CHECK(ret, FAIL, "H5Pset_userblock"); - ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512); - - /* Create file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Create a file with FAPL & FCPL */ - H5E_BEGIN_TRY - { - fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl); - } - H5E_END_TRY - VERIFY(fid, FAIL, "H5Fcreate"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case 3a: - * Userblock size = 512 - * Alignment in use = 512 - * Strategy is H5F_FILE_SPACE_PAGE; fsp_size = alignment = 512 - * H5Pset_alignment() is 3 - * Outcome: - * Should succeed: - * userblock (512) is equal to alignment (512) - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_userblock"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, true, (hsize_t)1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_file_space_page_size"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper1(fcpl, fapl); - CHECK(ret, FAIL, "test_userblock_alignment_helper1"); - ret = test_userblock_alignment_helper2(fapl, true); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case 3b: - * Userblock size = 512 - * Alignment in use = 3 - * Strategy is H5F_FILE_SPACE_NONE; fsp_size = 512 - * H5Pset_alignment() is 3 - * Outcome: - * Should fail at file creation: - * userblock (512) is non-integral mult. of alignment (3) - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_userblock"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_NONE, false, (hsize_t)1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_file_space_page_size"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Create a file with FAPL & FCPL */ - H5E_BEGIN_TRY - { - fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl); - } - H5E_END_TRY - VERIFY(fid, FAIL, "H5Fcreate"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case 4a: - * Userblock size = 1024 - * Alignment in use = 1023 - * Strategy is H5F_FILE_SPACE_PAGE; fsp_size = alignment = 1023 - * H5Pset_alignment() is 16 - * Outcome: - * Should fail at file creation: - * userblock (1024) is non-integral multiple of alignment (1023) - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)1024); - CHECK(ret, FAIL, "H5Pset_userblock"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, true, (hsize_t)1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - ret = H5Pset_file_space_page_size(fcpl, (hsize_t)1023); - CHECK(ret, FAIL, "H5Pset_file_space_page_size"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)16); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Create a file with FAPL & FCPL */ - H5E_BEGIN_TRY - { - fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl); - } - H5E_END_TRY - VERIFY(fid, FAIL, "H5Fcreate"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case 4b: - * Userblock size = 1024 - * Alignment in use = 16 - * Strategy is H5F_FILE_SPACE_FSM_AGGR; fsp_size = 1023 - * H5Pset_alignment() is 16 - * Outcome: - * Should succeed: - * userblock (512) is integral multiple of alignment (16) - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)1024); - CHECK(ret, FAIL, "H5Pset_userblock"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, false, (hsize_t)1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - ret = H5Pset_file_space_page_size(fcpl, (hsize_t)1023); - CHECK(ret, FAIL, "H5Pset_file_space_page_size"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)16); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper1(fcpl, fapl); - CHECK(ret, FAIL, "test_userblock_alignment_helper1"); - ret = test_userblock_alignment_helper2(fapl, true); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case 5a: - * Userblock size = 512 - * Alignment in use = 1024 - * Strategy is H5F_FILE_SPACE_PAGE; fsp_size = alignment = 1024 - * H5Pset_alignment() is 16 - * Outcome: - * Should fail at file creation: - * userblock (512) is less than alignment (1024) - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_userblock"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, false, (hsize_t)1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - ret = H5Pset_file_space_page_size(fcpl, (hsize_t)1024); - CHECK(ret, FAIL, "H5Pset_file_space_page_size"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)16); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Create a file with FAPL & FCPL */ - H5E_BEGIN_TRY - { - fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl); - } - H5E_END_TRY - VERIFY(fid, FAIL, "H5Fcreate"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case 5b: - * Userblock size = 512 - * Alignment in use = 16 - * Strategy is H5F_FILE_SPACE_NONE; fsp_size = 1024 - * H5Pset_alignment() is 16 - * Outcome: - * Should succeed: - * userblock (512) is integral multiple of alignment (16) - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_userblock"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_NONE, false, (hsize_t)1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - ret = H5Pset_file_space_page_size(fcpl, (hsize_t)1024); - CHECK(ret, FAIL, "H5Pset_file_space_page_size"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)16); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper1(fcpl, fapl); - CHECK(ret, FAIL, "test_userblock_alignment_helper1"); - ret = test_userblock_alignment_helper2(fapl, true); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case 6: - * Userblock size = 512 - * Alignment in use = 512 - * Strategy is H5F_FILE_SPACE_PAGE; fsp_size = alignment = 512 - * H5Pset_alignment() is 3 - * Reopen the file; H5Pset_alignment() is 1024 - * Outcome: - * Should succeed: - * Userblock (512) is the same as alignment (512); - * The H5Pset_alignment() calls have no effect - */ - /* Create file creation property list with user block */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - ret = H5Pset_userblock(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_userblock"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, false, (hsize_t)1); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_file_space_page_size"); - - /* Create file access property list with alignment */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)3); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper1(fcpl, fapl); - CHECK(ret, FAIL, "test_userblock_alignment_helper1"); - - /* Change alignment in FAPL */ - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)1024); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Call helper routines to perform file manipulations */ - ret = test_userblock_alignment_helper2(fapl, false); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - ret = test_userblock_alignment_helper2(fapl, true); - CHECK(ret, FAIL, "test_userblock_alignment_helper2"); - - /* Release property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - -} /* end test_userblock_alignment_paged() */ -#endif - -/**************************************************************** -** -** test_filespace_info(): -** Verify the following public routines retrieve and set file space -** information correctly: -** (1) H5Pget/set_file_space_strategy(): -** Retrieve and set file space strategy, persisting free-space, -** and free-space section threshold as specified -** (2) H5Pget/set_file_space_page_size(): -** Retrieve and set the page size for paged aggregation -** -****************************************************************/ -#if 0 -static void -test_filespace_info(const char *env_h5_drvr) -{ - hid_t fid; /* File IDs */ - hid_t fapl, new_fapl; /* File access property lists */ - hid_t fcpl, fcpl1, fcpl2; /* File creation property lists */ - H5F_fspace_strategy_t strategy; /* File space strategy */ - bool persist; /* Persist free-space or not */ - hsize_t threshold; /* Free-space section threshold */ - unsigned new_format; /* New or old format */ - H5F_fspace_strategy_t fs_strategy; /* File space strategy--iteration variable */ - unsigned fs_persist; /* Persist free-space or not--iteration variable */ - hsize_t fs_threshold; /* Free-space section threshold--iteration variable */ - hsize_t fsp_size; /* File space page size */ - char filename[FILENAME_LEN]; /* Filename to use */ - bool contig_addr_vfd; /* Whether VFD used has a contiguous address space */ - herr_t ret; /* Return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing file creation public routines: H5Pget/set_file_space_strategy & " - "H5Pget/set_file_space_page_size\n")); - - contig_addr_vfd = (bool)(strcmp(env_h5_drvr, "split") != 0 && strcmp(env_h5_drvr, "multi") != 0); - - fapl = h5_fileaccess(); - h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename); - - /* Get a copy of the file access property list */ - new_fapl = H5Pcopy(fapl); - CHECK(new_fapl, FAIL, "H5Pcopy"); - - /* Set the "use the latest version of the format" bounds */ - ret = H5Pset_libver_bounds(new_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* - * Case (1) - * Check file space information from a default file creation property list. - * Values expected: - * strategy--H5F_FILE_SPACE_AGGR - * persist--false - * threshold--1 - * file space page size--4096 - */ - /* Create file creation property list template */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - /* Retrieve file space information */ - ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - - /* Verify file space information */ - VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy"); - VERIFY(persist, false, "H5Pget_file_space_strategy"); - VERIFY(threshold, 1, "H5Pget_file_space_strategy"); - - /* Retrieve file space page size */ - ret = H5Pget_file_space_page_size(fcpl, &fsp_size); - CHECK(ret, FAIL, "H5Pget_file_space_page_size"); - VERIFY(fsp_size, FSP_SIZE_DEF, "H5Pget_file_space_page_size"); - - /* Close property list */ - H5Pclose(fcpl); - - /* - * Case (2) - * File space page size has a minimum size of 512. - * Setting value less than 512 will return an error; - * --setting file space page size to 0 - * --setting file space page size to 511 - * - * File space page size has a maximum size of 1 gigabyte. - * Setting value greater than 1 gigabyte will return an error. - */ - /* Create file creation property list template */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - /* Setting to 0: should fail */ - H5E_BEGIN_TRY - { - ret = H5Pset_file_space_page_size(fcpl, 0); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_file_space_page_size"); - - /* Setting to 511: should fail */ - H5E_BEGIN_TRY - { - ret = H5Pset_file_space_page_size(fcpl, 511); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_file_space_page_size"); - - /* Setting to 1GB+1: should fail */ - H5E_BEGIN_TRY - { - ret = H5Pset_file_space_page_size(fcpl, FSP_SIZE1G + 1); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_file_space_page_size"); - - /* Setting to 512: should succeed */ - ret = H5Pset_file_space_page_size(fcpl, FSP_SIZE512); - CHECK(ret, FAIL, "H5Pset_file_space_page_size"); - ret = H5Pget_file_space_page_size(fcpl, &fsp_size); - CHECK(ret, FAIL, "H5Pget_file_space_page_size"); - VERIFY(fsp_size, FSP_SIZE512, "H5Pget_file_space_page_size"); - - /* Setting to 1GB: should succeed */ - ret = H5Pset_file_space_page_size(fcpl, FSP_SIZE1G); - CHECK(ret, FAIL, "H5Pset_file_space_page_size"); - ret = H5Pget_file_space_page_size(fcpl, &fsp_size); - CHECK(ret, FAIL, "H5Pget_file_space_page_size"); - VERIFY(fsp_size, FSP_SIZE1G, "H5Pget_file_space_page_size"); - - /* Close property list */ - H5Pclose(fcpl); - - /* - * Case (3) - * Check file space information when creating a file with default properties. - * Values expected: - * strategy--H5F_FILE_SPACE_AGGR - * persist--false - * threshold--1 - * file space page size--4096 - */ - /* Create a file with default file creation and access property lists */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Get the file's creation property list */ - fcpl1 = H5Fget_create_plist(fid); - CHECK(fcpl1, FAIL, "H5Fget_create_plist"); - - /* Retrieve file space information */ - ret = H5Pget_file_space_strategy(fcpl1, &strategy, &persist, &threshold); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - - /* Verify file space information */ - VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy"); - VERIFY(persist, false, "H5Pget_file_space_strategy"); - VERIFY(threshold, 1, "H5Pget_file_space_strategy"); - - /* Retrieve file space page size */ - ret = H5Pget_file_space_page_size(fcpl1, &fsp_size); - CHECK(ret, FAIL, "H5Pget_file_space_page_size"); - VERIFY(fsp_size, FSP_SIZE_DEF, "H5Pget_file_space_page_size"); - - /* Close property lists */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Pclose(fcpl1); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case (4) - * Check file space information when creating a file with the - * latest library format and default properties. - * Values expected: - * strategy--H5F_FILE_SPACE_AGGR - * persist--false - * threshold--1 - * file space page size--4096 - */ - /* Create a file with the latest library format */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, new_fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Get the file's creation property */ - fcpl1 = H5Fget_create_plist(fid); - CHECK(fcpl1, FAIL, "H5Fget_create_plist"); - - /* Retrieve file space information */ - ret = H5Pget_file_space_strategy(fcpl1, &strategy, &persist, &threshold); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - - /* Verify file space information */ - VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy"); - VERIFY(persist, false, "H5Pget_file_space_strategy"); - VERIFY(threshold, 1, "H5Pget_file_space_strategy"); - - /* Retrieve file space page size */ - ret = H5Pget_file_space_page_size(fcpl1, &fsp_size); - CHECK(ret, FAIL, "H5Pget_file_space_page_size"); - VERIFY(fsp_size, FSP_SIZE_DEF, "H5Pget_file_space_page_size"); - - /* Close property lists */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Pclose(fcpl1); - CHECK(ret, FAIL, "H5Pclose"); - - /* - * Case (5) - * Check file space information with the following combinations: - * Create file with -- - * New or old format - * Persist or not persist free-space - * Different sizes for free-space section threshold (0 to 10) - * The four file space strategies: - * H5F_FSPACE_STRATEGY_FSM_AGGR, H5F_FSPACE_STRATEGY_PAGE, - * H5F_FSPACE_STRATEGY_AGGR, H5F_FSPACE_STRATEGY_NONE - * File space page size: set to 512 - * - */ - for (new_format = false; new_format <= true; new_format++) { - hid_t my_fapl; - - /* Set the FAPL for the type of format */ - if (new_format) { - MESSAGE(5, ("Testing with new group format\n")); - my_fapl = new_fapl; - } /* end if */ - else { - MESSAGE(5, ("Testing with old group format\n")); - my_fapl = fapl; - } /* end else */ - - /* Test with true or false for persisting free-space */ - for (fs_persist = false; fs_persist <= true; fs_persist++) { - - /* Test with free-space section threshold size: 0 to 10 */ - for (fs_threshold = 0; fs_threshold <= TEST_THRESHOLD10; fs_threshold++) { - - /* Test with 4 file space strategies */ - for (fs_strategy = H5F_FSPACE_STRATEGY_FSM_AGGR; fs_strategy < H5F_FSPACE_STRATEGY_NTYPES; - fs_strategy++) { - - if (!contig_addr_vfd && (fs_strategy == H5F_FSPACE_STRATEGY_PAGE || fs_persist)) - continue; - - /* Create file creation property list template */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - /* Set file space information */ - ret = H5Pset_file_space_strategy(fcpl, fs_strategy, (bool)fs_persist, fs_threshold); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - - ret = H5Pset_file_space_page_size(fcpl, FSP_SIZE512); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - - /* Retrieve file space information */ - ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - - /* Verify file space information */ - VERIFY(strategy, fs_strategy, "H5Pget_file_space_strategy"); - - if (fs_strategy < H5F_FSPACE_STRATEGY_AGGR) { - VERIFY(persist, (bool)fs_persist, "H5Pget_file_space_strategy"); - VERIFY(threshold, fs_threshold, "H5Pget_file_space_strategy"); - } - else { - VERIFY(persist, false, "H5Pget_file_space_strategy"); - VERIFY(threshold, 1, "H5Pget_file_space_strategy"); - } - - /* Retrieve and verify file space page size */ - ret = H5Pget_file_space_page_size(fcpl, &fsp_size); - CHECK(ret, FAIL, "H5Pget_file_space_page_size"); - VERIFY(fsp_size, FSP_SIZE512, "H5Pget_file_space_page_size"); - - /* Create the file with the specified file space info */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, my_fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Get the file's creation property */ - fcpl1 = H5Fget_create_plist(fid); - CHECK(fcpl1, FAIL, "H5Fget_create_plist"); - - /* Retrieve file space information */ - ret = H5Pget_file_space_strategy(fcpl1, &strategy, &persist, &threshold); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - - /* Verify file space information */ - VERIFY(strategy, fs_strategy, "H5Pget_file_space_strategy"); - - if (fs_strategy < H5F_FSPACE_STRATEGY_AGGR) { - VERIFY(persist, fs_persist, "H5Pget_file_space_strategy"); - VERIFY(threshold, fs_threshold, "H5Pget_file_space_strategy"); - } - else { - VERIFY(persist, false, "H5Pget_file_space_strategy"); - VERIFY(threshold, 1, "H5Pget_file_space_strategy"); - } - - /* Retrieve and verify file space page size */ - ret = H5Pget_file_space_page_size(fcpl1, &fsp_size); - CHECK(ret, FAIL, "H5Pget_file_space_page_size"); - VERIFY(fsp_size, FSP_SIZE512, "H5Pget_file_space_page_size"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid = H5Fopen(filename, H5F_ACC_RDWR, my_fapl); - CHECK(ret, FAIL, "H5Fopen"); - - /* Get the file's creation property */ - fcpl2 = H5Fget_create_plist(fid); - CHECK(fcpl2, FAIL, "H5Fget_create_plist"); - - /* Retrieve file space information */ - ret = H5Pget_file_space_strategy(fcpl2, &strategy, &persist, &threshold); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - - /* Verify file space information */ - VERIFY(strategy, fs_strategy, "H5Pget_file_space_strategy"); - if (fs_strategy < H5F_FSPACE_STRATEGY_AGGR) { - VERIFY(persist, fs_persist, "H5Pget_file_space_strategy"); - VERIFY(threshold, fs_threshold, "H5Pget_file_space_strategy"); - } - else { - VERIFY(persist, false, "H5Pget_file_space_strategy"); - VERIFY(threshold, 1, "H5Pget_file_space_strategy"); - } - - /* Retrieve and verify file space page size */ - ret = H5Pget_file_space_page_size(fcpl2, &fsp_size); - CHECK(ret, FAIL, "H5Pget_file_space_page_size"); - VERIFY(fsp_size, FSP_SIZE512, "H5Pget_file_space_page_size"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Release file creation property lists */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fcpl1); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fcpl2); - CHECK(ret, FAIL, "H5Pclose"); - } /* end for file space strategy type */ - } /* end for free-space section threshold */ - } /* end for fs_persist */ - - /* close fapl_ and remove the file */ -#if 0 - h5_clean_files(FILESPACE_NAME, my_fapl); -#endif - - H5E_BEGIN_TRY - { - H5Fdelete(FILESPACE_NAME[0], my_fapl); - } - H5E_END_TRY - } /* end for new_format */ - -} /* test_filespace_info() */ -#endif - -/**************************************************************** -** -** set_multi_split(): -** Internal routine to set up page-aligned address space for multi/split driver -** when testing paged aggregation. -** This is used by test_file_freespace() and test_sects_freespace(). -** -*****************************************************************/ -#if 0 -static int -set_multi_split(hid_t fapl, hsize_t pagesize, bool split) -{ - H5FD_mem_t memb_map[H5FD_MEM_NTYPES]; - hid_t memb_fapl_arr[H5FD_MEM_NTYPES]; - char *memb_name[H5FD_MEM_NTYPES]; - haddr_t memb_addr[H5FD_MEM_NTYPES]; - bool relax; - H5FD_mem_t mt; - - assert(split); - - memset(memb_name, 0, sizeof memb_name); - - /* Get current split settings */ - if (H5Pget_fapl_multi(fapl, memb_map, memb_fapl_arr, memb_name, memb_addr, &relax) < 0) - TEST_ERROR; - - if (split) { - /* Set memb_addr aligned */ - memb_addr[H5FD_MEM_SUPER] = ((memb_addr[H5FD_MEM_SUPER] + pagesize - 1) / pagesize) * pagesize; - memb_addr[H5FD_MEM_DRAW] = ((memb_addr[H5FD_MEM_DRAW] + pagesize - 1) / pagesize) * pagesize; - } - else { - /* Set memb_addr aligned */ - for (mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; mt++) - memb_addr[mt] = ((memb_addr[mt] + pagesize - 1) / pagesize) * pagesize; - } /* end else */ - - /* Set multi driver with new FAPLs */ - if (H5Pset_fapl_multi(fapl, memb_map, memb_fapl_arr, (const char *const *)memb_name, memb_addr, relax) < - 0) - TEST_ERROR; - - /* Free memb_name */ - for (mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; mt++) - free(memb_name[mt]); - - return 0; - -error: - return (-1); - -} /* set_multi_split() */ -#endif - -/**************************************************************** -** -** test_file_freespace(): -** This routine checks the free space available in a file as -** returned by the public routine H5Fget_freespace(). -** -** -*****************************************************************/ -#if 0 -static void -test_file_freespace(const char *env_h5_drvr) -{ - hid_t file; /* File opened with read-write permission */ -#if 0 - h5_stat_size_t empty_filesize; /* Size of file when empty */ - h5_stat_size_t mod_filesize; /* Size of file after being modified */ - hssize_t free_space; /* Amount of free space in file */ -#endif - hid_t fcpl; /* File creation property list */ - hid_t fapl, new_fapl; /* File access property list IDs */ - hid_t dspace; /* Dataspace ID */ - hid_t dset; /* Dataset ID */ - hid_t dcpl; /* Dataset creation property list */ - int k; /* Local index variable */ - unsigned u; /* Local index variable */ - char filename[FILENAME_LEN]; /* Filename to use */ - char name[32]; /* Dataset name */ - unsigned new_format; /* To use old or new format */ - bool split_vfd, multi_vfd; /* Indicate multi/split driver */ - hsize_t expected_freespace; /* Freespace expected */ - hsize_t expected_fs_del; /* Freespace expected after delete */ - herr_t ret; /* Return value */ - - split_vfd = !strcmp(env_h5_drvr, "split"); - multi_vfd = !strcmp(env_h5_drvr, "multi"); - - if (!split_vfd && !multi_vfd) { - fapl = h5_fileaccess(); - h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename); - - new_fapl = H5Pcopy(fapl); - CHECK(new_fapl, FAIL, "H5Pcopy"); - - /* Set the "use the latest version of the format" bounds */ - ret = H5Pset_libver_bounds(new_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - /* Test with old & new format */ - for (new_format = false; new_format <= true; new_format++) { - hid_t my_fapl; - - /* Set the FAPL for the type of format */ - if (new_format) { - MESSAGE(5, ("Testing with new group format\n")); - - my_fapl = new_fapl; - - if (multi_vfd || split_vfd) { - ret = set_multi_split(new_fapl, FSP_SIZE_DEF, split_vfd); - CHECK(ret, FAIL, "set_multi_split"); - } - - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, false, (hsize_t)1); - CHECK(ret, FAIL, "H5P_set_file_space_strategy"); - - expected_freespace = 4534; - if (split_vfd) - expected_freespace = 427; - if (multi_vfd) - expected_freespace = 248; - expected_fs_del = 0; - } /* end if */ - else { - MESSAGE(5, ("Testing with old group format\n")); - /* Default: non-paged aggregation, non-persistent free-space */ - my_fapl = fapl; - expected_freespace = 2464; - if (split_vfd) - expected_freespace = 264; - if (multi_vfd) - expected_freespace = 0; - expected_fs_del = 4096; - - } /* end else */ - - /* Create an "empty" file */ - file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, my_fapl); - CHECK(file, FAIL, "H5Fcreate"); - - ret = H5Fclose(file); - CHECK_I(ret, "H5Fclose"); -#if 0 - /* Get the "empty" file size */ - empty_filesize = h5_get_file_size(filename, H5P_DEFAULT); -#endif - /* Re-open the file (with read-write permission) */ - file = H5Fopen(filename, H5F_ACC_RDWR, my_fapl); - CHECK_I(file, "H5Fopen"); -#if 0 - /* Check that the free space is 0 */ - free_space = H5Fget_freespace(file); - CHECK(free_space, FAIL, "H5Fget_freespace"); - VERIFY(free_space, 0, "H5Fget_freespace"); -#endif - /* Create dataspace for datasets */ - dspace = H5Screate(H5S_SCALAR); - CHECK(dspace, FAIL, "H5Screate"); - - /* Create a dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Set the space allocation time to early */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create datasets in file */ - for (u = 0; u < 10; u++) { - snprintf(name, sizeof(name), "Dataset %u", u); - dset = H5Dcreate2(file, name, H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - } /* end for */ - - /* Close dataspace */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Check that there is the right amount of free space in the file */ - free_space = H5Fget_freespace(file); - CHECK(free_space, FAIL, "H5Fget_freespace"); - VERIFY(free_space, expected_freespace, "H5Fget_freespace"); -#endif - /* Delete datasets in file */ - for (k = 9; k >= 0; k--) { - snprintf(name, sizeof(name), "Dataset %u", (unsigned)k); - ret = H5Ldelete(file, name, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end for */ -#if 0 - /* Check that there is the right amount of free space in the file */ - free_space = H5Fget_freespace(file); - CHECK(free_space, FAIL, "H5Fget_freespace"); - VERIFY(free_space, expected_fs_del, "H5Fget_freespace"); -#endif - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -#if 0 - /* Get the file size after modifications*/ - mod_filesize = h5_get_file_size(filename, H5P_DEFAULT); - - /* Check that the file reverted to empty size */ - VERIFY(mod_filesize, empty_filesize, "H5Fget_freespace"); - - h5_clean_files(FILESPACE_NAME, my_fapl); -#endif - H5Fdelete(FILESPACE_NAME[0], my_fapl); - } /* end for */ - } - -} /* end test_file_freespace() */ - -/**************************************************************** -** -** test_sects_freespace(): -** This routine checks free-space section information for the -** file as returned by the public routine H5Fget_free_sections(). -** -*****************************************************************/ -static void -test_sects_freespace(const char *env_h5_drvr, bool new_format) -{ - char filename[FILENAME_LEN]; /* Filename to use */ - hid_t file; /* File ID */ - hid_t fcpl; /* File creation property list template */ - hid_t fapl; /* File access property list template */ -#if 0 - hssize_t free_space; /* Amount of free-space in the file */ -#endif - hid_t dspace; /* Dataspace ID */ - hid_t dset; /* Dataset ID */ - hid_t dcpl; /* Dataset creation property list */ - char name[32]; /* Dataset name */ - hssize_t nsects = 0; /* # of free-space sections */ - hssize_t nall; /* # of free-space sections for all types of data */ - hssize_t nmeta = 0, nraw = 0; /* # of free-space sections for meta/raw/generic data */ - H5F_sect_info_t sect_info[15]; /* Array to hold free-space information */ - H5F_sect_info_t all_sect_info[15]; /* Array to hold free-space information for all types of data */ - H5F_sect_info_t meta_sect_info[15]; /* Array to hold free-space information for metadata */ - H5F_sect_info_t raw_sect_info[15]; /* Array to hold free-space information for raw data */ - hsize_t total = 0; /* sum of the free-space section sizes */ - hsize_t tmp_tot = 0; /* Sum of the free-space section sizes */ - hsize_t last_size; /* Size of last free-space section */ - hsize_t dims[1]; /* Dimension sizes */ - unsigned u; /* Local index variable */ - H5FD_mem_t type; - bool split_vfd = false, multi_vfd = false; - herr_t ret; /* Return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing H5Fget_free_sections()--free-space section info in the file\n")); - - split_vfd = !strcmp(env_h5_drvr, "split"); - multi_vfd = !strcmp(env_h5_drvr, "multi"); - - if (!split_vfd && !multi_vfd) { - - fapl = h5_fileaccess(); - h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename); - - /* Create file-creation template */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - if (new_format) { - ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Set to paged aggregation and persistent free-space */ - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, true, (hsize_t)1); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - - /* Set up paged aligned address space for multi/split driver */ - if (multi_vfd || split_vfd) { - ret = set_multi_split(fapl, FSP_SIZE_DEF, split_vfd); - CHECK(ret, FAIL, "set_multi_split"); - } - } - else { - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, true, (hsize_t)1); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - } - - /* Create the file */ - file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - /* Create a dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Set the space allocation time to early */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create 1 large dataset */ - dims[0] = 1200; - dspace = H5Screate_simple(1, dims, NULL); - dset = H5Dcreate2(file, "Dataset_large", H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - - /* Close dataset */ - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataspace */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for datasets */ - dspace = H5Screate(H5S_SCALAR); - CHECK(dspace, FAIL, "H5Screate"); - - /* Create datasets in file */ - for (u = 0; u < 10; u++) { - snprintf(name, sizeof(name), "Dataset %u", u); - dset = H5Dcreate2(file, name, H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - } /* end for */ - - /* Close dataspace */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Delete odd-numbered datasets in file */ - for (u = 0; u < 10; u++) { - snprintf(name, sizeof(name), "Dataset %u", u); - if (u % 2) { - ret = H5Ldelete(file, name, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ - } /* end for */ - - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file with read-only permission */ - file = H5Fopen(filename, H5F_ACC_RDONLY, fapl); - CHECK_I(file, "H5Fopen"); -#if 0 - /* Get the amount of free space in the file */ - free_space = H5Fget_freespace(file); - CHECK(free_space, FAIL, "H5Fget_freespace"); -#endif - /* Get the total # of free-space sections in the file */ - nall = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, NULL); - CHECK(nall, FAIL, "H5Fget_free_sections"); - - /* Should return failure when nsects is 0 with a nonnull sect_info */ - nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, all_sect_info); - VERIFY(nsects, FAIL, "H5Fget_free_sections"); - - /* Retrieve and verify free space info for all the sections */ - memset(all_sect_info, 0, sizeof(all_sect_info)); - nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)nall, all_sect_info); - VERIFY(nsects, nall, "H5Fget_free_sections"); - - /* Verify the amount of free-space is correct */ - for (u = 0; u < nall; u++) - total += all_sect_info[u].size; -#if 0 - VERIFY(free_space, total, "H5Fget_free_sections"); -#endif - /* Save the last section's size */ - last_size = all_sect_info[nall - 1].size; - - /* Retrieve and verify free space info for -1 sections */ - memset(sect_info, 0, sizeof(sect_info)); - nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)(nall - 1), sect_info); - VERIFY(nsects, nall, "H5Fget_free_sections"); - - /* Verify the amount of free-space is correct */ - total = 0; - for (u = 0; u < (nall - 1); u++) { - VERIFY(sect_info[u].addr, all_sect_info[u].addr, "H5Fget_free_sections"); - VERIFY(sect_info[u].size, all_sect_info[u].size, "H5Fget_free_sections"); - total += sect_info[u].size; - } -#if 0 - VERIFY(((hsize_t)free_space - last_size), total, "H5Fget_free_sections"); -#endif - /* Retrieve and verify free-space info for +1 sections */ - memset(sect_info, 0, sizeof(sect_info)); - nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)(nall + 1), sect_info); - VERIFY(nsects, nall, "H5Fget_free_sections"); - - /* Verify amount of free-space is correct */ - total = 0; - for (u = 0; u < nall; u++) { - VERIFY(sect_info[u].addr, all_sect_info[u].addr, "H5Fget_free_sections"); - VERIFY(sect_info[u].size, all_sect_info[u].size, "H5Fget_free_sections"); - total += sect_info[u].size; - } - VERIFY(sect_info[nall].addr, 0, "H5Fget_free_sections"); - VERIFY(sect_info[nall].size, 0, "H5Fget_free_sections"); -#if 0 - VERIFY(free_space, total, "H5Fget_free_sections"); -#endif - - memset(meta_sect_info, 0, sizeof(meta_sect_info)); - if (multi_vfd) { - hssize_t ntmp; - - for (type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; type++) { - if (type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP) - continue; - /* Get the # of free-space sections in the file for metadata */ - ntmp = H5Fget_free_sections(file, type, (size_t)0, NULL); - CHECK(ntmp, FAIL, "H5Fget_free_sections"); - - if (ntmp > 0) { - nsects = H5Fget_free_sections(file, type, (size_t)ntmp, &meta_sect_info[nmeta]); - VERIFY(nsects, ntmp, "H5Fget_free_sections"); - nmeta += ntmp; - } - } - } - else { - /* Get the # of free-space sections in the file for metadata */ - nmeta = H5Fget_free_sections(file, H5FD_MEM_SUPER, (size_t)0, NULL); - CHECK(nmeta, FAIL, "H5Fget_free_sections"); - - /* Retrieve and verify free-space sections for metadata */ - nsects = H5Fget_free_sections(file, H5FD_MEM_SUPER, (size_t)nmeta, meta_sect_info); - VERIFY(nsects, nmeta, "H5Fget_free_sections"); - } - - /* Get the # of free-space sections in the file for raw data */ - nraw = H5Fget_free_sections(file, H5FD_MEM_DRAW, (size_t)0, NULL); - CHECK(nraw, FAIL, "H5Fget_free_sections"); - - /* Retrieve and verify free-space sections for raw data */ - memset(raw_sect_info, 0, sizeof(raw_sect_info)); - nsects = H5Fget_free_sections(file, H5FD_MEM_DRAW, (size_t)nraw, raw_sect_info); - VERIFY(nsects, nraw, "H5Fget_free_sections"); - - /* Sum all the free-space sections */ - for (u = 0; u < nmeta; u++) - tmp_tot += meta_sect_info[u].size; - - for (u = 0; u < nraw; u++) - tmp_tot += raw_sect_info[u].size; - - /* Verify free-space info */ - VERIFY(nmeta + nraw, nall, "H5Fget_free_sections"); - VERIFY(tmp_tot, total, "H5Fget_free_sections"); - - /* Closing */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Pclose(fcpl); - CHECK(fcpl, FAIL, "H5Pclose"); -#if 0 - h5_clean_files(FILESPACE_NAME, fapl); -#endif - H5Fdelete(FILESPACE_NAME[0], fapl); - } - -} /* end test_sects_freespace() */ -#endif - -/**************************************************************** -** -** test_filespace_compatible(): -** Verify that the trunk with the latest file space management -** can open, read and modify 1.6 HDF5 file and 1.8 HDF5 file. -** Also verify the correct file space handling information -** and the amount of free space. -** -****************************************************************/ -#if 0 -static void -test_filespace_compatible(void) -{ - int fd_old = (-1), fd_new = (-1); /* File descriptors for copying data */ - hid_t fid = -1; /* File id */ - hid_t did = -1; /* Dataset id */ - hid_t fcpl; /* File creation property list template */ - int check[100]; /* Temporary buffer for verifying dataset data */ - int rdbuf[100]; /* Temporary buffer for reading in dataset data */ - uint8_t buf[READ_OLD_BUFSIZE]; /* temporary buffer for reading */ - ssize_t nread; /* Number of bytes read in */ - unsigned i, j; /* Local index variable */ - hssize_t free_space; /* Amount of free-space in the file */ - bool persist; /* Persist free-space or not */ - hsize_t threshold; /* Free-space section threshold */ - H5F_fspace_strategy_t strategy; /* File space handling strategy */ - herr_t ret; /* Return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("File space compatibility testing for 1.6 and 1.8 files\n")); - - for (j = 0; j < NELMTS(OLD_FILENAME); j++) { - const char *filename = H5_get_srcdir_filename(OLD_FILENAME[j]); /* Corrected test file name */ - - /* Open and copy the test file into a temporary file */ - fd_old = HDopen(filename, O_RDONLY); - CHECK(fd_old, FAIL, "HDopen"); - fd_new = HDopen(FILE5, O_RDWR | O_CREAT | O_TRUNC, H5_POSIX_CREATE_MODE_RW); - CHECK(fd_new, FAIL, "HDopen"); - - /* Copy data */ - while ((nread = HDread(fd_old, buf, (size_t)READ_OLD_BUFSIZE)) > 0) { - ssize_t write_err = HDwrite(fd_new, buf, (size_t)nread); - CHECK(write_err, -1, "HDwrite"); - } /* end while */ - - /* Close the files */ - ret = HDclose(fd_old); - CHECK(ret, FAIL, "HDclose"); - ret = HDclose(fd_new); - CHECK(ret, FAIL, "HDclose"); - - /* Open the temporary test file */ - fid = H5Fopen(FILE5, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* There should not be any free space in the file */ - free_space = H5Fget_freespace(fid); - CHECK(free_space, FAIL, "H5Fget_freespace"); - VERIFY(free_space, (hssize_t)0, "H5Fget_freespace"); - - /* Get the file's file creation property list */ - fcpl = H5Fget_create_plist(fid); - CHECK(fcpl, FAIL, "H5Fget_create_plist"); - - /* Retrieve the file space info */ - ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - - /* File space handling strategy should be H5F_FSPACE_STRATEGY_FSM_AGGR */ - /* Persisting free-space should be false */ - /* Free-space section threshold should be 1 */ - VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy"); - VERIFY(persist, false, "H5Pget_file_space_strategy"); - VERIFY(threshold, 1, "H5Pget_file_space_strategy"); - - /* Generate raw data */ - for (i = 0; i < 100; i++) - check[i] = (int)i; - - /* Open and read the dataset */ - did = H5Dopen2(fid, DSETNAME, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the data read is correct */ - for (i = 0; i < 100; i++) - VERIFY(rdbuf[i], check[i], "test_compatible"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Remove the dataset */ - ret = H5Ldelete(fid, DSETNAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close the plist */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-Open the file */ - fid = H5Fopen(FILE5, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* The dataset should not be there */ - did = H5Dopen2(fid, DSETNAME, H5P_DEFAULT); - VERIFY(did, FAIL, "H5Dopen"); - - /* There should not be any free space in the file */ - free_space = H5Fget_freespace(fid); - CHECK(free_space, FAIL, "H5Fget_freespace"); - VERIFY(free_space, (hssize_t)0, "H5Fget_freespace"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ -} /* test_filespace_compatible */ -#endif - -/**************************************************************** -** -** test_filespace_1.10.0_compatible(): -** Verify that the latest file space management can open, read and -** modify 1.10.0 HDF5 files : -** h5fc_ext1_i.h5: H5F_FILE_SPACE_ALL, default threshold; has superblock extension but no fsinfo message -** h5fc_ext1_f.h5: H5F_FILE_SPACE_ALL_PERSIST, default threshold; has superblock extension with fsinfo -*message -** h5fc_ext2_if.h5: H5F_FILE_SPACE_ALL, non-default threshold; has superblock extension with fsinfo -*message -** h5fc_ext2_sf.h5: H5F_FILE_SPACE_VFD, default threshold; has superblock extension with fsinfo message -** h5fc_ext3_isf.h5: H5F_FILE_SPACE_AGGR_VFD, default threshold; has superblock extension with fsinfo -*message -** h5fc_ext_none.h5: H5F_FILE_SPACE_ALL, default threshold; without superblock extension -** The above files are copied from release 1.10.0 tools/h5format_convert/testfiles. -** -****************************************************************/ -#if 0 -static void -test_filespace_1_10_0_compatible(void) -{ - hid_t fid = -1; /* File id */ - hid_t did = -1; /* Dataset id */ - hid_t fcpl; /* File creation property list */ - bool persist; /* Persist free-space or not */ - hsize_t threshold; /* Free-space section threshold */ - H5F_fspace_strategy_t strategy; /* File space handling strategy */ - int wbuf[24]; /* Buffer for dataset data */ - int rdbuf[24]; /* Buffer for dataset data */ - int status; /* Status from copying the existing file */ - unsigned i, j; /* Local index variable */ - herr_t ret; /* Return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("File space compatibility testing for 1.10.0 files\n")); - - for (j = 0; j < NELMTS(OLD_1_10_0_FILENAME); j++) { - /* Make a copy of the test file */ - status = h5_make_local_copy(OLD_1_10_0_FILENAME[j], FILE5); - CHECK(status, FAIL, "h5_make_local_copy"); - - /* Open the temporary test file */ - fid = H5Fopen(FILE5, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Get the file's file creation property list */ - fcpl = H5Fget_create_plist(fid); - CHECK(fcpl, FAIL, "H5Fget_create_plist"); - - /* Retrieve the file space info */ - ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - - switch (j) { - case 0: -#if 0 - VERIFY(strategy, H5F_FILE_SPACE_STRATEGY_DEF, "H5Pget_file_space_strategy"); - VERIFY(persist, H5F_FREE_SPACE_PERSIST_DEF, "H5Pget_file_space_strategy"); - VERIFY(threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space_strategy"); -#endif - /* Open the dataset */ - did = H5Dopen2(fid, "/DSET_EA", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - for (i = 0; i < 24; i++) - wbuf[i] = (int)j + 1; - - /* Write to the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - case 1: - VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy"); - VERIFY(persist, true, "H5Pget_file_space_strategy"); -#if 0 - VERIFY(threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space_strategy"); -#endif - - /* Open the dataset */ - did = H5Dopen2(fid, "/DSET_NDATA_BT2", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - for (i = 0; i < 24; i++) - wbuf[i] = (int)j + 1; - - /* Write to the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - case 2: - VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy"); -#if 0 - VERIFY(persist, H5F_FREE_SPACE_PERSIST_DEF, "H5Pget_file_space_strategy"); -#endif - VERIFY(threshold, 2, "H5Pget_file_space_strategy"); - - /* Open the dataset */ - did = H5Dopen2(fid, "/DSET_NONE", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - for (i = 0; i < 24; i++) - wbuf[i] = (int)j + 1; - - /* Write to the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - case 3: - VERIFY(strategy, H5F_FSPACE_STRATEGY_NONE, "H5Pget_file_space_strategy"); -#if 0 - VERIFY(persist, H5F_FREE_SPACE_PERSIST_DEF, "H5Pget_file_space_strategy"); - VERIFY(threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space_strategy"); -#endif - /* Open the dataset */ - did = H5Dopen2(fid, "/GROUP/DSET_NDATA_EA", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - for (i = 0; i < 24; i++) - wbuf[i] = (int)j + 1; - - /* Write to the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - case 4: - VERIFY(strategy, H5F_FSPACE_STRATEGY_AGGR, "H5Pget_file_space_strategy"); -#if 0 - VERIFY(persist, H5F_FREE_SPACE_PERSIST_DEF, "H5Pget_file_space_strategy"); - VERIFY(threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space_strategy"); -#endif - /* Open the dataset */ - did = H5Dopen2(fid, "/GROUP/DSET_NDATA_FA", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - for (i = 0; i < 24; i++) - wbuf[i] = (int)j + 1; - - /* Write to the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - case 5: - VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy"); -#if 0 - VERIFY(persist, H5F_FREE_SPACE_PERSIST_DEF, "H5Pget_file_space_strategy"); - VERIFY(threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space_strategy"); -#endif - /* Open the dataset */ - did = H5Dopen2(fid, "/GROUP/DSET_NDATA_NONE", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - for (i = 0; i < 24; i++) - wbuf[i] = (int)j + 1; - - /* Write to the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - default: - break; - } - - /* Close the plist */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-Open the file */ - fid = H5Fopen(FILE5, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - switch (j) { - case 0: - /* Open and read the dataset */ - did = H5Dopen2(fid, "/DSET_EA", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the data read is correct */ - for (i = 0; i < 24; i++) - VERIFY(rdbuf[i], j + 1, "test_compatible"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - case 1: - /* Open and read the dataset */ - did = H5Dopen2(fid, "/DSET_NDATA_BT2", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the data read is correct */ - for (i = 0; i < 24; i++) - VERIFY(rdbuf[i], j + 1, "test_compatible"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - case 2: - /* Open and read the dataset */ - did = H5Dopen2(fid, "/DSET_NONE", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the data read is correct */ - for (i = 0; i < 24; i++) - VERIFY(rdbuf[i], j + 1, "test_compatible"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - case 3: - /* Open and read the dataset */ - did = H5Dopen2(fid, "/GROUP/DSET_NDATA_EA", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the data read is correct */ - for (i = 0; i < 24; i++) - VERIFY(rdbuf[i], j + 1, "test_compatible"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - case 4: - - /* Open and read the dataset */ - did = H5Dopen2(fid, "/GROUP/DSET_NDATA_FA", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the data read is correct */ - for (i = 0; i < 24; i++) - VERIFY(rdbuf[i], j + 1, "test_compatible"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - case 5: - - /* Open and read the dataset */ - did = H5Dopen2(fid, "/GROUP/DSET_NDATA_NONE", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen"); - - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the data read is correct */ - for (i = 0; i < 24; i++) - VERIFY(rdbuf[i], j + 1, "test_compatible"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - break; - - default: - break; - } - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - -} /* test_filespace_1_10_0_compatible */ -#endif - -/**************************************************************** -** -** test_filespace_round_compatible(): -** Verify that the trunk can open, read and modify these files-- -** 1) They are initially created (via gen_filespace.c) in the trunk -** with combinations of file space strategies, default/non-default -** threshold, and file spacing paging enabled/disabled. -** The library creates the file space info message with -** "mark if unknown" in these files. -** 2) They are copied to the 1.8 branch, and are opened/read/modified -** there via test_filespace_compatible() in test/tfile.c. -** The 1.8 library marks the file space info message as "unknown" -** in these files. -** 3) They are then copied back from the 1.8 branch to the trunk for -** compatibility testing via this routine. -** 4) Upon encountering the file space info message which is marked -** as "unknown", the library will use the default file space management -** from then on: non-persistent free-space managers, default threshold, -** and non-paging file space. -** -****************************************************************/ -#if 0 -static void -test_filespace_round_compatible(void) -{ - hid_t fid = -1; /* File id */ - hid_t fcpl = -1; /* File creation property list ID */ - unsigned j; /* Local index variable */ - H5F_fspace_strategy_t strategy; /* File space strategy */ - bool persist; /* Persist free-space or not */ - hsize_t threshold; /* Free-space section threshold */ - hssize_t free_space; /* Amount of free space in the file */ - int status; /* Status from copying the existing file */ - herr_t ret; /* Return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("File space compatibility testing for files from trunk to 1_8 to trunk\n")); - - for (j = 0; j < NELMTS(FSPACE_FILENAMES); j++) { - /* Make a copy of the test file */ - status = h5_make_local_copy(FSPACE_FILENAMES[j], FILE5); - CHECK(status, FAIL, "h5_make_local_copy"); - - /* Open the temporary test file */ - fid = H5Fopen(FILE5, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Get the file's creation property list */ - fcpl = H5Fget_create_plist(fid); - CHECK(fcpl, FAIL, "H5Fget_create_plist"); - - ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - VERIFY(strategy, H5F_FSPACE_STRATEGY_FSM_AGGR, "H5Pget_file_space_strategy"); - VERIFY(persist, false, "H5Pget_file_space_strategy"); - VERIFY(threshold, 1, "H5Pget_file_space_strategy"); - - /* There should not be any free space in the file */ - free_space = H5Fget_freespace(fid); - CHECK(free_space, FAIL, "H5Fget_freespace"); - VERIFY(free_space, (hssize_t)0, "H5Fget_freespace"); - - /* Closing */ - ret = H5Fclose(fid); - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - -} /* test_filespace_round_compatible */ - -/**************************************************************** -** -** test_libver_bounds_real(): -** Verify that a file created and modified with the -** specified libver bounds has the specified object header -** versions for the right objects. -** -****************************************************************/ -static void -test_libver_bounds_real(H5F_libver_t libver_create, unsigned oh_vers_create, H5F_libver_t libver_mod, - unsigned oh_vers_mod) -{ - hid_t file, group; /* Handles */ - hid_t fapl; /* File access property list */ - H5O_native_info_t ninfo; /* Object info */ - herr_t ret; /* Return value */ - - /* - * Create a new file using the creation properties. - */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - ret = H5Pset_libver_bounds(fapl, libver_create, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - file = H5Fcreate("tfile5.h5", H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - /* - * Make sure the root group has the correct object header version - */ - ret = H5Oget_native_info_by_name(file, "/", &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.version, oh_vers_create, "H5Oget_native_info_by_name"); - - /* - * Reopen the file and make sure the root group still has the correct version - */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Pset_libver_bounds(fapl, libver_mod, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - file = H5Fopen("tfile5.h5", H5F_ACC_RDWR, fapl); - CHECK(file, FAIL, "H5Fopen"); - - ret = H5Oget_native_info_by_name(file, "/", &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.version, oh_vers_create, "H5Oget_native_info_by_name"); - - /* - * Create a group named "G1" in the file, and make sure it has the correct - * object header version - */ - group = H5Gcreate2(file, "/G1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, FAIL, "H5Gcreate"); - - //! [H5Oget_native_info_snip] - - ret = H5Oget_native_info(group, &ninfo, H5O_NATIVE_INFO_HDR); - - //! [H5Oget_native_info_snip] - - CHECK(ret, FAIL, "H5Oget_native)info"); - VERIFY(ninfo.hdr.version, oh_vers_mod, "H5Oget_native_info"); - - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* - * Create a group named "/G1/G3" in the file, and make sure it has the - * correct object header version - */ - group = H5Gcreate2(file, "/G1/G3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, FAIL, "H5Gcreate"); - - ret = H5Oget_native_info(group, &ninfo, H5O_NATIVE_INFO_HDR); - CHECK(ret, FAIL, "H5Oget_native_info"); - VERIFY(ninfo.hdr.version, oh_vers_mod, "H5Oget_native_info"); - - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - //! [H5Oget_native_info_by_name_snip] - - /* - * Make sure the root group still has the correct object header version - */ - ret = H5Oget_native_info_by_name(file, "/", &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - - //! [H5Oget_native_info_by_name_snip] - - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.version, oh_vers_create, "H5Oget_native_info_by_name"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); -} /* end test_libver_bounds_real() */ -#endif - -/*------------------------------------------------------------------------- - * Function: test_libver_bounds_open - * - * Purpose: Tests opening latest file with various low/high bounds. - * - * Return: Success: 0 - * Failure: number of errors - * - *------------------------------------------------------------------------- - */ -#if 0 -#define VERBFNAME "tverbounds_dspace.h5" -#define VERBDSNAME "dataset 1" -#define SPACE1_DIM1 3 -static void -test_libver_bounds_open(void) -{ - hid_t file = -1; /* File ID */ - hid_t space = -1; /* Dataspace ID */ - hid_t dset = -1; /* Dataset ID */ - hid_t fapl = -1; /* File access property list ID */ - hid_t new_fapl = -1; /* File access property list ID for reopened file */ - hid_t dcpl = -1; /* Dataset creation property list ID */ - hsize_t dim[1] = {SPACE1_DIM1}; /* Dataset dimensions */ - H5F_libver_t low, high; /* File format bounds */ - hsize_t chunk_dim[1] = {SPACE1_DIM1}; /* Chunk dimensions */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Opening File in Various Version Bounds\n")); - - /* Create a file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Create dataspace */ - space = H5Screate_simple(1, dim, NULL); - CHECK(space, FAIL, "H5Screate_simple"); - - /* Create a dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Create and set chunk plist */ - ret = H5Pset_chunk(dcpl, 1, chunk_dim); - CHECK(ret, FAIL, "H5Pset_chunk"); - ret = H5Pset_deflate(dcpl, 9); - CHECK(ret, FAIL, "H5Pset_deflate"); - ret = H5Pset_chunk_opts(dcpl, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS); - CHECK(ret, FAIL, "H5Pset_chunk_opts"); - - /* Create a file with (LATEST, LATEST) bounds, create a layout version 4 - dataset, then close the file */ - - /* Set version bounds to (LATEST, LATEST) */ - low = H5F_LIBVER_LATEST; - high = H5F_LIBVER_LATEST; - ret = H5Pset_libver_bounds(fapl, low, high); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Create the file */ - file = H5Fcreate(VERBFNAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - /* Create dataset */ - dset = H5Dcreate2(file, VERBDSNAME, H5T_NATIVE_INT, space, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - - /* Close dataset and file */ - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Attempt to open latest file with (earliest, v18), should fail */ - ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_EARLIEST, H5F_LIBVER_V18); - H5E_BEGIN_TRY - { - file = H5Fopen(VERBFNAME, H5F_ACC_RDONLY, fapl); - } - H5E_END_TRY - VERIFY(file, FAIL, "Attempted to open latest file with earliest version"); - - /* Attempt to open latest file with (v18, v18), should fail */ - ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_V18, H5F_LIBVER_V18); - H5E_BEGIN_TRY - { - file = H5Fopen(VERBFNAME, H5F_ACC_RDONLY, fapl); - } - H5E_END_TRY - VERIFY(file, FAIL, "Attempted to open latest file with v18 bounds"); - - /* Opening VERBFNAME in these combination should succeed. - For each low bound, verify that it is upgraded properly */ - high = H5F_LIBVER_LATEST; - for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) { - H5F_libver_t new_low = H5F_LIBVER_EARLIEST; - - /* Set version bounds for opening file */ - ret = H5Pset_libver_bounds(fapl, low, high); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Open the file */ - file = H5Fopen(VERBFNAME, H5F_ACC_RDONLY, fapl); - CHECK(file, FAIL, "H5Fopen"); - - /* Get the new file access property */ - new_fapl = H5Fget_access_plist(file); - CHECK(new_fapl, FAIL, "H5Fget_access_plist"); - - /* Get new low bound and verify that it has been upgraded properly */ - ret = H5Pget_libver_bounds(new_fapl, &new_low, NULL); - CHECK(ret, FAIL, "H5Pget_libver_bounds"); - VERIFY(new_low >= H5F_LIBVER_V110, true, "Low bound should be upgraded to at least H5F_LIBVER_V110"); - - ret = H5Pclose(new_fapl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - } /* for low */ - - /* Close dataspace and property lists */ - ret = H5Sclose(space); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); -} /* end test_libver_bounds_open() */ -#endif - -/*------------------------------------------------------------------------- - * Function: test_libver_bounds_copy - * - * Purpose: Test to verify HDFFV-10800 is fixed: - * This test is copied from the user test program: copy10.c. - * (See attached programs in the jira issue.) - * - * The source file used in the test is generated by the user test - * program "fill18.c" with the 1.8 library. The file is created - * with the latest format and the dataset created in the file - * has version 3 fill value message (latest). - * - * The test creates the destination file with (v18, v18) version bounds. - * H5Ocopy() should succeed in copying the dataset in the source file - * to the destination file. - * - * Return: Success: 0 - * Failure: number of errors - * - *------------------------------------------------------------------------- - */ -#if 0 -static void -test_libver_bounds_copy(void) -{ - hid_t src_fid = -1; /* File ID */ - hid_t dst_fid = -1; /* File ID */ - hid_t fapl = -1; /* File access property list ID */ - const char *src_fname; /* Source file name */ - herr_t ret; /* Generic return value */ - bool driver_is_default_compatible; - - /* Output message about the test being performed */ - MESSAGE(5, ("Testing H5Ocopy a dataset in a 1.8 library file to a 1.10 library file\n")); - - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK_I(ret, "h5_driver_is_default_vfd_compatible"); - - if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); - return; - } - - /* Get the test file name */ - src_fname = H5_get_srcdir_filename(SRC_FILE); - - /* Open the source test file */ - src_fid = H5Fopen(src_fname, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(src_fid, FAIL, "H5Fopen"); - - /* Create file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Set library version bounds to (v18, v18) */ - ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_V18, H5F_LIBVER_V18); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Create the destination file with the fapl */ - dst_fid = H5Fcreate(DST_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(dst_fid, FAIL, "H5Pcreate"); - - /* Close the fapl */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Copy the dataset in the source file to the destination file */ - ret = H5Ocopy(src_fid, DSET_DS1, dst_fid, DSET_DS1, H5P_DEFAULT, H5P_DEFAULT); - VERIFY(ret, SUCCEED, "H5Ocopy"); - - /* Close the source file */ - ret = H5Fclose(src_fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close the destination file */ - ret = H5Fclose(dst_fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Remove the destination file */ - H5Fdelete(DST_FILE, H5P_DEFAULT); - -} /* end test_libver_bounds_copy() */ -#endif - -/**************************************************************** -** -** test_libver_bounds(): -** Verify that a file created and modified with various -** libver bounds is handled correctly. (Further testing -** welcome) -** -****************************************************************/ -#if 0 -static void -test_libver_bounds(void) -{ - /* Output message about test being performed */ - MESSAGE(5, ("Testing setting library version bounds\n")); - - /* Run the tests */ - test_libver_bounds_real(H5F_LIBVER_EARLIEST, 1, H5F_LIBVER_LATEST, 2); - test_libver_bounds_real(H5F_LIBVER_LATEST, 2, H5F_LIBVER_EARLIEST, 2); - test_libver_bounds_open(); -#if 0 - test_libver_bounds_copy(); -#endif -} /* end test_libver_bounds() */ -#endif - -/************************************************************************************** -** -** test_libver_bounds_low_high(): -** Tests to verify that format versions are correct with the following five -** pairs of low/high version bounds set in fapl via H5Pset_libver_bounds(): -** (1) (earliest, v18) -** (2) (earliest, v110) -** (3) (v18, v18) -** (4) (v18, v110) -** (5) (v110, v110) -** -** For each pair of setting in fapl, verify format versions with the following -** six tests: -** (1) test_libver_bounds_super(fapl): superblock versions -** (2) test_libver_bounds_obj(fapl): object header versions -** (3) test_libver_bounds_dataset(fapl): message versions associated with dataset -** (4) test_libver_bounds_dataspace(fapl): dataspace message versions -** (5) test_libver_bounds_datatype(fapl): datatype message versions -** (6) test_libver_bounds_attributes(fapl): attribute message versions -** -**************************************************************************************/ -#if 0 -static void -test_libver_bounds_low_high(const char *env_h5_drvr) -{ - hid_t fapl = H5I_INVALID_HID; /* File access property list */ - H5F_libver_t low, high; /* Low and high bounds */ - herr_t ret; /* The return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing setting (low, high) format version bounds\n")); - - /* Create a file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, H5I_INVALID_HID, "H5Pcreate"); - - /* Loop through all the combinations of low/high version bounds */ - for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) - for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) { - - H5E_BEGIN_TRY - { - /* Set the low/high version bounds */ - ret = H5Pset_libver_bounds(fapl, low, high); - } - H5E_END_TRY - - /* Should fail: invalid combinations */ - if (high == H5F_LIBVER_EARLIEST) { - VERIFY(ret, FAIL, "H5Pset_libver_bounds"); - continue; - } - - /* Should fail: invalid combinations */ - if (high < low) { - VERIFY(ret, FAIL, "H5Pset_libver_bounds"); - continue; - } - - /* All other combinations are valid and should succeed */ - VERIFY(ret, SUCCEED, "H5Pset_libver_bounds"); - - /* Tests to verify version bounds */ - test_libver_bounds_super(fapl, env_h5_drvr); - test_libver_bounds_obj(fapl); - test_libver_bounds_dataset(fapl); - test_libver_bounds_dataspace(fapl); - test_libver_bounds_datatype(fapl); - test_libver_bounds_attributes(fapl); - } - - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - -} /* end test_libver_bounds_low_high() */ -#endif - -/*********************************************************************** -** -** test_libver_bounds_super(): -** Verify superblock version with the following two tests: -** (1) test_libver_bounds_super_create(): -** --when creating a file with the input fapl and the fcpl -** that has the following feature enabled: -** (A) default fcpl -** (B) fcpl with v1-btee K value enabled -** (C) fcpl with shared messages enabled -** (D) fcpl with persistent free-space manager enabled -** -** (2) test_libver_bounds_super_open(): -** --when opening a file which is created with the input fapl -** and the fcpl setting as #A to #D above. -** -** These two tests are run with or without SWMR file access. -** -*************************************************************************/ -#if 0 -static void -test_libver_bounds_super(hid_t fapl, const char *env_h5_drvr) -{ - hid_t fcpl = H5I_INVALID_HID; /* File creation property list */ - herr_t ret; /* The return value */ - - /* Create a default fcpl: #A */ - /* This will result in superblock version 0 */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, H5I_INVALID_HID, "H5Pcreate"); - - /* Verify superblock version when creating a file with input fapl, - fcpl #A and with/without SWMR access */ - if (H5FD__supports_swmr_test(env_h5_drvr)) - test_libver_bounds_super_create(fapl, fcpl, true, false); - test_libver_bounds_super_create(fapl, fcpl, false, false); - - /* Verify superblock version when opening a file which is created - with input fapl, fcpl #A and with/without SWMR access */ - if (H5FD__supports_swmr_test(env_h5_drvr)) - test_libver_bounds_super_open(fapl, fcpl, true, false); - test_libver_bounds_super_open(fapl, fcpl, false, false); - - /* Close the fcpl */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Create a fcpl with v1-btree K value enabled: #B */ - /* This will result in superblock version 1 */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_istore_k(fcpl, 64); - CHECK(ret, FAIL, "H5Pset_istore_k"); - - /* Verify superblock version when creating a file with input fapl, - fcpl #B and with/without SWMR access */ - if (H5FD__supports_swmr_test(env_h5_drvr)) - test_libver_bounds_super_create(fapl, fcpl, true, false); - test_libver_bounds_super_create(fapl, fcpl, false, false); - - /* Verify superblock version when opening a file which is created - with input fapl, fcpl #B and with/without SWMR access */ - if (H5FD__supports_swmr_test(env_h5_drvr)) - test_libver_bounds_super_open(fapl, fcpl, true, false); - test_libver_bounds_super_open(fapl, fcpl, false, false); - - /* Close the fcpl */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Create a fcpl with shared messages enabled: #C */ - /* This will result in superblock version 2 */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_shared_mesg_nindexes(fcpl, 1); - CHECK(ret, FAIL, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(fcpl, 0, H5O_SHMESG_ATTR_FLAG, 2); - CHECK(ret, FAIL, "H5Pset_shared_mesg_index"); - - /* Verify superblock version when creating a file with input fapl, - fcpl #C and with/without SWMR access */ - if (H5FD__supports_swmr_test(env_h5_drvr)) - test_libver_bounds_super_create(fapl, fcpl, true, false); - test_libver_bounds_super_create(fapl, fcpl, false, false); - - /* Verify superblock version when opening a file which is created - with input fapl, fcpl #C and with/without SWMR access */ - if (H5FD__supports_swmr_test(env_h5_drvr)) - test_libver_bounds_super_open(fapl, fcpl, true, false); - test_libver_bounds_super_open(fapl, fcpl, false, false); - - /* Close the fcpl */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - if (h5_using_default_driver(env_h5_drvr)) { - /* Create a fcpl with persistent free-space manager enabled: #D */ - /* This will result in superblock version 2 */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, 1, (hsize_t)1); - CHECK(ret, FAIL, "H5Pset_file_space"); - - /* Verify superblock version when creating a file with input fapl, - fcpl #D and with/without SWMR access */ - if (H5FD__supports_swmr_test(env_h5_drvr)) - test_libver_bounds_super_create(fapl, fcpl, true, true); - test_libver_bounds_super_create(fapl, fcpl, false, true); - - /* Verify superblock version when opening a file which is created - with input fapl, fcpl #D and with/without SWMR access */ - if (H5FD__supports_swmr_test(env_h5_drvr)) - test_libver_bounds_super_open(fapl, fcpl, true, true); - test_libver_bounds_super_open(fapl, fcpl, false, true); - - /* Close the fcpl */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - } - -} /* end test_libver_bounds_super() */ - -/************************************************************************************************** -** -** test_libver_bounds_super_create(): -** Verify the following when the file is created with the input fapl, fcpl, -** and with/without SWMR access: -** (a) the superblock version # -** (b) the file's low bound setting -** (c) fail or succeed in creating the file -** -** For file creation, the bounds setting in fapl, the feature enabled in fcpl, -** and with/without SWMR file access will determine the results for #a to #c. -** -** The first row for the following two tables is the 5 pairs of low/high bounds setting -** in the input fapl. The next three rows list the expected results for #a to #c. -** "-->" indicates "upgrade to" -** -** The last table lists the expected results in creating the file when non-default -** free-space info (fsinfo) is enabled in fcpl. -** -** Creating a file with write access -** -------------------------------------------------------------------------------- -** | (earliest, v18) | (earliest, v110) | (v18, v18) | (v18, v110) | (v110, v110) | -** |______________________________________________________________________________| -** Superblock version | vers 0, 1, 2 | vers 0, 1, 2 | vers 2 | vers 2 | vers 3 | -** |------------------------------------------------------------------------------| -** File's low bound | no change | -** |------------------------------------------------------------------------------| -** File creation | succeed | -** |______________________________________________________________________________| -** -** Creating a file with SWMR-write access -** -------------------------------------------------------------------------------- -** | (earliest, v18) | (earliest, v110) | (v18, v18) | (v18, v110) | (v110, v110) | -** |______________________________________________________________________________| -** Superblock version | -- | vers 3 | -- | vers 3 | vers 3 | -** |------------------------------------------------------------------------------| -** File's low bound | -- | ->v110 | -- | ->v110 | no change | -** |------------------------------------------------------------------------------| -** File creation | fail | succeed | fail | succeed | succeed | -** |______________________________________________________________________________| -** -** Creating a file with write/SWMR-write access + non-default fsinfo -** -------------------------------------------------------------------------------- -** | (earliest, v18) | (earliest, v110) | (v18, v18) | (v18, v110) | (v110, v110) | -** |______________________________________________________________________________| -** File creation | fail | succeed | fail | succeed | succeed | -** |______________________________________________________________________________| -** -******************************************************************************************************/ -static void -test_libver_bounds_super_create(hid_t fapl, hid_t fcpl, htri_t is_swmr, htri_t non_def_fsm) -{ - hid_t fid = H5I_INVALID_HID; /* File ID */ -#if 0 - H5F_t *f = NULL; /* Internal file pointer */ -#endif - H5F_libver_t low, high; /* Low and high bounds */ -#if 0 - bool ok; /* The result is ok or not */ -#endif - herr_t ret; /* The return value */ - - /* Try to create the file */ - H5E_BEGIN_TRY - { - fid = H5Fcreate(FILE8, H5F_ACC_TRUNC | (is_swmr ? H5F_ACC_SWMR_WRITE : 0), fcpl, fapl); - } - H5E_END_TRY - -#if 0 - /* Get the internal file pointer if the create succeeds */ - if (fid >= 0) { - f = (H5F_t *)H5VL_object(fid); - CHECK_PTR(f, "H5VL_object"); - } -#endif - /* Retrieve the low/high bounds */ - ret = H5Pget_libver_bounds(fapl, &low, &high); - CHECK(ret, FAIL, "H5Pget_libver_bounds"); - - if (non_def_fsm && high < H5F_LIBVER_V110) - VERIFY(fid, H5I_INVALID_HID, "H5Fcreate"); - - else if (is_swmr) { /* SWMR is enabled */ - if (high >= H5F_LIBVER_V110) { /* Should succeed */ - VERIFY(fid >= 0, true, "H5Fcreate"); -#if 0 - VERIFY(HDF5_SUPERBLOCK_VERSION_3, f->shared->sblock->super_vers, "HDF5_superblock_ver_bounds"); - VERIFY(f->shared->low_bound >= H5F_LIBVER_V110, true, "HDF5_superblock_ver_bounds"); -#endif - } - else /* Should fail */ - VERIFY(fid >= 0, false, "H5Fcreate"); - } - else { /* Should succeed */ - VERIFY(fid >= 0, true, "H5Fcreate"); -#if 0 - VERIFY(low, f->shared->low_bound, "HDF5_superblock_ver_bounds"); - - switch (low) { - case H5F_LIBVER_EARLIEST: - ok = (f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_DEF || - f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_1 || - f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_2); - VERIFY(ok, true, "HDF5_superblock_ver_bounds"); - break; - - case H5F_LIBVER_V18: - ok = (f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_2); - VERIFY(ok, true, "HDF5_superblock_ver_bounds"); - break; - - case H5F_LIBVER_V110: - case H5F_LIBVER_V112: - case H5F_LIBVER_V114: - case H5F_LIBVER_V116: - ok = (f->shared->sblock->super_vers == HDF5_SUPERBLOCK_VERSION_3); - VERIFY(ok, true, "HDF5_superblock_ver_bounds"); - break; - - case H5F_LIBVER_ERROR: - case H5F_LIBVER_NBOUNDS: - default: - ERROR("H5Pget_libver_bounds"); - - } /* end switch */ -#endif - } /* end else */ - - if (fid >= 0) { /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } - -} /* end test_libver_bounds_super_create() */ - -/************************************************************************************************** -** -** test_libver_bounds_super_open(): -** Verify the following when opening a file which is created with the input fapl, fcpl, -** and with/without SWMR access: -** (a) the file's low bound setting -** (b) fail or succeed in opening the file -** -** (1) Create a file with the input fapl, fcpl and with/without SWMR access -** (2) Close the file -** (3) Reopen the file with a new fapl that is set to the 5 pairs of low/high bounds -** in a for loop. For each pair of setting in the new fapl: -** --Verify the expected results for #a and #b above. -** --Close the file. -** -** For file open, the file's superblock version, the low/high bounds setting in fapl, -** and with/without SWMR file access will determine the results for #a and #b. -** -** The first row for the following tables (#A - #B) is the 5 pairs of low/high bounds setting -** in the input fapl. The next two rows list the expected results for #a and #b. -** "-->" indicates "upgrade to" -** -** The last table (#C) lists the expected results in opening the file when non-default -** free-space info (fsinfo) is enabled in fcpl. -** -** (A) Opening a file with write access -** -** Superblock version 0, 1 -** -------------------------------------------------------------------------------- -** | (earliest, v18) | (earliest, v110) | (v18, v18) | (v18, v110) | (v110, v110) | -** |______________________________________________________________________________| -** File's low bound | no change | -** |------------------------------------------------------------------------------| -** File open | succeed | -** |______________________________________________________________________________| -** -** -** Superblock version 2 -** -------------------------------------------------------------------------------- -** | (earliest, v18) | (earliest, v110) | (v18, v18) | (v18, v110) | (v110, v110) | -** |______________________________________________________________________________| -** File's low bound | -->v18 | no change | -** |------------------------------------------------------------------------------| -** File open | succeed | -** |______________________________________________________________________________| -** -** Superblock version 3 -** -------------------------------------------------------------------------------- -** | (earliest, v18) | (earliest, v110) | (v18, v18) | (v18, v110) | (v110, v110) | -** |______________________________________________________________________________| -** File's low bound | -- | -->v110 | -- | -->v110 | no change | -** |------------------------------------------------------------------------------| -** File open | fail | succeed | fail | succeed | succeed | -** |______________________________________________________________________________| -** -** -** -** (B) Opening a file with SWMR-write access -** -** Superblock version 0, 1, 2 -** ------------------------------------------------------------------------------- -** | (earliest, v18) | (earliest, v10) | (v18, v18) | (v18, v110) | (v110, v110) | -** |_____________________________________________________________________________| -** File's low bound | ---- -** |-----------------------------------------------------------------------------| -** File open | fail -** |_____________________________________________________________________________| -** -** -** Superblock version 3 -** ------------------------------------------------------------------------------- -** | (earliest, v18) | (earliest, v10) | (v18, v18) | (v18, v110) | (v110, v110) | -** |_____________________________________________________________________________| -** File's low bound | -- | -->v110 | -- | -->v110 | no change | -** |-----------------------------------------------------------------------------| -** File open | fail | succeed | fail | succeed | succeed | -** |_____________________________________________________________________________| -** -** -** (C) Opening a file with write/SWMR-write access + non-default fsinfo -** ------------------------------------------------------------------------------- -** | (earliest, v18) | (earliest, v10) | (v18, v18) | (v18, v110) | (v110, v110) | -** |_____________________________________________________________________________| -** File open | fail | succeed | fail | succeed | succeed | -** |_____________________________________________________________________________| -** -** -******************************************************************************************************/ -static void -test_libver_bounds_super_open(hid_t fapl, hid_t fcpl, htri_t is_swmr, htri_t non_def_fsm) -{ - hid_t fid = H5I_INVALID_HID; /* File ID */ -#if 0 - H5F_t *f = NULL; /* Internal file pointer */ -#endif - hid_t new_fapl = H5I_INVALID_HID; /* File access property list */ -#if 0 - unsigned super_vers; /* Superblock version */ -#endif - H5F_libver_t low, high; /* Low and high bounds */ - herr_t ret; /* Return value */ - - /* Create the file with the input fcpl and fapl */ - H5E_BEGIN_TRY - { - fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, fcpl, fapl); - } - H5E_END_TRY - - /* Retrieve the low/high bounds */ - ret = H5Pget_libver_bounds(fapl, &low, &high); - CHECK(ret, FAIL, "H5Pget_libver_bounds"); - - if (non_def_fsm && high < H5F_LIBVER_V110) { - VERIFY(fid, H5I_INVALID_HID, "H5Fcreate"); - } - else { - VERIFY(fid >= 0, true, "H5Fcreate"); -#if 0 - /* Get the internal file pointer */ - f = (H5F_t *)H5VL_object(fid); - CHECK_PTR(f, "H5VL_object"); - - /* The file's superblock version */ - super_vers = f->shared->sblock->super_vers; -#endif - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Create a default file access property list */ - new_fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(new_fapl, FAIL, "H5Pcreate"); - - /* Loop through all the combinations of low/high bounds in new_fapl */ - for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) { - for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) { - H5E_BEGIN_TRY - { - ret = H5Pset_libver_bounds(new_fapl, low, high); - } - H5E_END_TRY - - /* Invalid combinations */ - if (ret < 0) - continue; - - /* Open the file with or without SWMR access */ - H5E_BEGIN_TRY - { - fid = H5Fopen(FILE8, H5F_ACC_RDWR | (is_swmr ? H5F_ACC_SWMR_WRITE : 0), new_fapl); - } - H5E_END_TRY - - if (non_def_fsm && high < H5F_LIBVER_V110) { - VERIFY(fid, H5I_INVALID_HID, "H5Fopen"); - continue; - } -#if 0 - /* Get the internal file pointer if the open succeeds */ - if (fid >= 0) { - f = (H5F_t *)H5VL_object(fid); - CHECK_PTR(f, "H5VL_object"); - } - - /* Verify the file open succeeds or fails */ - switch (super_vers) { - case 3: - if (high >= H5F_LIBVER_V110) { - /* Should succeed */ - VERIFY(fid >= 0, true, "H5Fopen"); - VERIFY(f->shared->low_bound >= H5F_LIBVER_V110, true, - "HDF5_superblock_ver_bounds"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } - else /* Should fail */ - VERIFY(fid >= 0, false, "H5Fopen"); - break; - - case 2: - if (is_swmr) /* Should fail */ - VERIFY(fid >= 0, false, "H5Fopen"); - else { /* Should succeed */ - VERIFY(fid >= 0, true, "H5Fopen"); - VERIFY(f->shared->low_bound >= H5F_LIBVER_V18, true, - "HDF5_superblock_ver_bounds"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } - break; - - case 1: - case 0: - if (is_swmr) /* Should fail */ - VERIFY(fid >= 0, false, "H5Fopen"); - else { /* Should succeed */ - VERIFY(fid >= 0, true, "H5Fopen"); - VERIFY(f->shared->low_bound, low, "HDF5_superblock_ver_bounds"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } - break; - - default: - break; - } /* end switch */ -#endif - } /* end for */ - } /* end for */ - - /* Close the file access property list */ - ret = H5Pclose(new_fapl); - CHECK(ret, FAIL, "H5Pclose"); - } /* end else */ - -} /* end test_libver_bounds_super_open() */ -#endif - -/**************************************************************** -** -** test_libver_bounds_obj(): -** Verify object header versions: -** -** (a) Create a file with: -** --the input fapl -** --a fcpl that has shared message enabled -** Verify the root group's object header version. -** Close the file. -** -** (b) Create another file with: -** --the input fapl -** --a default fcpl -** Verify the root group's object header version. -** Close the file. -** -** (c) Reopen the same file in (b) with a new fapl. -** The new fapl is set to the 5 pairs of low/high -** bounds in a "for" loop. For each setting in fapl: -** --Create a group in the file -** --Verify the group's object header version -** --Close and delete the group -** --Close the file -** -****************************************************************/ -#if 0 -static void -test_libver_bounds_obj(hid_t fapl) -{ - hid_t fid = H5I_INVALID_HID; /* File ID */ - hid_t gid = H5I_INVALID_HID; /* Group ID */ - hid_t fcpl = H5I_INVALID_HID; /* File creation property list */ - hid_t new_fapl = H5I_INVALID_HID; /* File access property list */ - H5F_t *f = NULL; /* Internal file pointer */ - H5F_libver_t low, high; /* Low and high bounds */ - H5O_native_info_t ninfo; /* Object info */ - H5G_info_t ginfo; /* Group info */ - herr_t ret; /* Return value */ - - /* Retrieve the low/high bounds from the input fapl */ - ret = H5Pget_libver_bounds(fapl, &low, &high); - CHECK(ret, FAIL, "H5Pget_libver_bounds"); - - /* Create a default file creation property list */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, H5I_INVALID_HID, "H5Pcreate"); - - /* Enable shared message in the fcpl */ - /* This will result in a version 2 object header */ - ret = H5Pset_shared_mesg_nindexes(fcpl, 1); - CHECK(ret, FAIL, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(fcpl, 0, H5O_SHMESG_ATTR_FLAG, 2); - CHECK(ret, FAIL, "H5Pset_shared_mesg_index"); - - /* Create the file with the fcpl and the input fapl */ - fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Get root group's object info */ - ret = H5Oget_native_info_by_name(fid, "/", &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - - /* Verify object header version is 2 because shared message is enabled */ - VERIFY(ninfo.hdr.version, H5O_VERSION_2, "H5O_obj_ver_bounds"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close the file creation property list */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Create a file with the default fcpl and input fapl */ - fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Get root group's object info */ - ret = H5Oget_native_info_by_name(fid, "/", &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - - /* Verify object header version is as indicated by low_bound */ - VERIFY(ninfo.hdr.version, H5O_obj_ver_bounds[low], "H5O_obj_ver_bounds"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Create a new default file access property list which - is used to open the file in the "for" loop */ - new_fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(new_fapl, H5I_INVALID_HID, "H5Pcreate"); - - /* Loop through all the combinations of low/high bounds in new_fapl */ - /* Open the file with the fapl; create a group and verify the - object header version, then delete the group and close the file.*/ - for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) { - for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) { - H5E_BEGIN_TRY - { - ret = H5Pset_libver_bounds(new_fapl, low, high); - } - H5E_END_TRY - - if (ret < 0) /* Invalid combinations */ - continue; - - /* Open the file */ - H5E_BEGIN_TRY - { - fid = H5Fopen(FILE8, H5F_ACC_RDWR, new_fapl); - } - H5E_END_TRY - - if (fid >= 0) { /* The file open succeeds */ - - /* Get the internal file pointer */ - f = (H5F_t *)H5VL_object(fid); - CHECK_PTR(f, "H5VL_object"); - - /* Create a group in the file */ - gid = H5Gcreate2(fid, GRP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Get group information */ - ret = H5Gget_info(gid, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - - /* Verify group storage type */ - if (f->shared->low_bound >= H5F_LIBVER_V18) - /* Links in group are stored in object header */ - VERIFY(ginfo.storage_type, H5G_STORAGE_TYPE_COMPACT, "H5Gget_info"); - else - /* Links in group are stored with a "symbol table" */ - VERIFY(ginfo.storage_type, H5G_STORAGE_TYPE_SYMBOL_TABLE, "H5Gget_info"); - - /* Get object header information */ - ret = H5Oget_native_info_by_name(gid, GRP_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - - /* Verify object header version as indicated by low_bound */ - VERIFY(ninfo.hdr.version, H5O_obj_ver_bounds[f->shared->low_bound], "H5O_obj_ver_bounds"); - - /* Close the group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Delete the group */ - ret = H5Ldelete(fid, GRP_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - } /* end if */ - } /* end for */ - } /* end for */ - - /* Close the file access property list */ - ret = H5Pclose(new_fapl); - CHECK(ret, FAIL, "H5Pclose"); - -} /* end test_libver_bounds_obj() */ - -/**************************************************************** -** -** test_libver_bounds_dataset(): -** Verify message versions associated with datasets: -** -** (a) Create a file with default fcpl and the input fapl. -** Create the following two datasets: -** --A contiguous dataset -** --A chunked dataset with "no filter edge chunks" -** For both datasets, verify the versions for the layout, -** fill value and filter pipeline messages. -** Close the file. -** -** (b) Create a new fapl that is set to the 5 pairs of low/high -** bounds in a "for" loop. For each pair of setting in the -** new fapl: -** --Open the same file in (a) with the fapl -** --Create a chunked dataset with 2 unlimited -** dimensions -** --Verify the versions for the layout, fill value -** and filter pipeline messages -** --Close and delete the dataset -** --Close the file -** -****************************************************************/ -static void -test_libver_bounds_dataset(hid_t fapl) -{ - hid_t fid = H5I_INVALID_HID; /* File ID */ - hid_t new_fapl = H5I_INVALID_HID; /* File access property list */ - hid_t did = H5I_INVALID_HID; /* Dataset ID */ - hid_t sid = H5I_INVALID_HID; /* Dataspace ID */ - hid_t dcpl = H5I_INVALID_HID; /* Dataset creation property list */ - H5D_t *dset = NULL; /* Internal dataset pointer */ - H5F_t *f = NULL; /* Internal file pointer */ - H5F_libver_t low, high; /* Low and high bounds */ - herr_t ret; /* Return value */ - hsize_t fix_dims2[2] = {10, 4}; /* Dimension sizes */ - hsize_t fix_chunks2[2] = {4, 3}; /* Chunk dimension sizes */ - hsize_t dims2[2] = {1, 4}; /* Dimension sizes */ - hsize_t max_dims2[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* Maximum dimension sizes */ - hsize_t chunks2[2] = {4, 5}; /* Chunk dimension sizes */ - - /* Retrieve the low/high bounds from the input fapl */ - ret = H5Pget_libver_bounds(fapl, &low, &high); - CHECK(ret, FAIL, "H5Pget_libver_bounds"); - - /* Create the file with the input fapl */ - fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Create the dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, H5I_INVALID_HID, "H5Screate"); - - /* Create a contiguous dataset */ - did = H5Dcreate2(fid, DSETA, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate"); - - /* Get the internal dataset pointer */ - dset = (H5D_t *)H5VL_object(did); - CHECK_PTR(dset, "H5VL_object"); - - /* Verify version for layout and fill value messages */ - if (low == H5F_LIBVER_EARLIEST) { - /* For layout message: the earliest version the library will set is 3 */ - /* For fill value message: the earliest version the library will set is 2 */ - VERIFY(dset->shared->layout.version, H5O_LAYOUT_VERSION_DEFAULT, "H5O_layout_ver_bounds"); - VERIFY(dset->shared->dcpl_cache.fill.version, H5O_FILL_VERSION_2, "H5O_fill_ver_bounds"); - } - else { - VERIFY(dset->shared->layout.version, H5O_layout_ver_bounds[low], "H5O_layout_ver_bounds"); - VERIFY(dset->shared->dcpl_cache.fill.version, H5O_fill_ver_bounds[low], "H5O_fill_ver_bounds"); - } - - /* Verify filter pipeline message version */ - VERIFY(dset->shared->dcpl_cache.pline.version, H5O_pline_ver_bounds[low], "H5O_pline_ver_bounds"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Set up dataspace and dcpl for creating a chunked dataset - with "no filter edge chunks" enabled. - This will result in a version 4 layout message */ - sid = H5Screate_simple(2, fix_dims2, NULL); - CHECK(sid, H5I_INVALID_HID, "H5Screate_simple"); - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_chunk(dcpl, 2, fix_chunks2); - CHECK(ret, FAIL, "H5Pset_chunk"); - ret = H5Pset_chunk_opts(dcpl, H5D_CHUNK_DONT_FILTER_PARTIAL_CHUNKS); - CHECK(ret, FAIL, "H5Pset_chunk_opts"); - - /* Create the chunked dataset */ - H5E_BEGIN_TRY - { - did = H5Dcreate2(fid, DSETB, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - } - H5E_END_TRY - - if (did >= 0) { - - /* Get the internal dataset pointer */ - dset = (H5D_t *)H5VL_object(did); - CHECK_PTR(dset, "H5VL_object"); - - /* Verify layout message version and chunk indexing type */ - VERIFY(dset->shared->layout.version, H5O_LAYOUT_VERSION_4, "H5O_layout_ver_bounds"); - VERIFY(dset->shared->layout.u.chunk.idx_type, H5D_CHUNK_IDX_FARRAY, "chunk_index_type"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - } - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Create a default file access property list which is used - to open the file in the 'for' loop */ - new_fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(new_fapl, H5I_INVALID_HID, "H5Pcreate"); - - /* Set up dataspace and dcpl for creating a chunked dataset with - 2 unlimited dimensions in the 'for' loop */ - sid = H5Screate_simple(2, dims2, max_dims2); - CHECK(sid, H5I_INVALID_HID, "H5Screate_simple"); - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_chunk(dcpl, 2, chunks2); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Loop through all the combinations of low/high bounds in new_fapl */ - /* Open the file with the fapl and create the chunked dataset */ - /* Verify the dataset's layout, fill value and filter pipeline message versions */ - for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) { - for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) { - H5E_BEGIN_TRY - { - ret = H5Pset_libver_bounds(new_fapl, low, high); - } - H5E_END_TRY - - if (ret < 0) /* Invalid low/high combinations */ - continue; - - /* Open the file */ - H5E_BEGIN_TRY - { - fid = H5Fopen(FILE8, H5F_ACC_RDWR, new_fapl); - } - H5E_END_TRY - - if (fid >= 0) { /* The file open succeeds */ - - /* Get the internal file pointer */ - f = (H5F_t *)H5VL_object(fid); - CHECK_PTR(f, "H5VL_object"); - - /* Create the chunked dataset */ - did = H5Dcreate2(fid, DSETC, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate2"); - - /* Get the internal file pointer */ - dset = (H5D_t *)H5VL_object(did); - CHECK_PTR(dset, "H5VL_object"); - - if (dset) { - /* Verify the dataset's layout, fill value and filter pipeline message versions */ - /* Also verify the chunk indexing type */ - if (f->shared->low_bound == H5F_LIBVER_EARLIEST) { - /* For layout message: the earliest version the library will set is 3 */ - /* For fill value message: the earliest version the library will set is 2 */ - VERIFY(dset->shared->layout.version, H5O_LAYOUT_VERSION_DEFAULT, - "H5O_layout_ver_bounds"); - VERIFY(dset->shared->dcpl_cache.fill.version, H5O_FILL_VERSION_2, - "H5O_fill_ver_bounds"); - } - else { - VERIFY(dset->shared->layout.version, H5O_layout_ver_bounds[f->shared->low_bound], - "H5O_layout_ver_bounds"); - VERIFY(dset->shared->dcpl_cache.fill.version, - H5O_fill_ver_bounds[f->shared->low_bound], "H5O_fill_ver_bounds"); - } - - /* Verify the filter pipeline message version */ - VERIFY(dset->shared->dcpl_cache.pline.version, H5O_pline_ver_bounds[f->shared->low_bound], - "H5O_pline_ver_bounds"); - - /* Verify the dataset's chunk indexing type */ - if (dset->shared->layout.version == H5O_LAYOUT_VERSION_LATEST) - VERIFY(dset->shared->layout.u.chunk.idx_type, H5D_CHUNK_IDX_BT2, "chunk_index_type"); - else - VERIFY(dset->shared->layout.u.chunk.idx_type, H5D_CHUNK_IDX_BTREE, - "chunk_index_type"); - } - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Delete the dataset */ - ret = H5Ldelete(fid, DSETC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - } /* end if */ - } /* end for */ - } /* end for */ - - /* Close the file access property list */ - ret = H5Pclose(new_fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - -} /* end test_libver_bounds_dataset() */ - -/**************************************************************** -** -** test_libver_bounds_dataspace(): -** Verify dataspace message versions: -** -** (a) Create a file with default fcpl and the input fapl. -** Create the following two datasets: -** --A dataset with scalar dataspace -** --A dataset with null dataspace -** For both datasets, verify the dataspace message versions. -** Close the file. -** -** (b) Create a new fapl that is set to the 5 pairs of low/high -** bounds in a "for" loop. For each pair of setting in the -** new fapl: -** --Open the same file in (a) with the fapl -** --Create a chunked dataset, a compact dataset and -** a contiguous dataset -** --Verify the dataspace message version for these -** three datasets -** --Delete the three datasets and the dataspaces -** --Close the file -** -****************************************************************/ -static void -test_libver_bounds_dataspace(hid_t fapl) -{ - hid_t fid = H5I_INVALID_HID; /* File ID */ - hid_t new_fapl = H5I_INVALID_HID; /* File access property list */ - hid_t did = H5I_INVALID_HID, did_null = H5I_INVALID_HID; /* Dataset IDs */ - hid_t did_compact = H5I_INVALID_HID, did_contig = H5I_INVALID_HID; /* Dataset IDs */ - hid_t sid = H5I_INVALID_HID, sid_null = H5I_INVALID_HID; /* Dataspace IDs */ - hid_t sid_compact = H5I_INVALID_HID, sid_contig = H5I_INVALID_HID; /* Dataspace IDs */ - hid_t dcpl = H5I_INVALID_HID; /* Dataset creation property list */ - hid_t dcpl_compact = H5I_INVALID_HID, dcpl_contig = H5I_INVALID_HID; /* Dataset creation property lists */ - H5S_t *space = NULL, *space_null = NULL; /* Internal dataspace pointers */ - H5F_t *f = NULL; /* Internal file pointer */ - H5F_libver_t low, high; /* Low and high bounds */ - hsize_t dims[1] = {1}; /* Dimension sizes */ - hsize_t dims2[2] = {5, 4}; /* Dimension sizes */ - hsize_t max_dims[1] = {H5S_UNLIMITED}; /* Maximum dimension sizes */ - hsize_t chunks[1] = {4}; /* Chunk dimension sizes */ - herr_t ret; /* Return value */ - - /* Retrieve the low/high bounds from the input fapl */ - ret = H5Pget_libver_bounds(fapl, &low, &high); - CHECK(ret, FAIL, "H5Pget_libver_bounds"); - - /* Create the file with the input fapl */ - fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Create scalar dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, H5I_INVALID_HID, "H5Screate"); - - /* Create a dataset with the scalar dataspace */ - did = H5Dcreate2(fid, DSET, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate"); - - /* Get the internal dataspace pointer */ - sid = H5Dget_space(did); - CHECK(sid, H5I_INVALID_HID, "H5Dget_space"); - space = (H5S_t *)H5I_object(sid); - CHECK_PTR(space, "H5I_object"); - - /* Verify the dataspace version */ - VERIFY(space->extent.version, H5O_sdspace_ver_bounds[low], "H5O_sdspace_ver_bounds"); - - /* Create null dataspace */ - sid_null = H5Screate(H5S_NULL); - CHECK(sid_null, H5I_INVALID_HID, "H5Screate"); - - /* Create a dataset with the null dataspace */ - did_null = H5Dcreate2(fid, DSET_NULL, H5T_NATIVE_INT, sid_null, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did_null, H5I_INVALID_HID, "H5Dcreate"); - - /* Get the internal dataspace pointer */ - sid_null = H5Dget_space(did_null); - CHECK(sid_null, H5I_INVALID_HID, "H5Dget_space"); - space_null = (H5S_t *)H5I_object(sid_null); - CHECK_PTR(space_null, "H5I_object"); - - /* Verify the dataspace version */ - VERIFY(space_null->extent.version, H5O_SDSPACE_VERSION_2, "H5O_sdspace_ver_bounds"); - - /* Close the datasets */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(did_null); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid_null); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Create a default file access property list which is used - to open the file in the 'for' loop */ - new_fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(new_fapl, H5I_INVALID_HID, "H5Pcreate"); - - /* Set up dataspace and dcpl for creating a chunked dataset */ - sid = H5Screate_simple(1, dims, max_dims); - CHECK(sid, H5I_INVALID_HID, "H5Screate_simple"); - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_chunk(dcpl, 1, chunks); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Set up dataspace and dcpl for creating a compact dataset */ - sid_compact = H5Screate_simple(1, dims, NULL); - CHECK(sid_compact, H5I_INVALID_HID, "H5Screate_simple"); - dcpl_compact = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl_compact, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_layout(dcpl_compact, H5D_COMPACT); - CHECK(ret, FAIL, "H5Pset_layout"); - - /* Set up dataspace and dcpl for creating a contiguous dataset */ - sid_contig = H5Screate_simple(2, dims2, NULL); - CHECK(sid_contig, H5I_INVALID_HID, "H5Screate_simple"); - dcpl_contig = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl_contig, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_layout(dcpl_contig, H5D_CONTIGUOUS); - CHECK(ret, FAIL, "H5Pset_layout"); - - /* Loop through all the combinations of low/high bounds in new_fapl */ - /* Open the file and create the chunked/compact/contiguous datasets */ - /* Verify the dataspace message version for the three datasets */ - for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) { - for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) { - hid_t tmp_sid, tmp_sid_compact, tmp_sid_contig; /* Dataspace IDs */ - H5S_t *tmp_space, *tmp_space_compact, *tmp_space_contig; /* Internal dataspace pointers */ - - H5E_BEGIN_TRY - { - ret = H5Pset_libver_bounds(new_fapl, low, high); - } - H5E_END_TRY - - if (ret < 0) /* Invalid low/high combinations */ - continue; - - /* Open the file */ - H5E_BEGIN_TRY - { - fid = H5Fopen(FILE8, H5F_ACC_RDWR, new_fapl); - } - H5E_END_TRY - - if (fid >= 0) { /* The file open succeeds */ - - /* Get the internal file pointer */ - f = (H5F_t *)H5VL_object(fid); - CHECK_PTR(f, "H5VL_object"); - - /* Create the chunked dataset */ - did = H5Dcreate2(fid, DSETA, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate2"); - - /* Get the internal dataspace pointer for the chunked dataset */ - tmp_sid = H5Dget_space(did); - CHECK(tmp_sid, H5I_INVALID_HID, "H5Dget_space"); - tmp_space = (H5S_t *)H5I_object(tmp_sid); - CHECK_PTR(tmp_space, "H5I_object"); - - /* Create the compact dataset */ - did_compact = H5Dcreate2(fid, DSETB, H5T_NATIVE_INT, sid_compact, H5P_DEFAULT, dcpl_compact, - H5P_DEFAULT); - CHECK(did_compact, H5I_INVALID_HID, "H5Dcreate2"); - - /* Get the internal dataspace pointer for the compact dataset */ - tmp_sid_compact = H5Dget_space(did_compact); - CHECK(tmp_sid_compact, H5I_INVALID_HID, "H5Dget_space"); - tmp_space_compact = (H5S_t *)H5I_object(tmp_sid_compact); - CHECK_PTR(tmp_space_compact, "H5I_object"); - - /* Create the contiguous dataset */ - did_contig = - H5Dcreate2(fid, DSETC, H5T_NATIVE_INT, sid_contig, H5P_DEFAULT, dcpl_contig, H5P_DEFAULT); - CHECK(did_contig, H5I_INVALID_HID, "H5Dcreate2"); - - /* Get the internal dataspace pointer for the contiguous dataset */ - tmp_sid_contig = H5Dget_space(did_contig); - CHECK(tmp_sid_contig, H5I_INVALID_HID, "H5Dget_space"); - tmp_space_contig = (H5S_t *)H5I_object(tmp_sid_contig); - CHECK_PTR(tmp_space_contig, "H5I_object"); - - if (tmp_space) { - /* Verify versions for the three dataspaces */ - VERIFY(tmp_space->extent.version, H5O_sdspace_ver_bounds[f->shared->low_bound], - "H5O_sdspace_ver_bounds"); - } - if (tmp_space_compact) { - VERIFY(tmp_space_compact->extent.version, H5O_sdspace_ver_bounds[f->shared->low_bound], - "H5O_sdspace_ver_bounds"); - } - if (tmp_space_contig) { - VERIFY(tmp_space_contig->extent.version, H5O_sdspace_ver_bounds[f->shared->low_bound], - "H5O_sdspace_ver_bounds"); - } - - /* Close the three datasets */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(did_compact); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Dclose(did_contig); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the three dataspaces */ - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(tmp_sid_compact); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(tmp_sid_contig); - CHECK(ret, FAIL, "H5Sclose"); - - /* Delete the three datasets */ - ret = H5Ldelete(fid, DSETA, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSETB, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - ret = H5Ldelete(fid, DSETC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - } /* end if */ - } /* end for */ - } /* end for */ - - /* Close the file access property list */ - ret = H5Pclose(new_fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close the three dataspaces */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid_compact); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid_contig); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the three dataset creation property lists */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(dcpl_compact); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(dcpl_contig); - CHECK(ret, FAIL, "H5Pclose"); - -} /* end test_libver_bounds_dataspace() */ - -/**************************************************************** -** -** test_libver_bounds_datatype(): -** Verify the datatype message version: -** -** (a) Create the following datatypes: -** 1) integer -** 2) enum -** 3) array -** 4) compound -** 5) vlen -** (b) Call test_libver_bounds_datatype_check() for each -** datatype in (a) to verify the datatype message version. -** -****************************************************************/ -static void -test_libver_bounds_datatype(hid_t fapl) -{ - hid_t tid = H5I_INVALID_HID, tid_enum = H5I_INVALID_HID, tid_array = H5I_INVALID_HID; /* Datatype IDs */ - hid_t tid_compound = H5I_INVALID_HID, tid_vlen = H5I_INVALID_HID; /* Datatype IDs */ - int enum_value; /* Value for enum datatype */ - typedef struct s1 { /* Data structure for compound datatype */ - char c; - int i; - } s1; - hsize_t dims[1] = {1}; /* Dimension sizes */ - herr_t ret; /* Return value */ - - /* Create integer datatype */ - tid = H5Tcopy(H5T_NATIVE_INT); - - /* Verify datatype message version */ - test_libver_bounds_datatype_check(fapl, tid); - - /* Create enum datatype */ - tid_enum = H5Tenum_create(tid); - enum_value = 0; - H5Tenum_insert(tid_enum, "val1", &enum_value); - enum_value = 1; - H5Tenum_insert(tid_enum, "val2", &enum_value); - - /* Verify datatype message version */ - test_libver_bounds_datatype_check(fapl, tid_enum); - - /* Create array datatype */ - tid_array = H5Tarray_create2(tid, 1, dims); - - /* Verify datatype message version */ - test_libver_bounds_datatype_check(fapl, tid_array); - - /* Create compound datatype */ - tid_compound = H5Tcreate(H5T_COMPOUND, sizeof(s1)); - H5Tinsert(tid_compound, "c", HOFFSET(s1, c), H5T_STD_U8LE); - H5Tinsert(tid_compound, "i", HOFFSET(s1, i), H5T_NATIVE_INT); - - /* Verify datatype message version */ - test_libver_bounds_datatype_check(fapl, tid_compound); - - /* Create vlen datatype */ - tid_vlen = H5Tvlen_create(tid); - - /* Verify datatype message version */ - test_libver_bounds_datatype_check(fapl, tid_vlen); - - /* Close the datatypes */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Tclose(tid_enum); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Tclose(tid_array); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Tclose(tid_compound); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Tclose(tid_vlen); - CHECK(ret, FAIL, "H5Tclose"); - -} /* end test_libver_bounds_datatype() */ - -/**************************************************************** -** -** test_libver_bounds_datatype_check(): -** Helper routine called by test_libver_bounds_datatype() -** to verify the datatype message version for the input tid: -** -** (a) Create a file with default fcpl and the input fapl. -** Create a contiguous dataset with the input tid. -** Verify the datatype message version. -** Create a committed datatype of string to be -** used later. -** Close the file. -** -** (b) Create a new fapl that is set to the 5 pairs of low/high -** bounds in a "for" loop. For each pair of setting in -** the new fapl: -** --Open the same file in (a) with the fapl -** --Verify the message version for the committed -** datatype created earlier -** --Create a chunked dataset with the input tid -** --Verify the datatype message version -** --Close and delete the dataset -** --Close the file -** -****************************************************************/ -static void -test_libver_bounds_datatype_check(hid_t fapl, hid_t tid) -{ - hid_t fid = H5I_INVALID_HID; /* File ID */ - hid_t new_fapl = H5I_INVALID_HID; /* File access property list */ - hid_t dcpl = H5I_INVALID_HID; /* Dataset creation property list */ - hid_t dtid = H5I_INVALID_HID; /* Datatype ID for the dataset */ - hid_t str_tid = H5I_INVALID_HID; /* String datatype ID */ - hid_t did = H5I_INVALID_HID; /* Dataset ID */ - hid_t sid = H5I_INVALID_HID; /* Dataspace ID */ - hsize_t dims[1] = {1}; /* Dimension sizes */ - hsize_t dims2[2] = {5, 4}; /* Dimension sizes */ - hsize_t max_dims2[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; /* Maximum dimension sizes */ - hsize_t chunks[2] = {2, 3}; /* Chunk dimension sizes */ - H5T_t *dtype = NULL; /* Internal datatype pointer */ - H5T_t *str_dtype = NULL; /* Internal datatype pointer for the string datatype */ - H5F_t *f = NULL; /* Internal file pointer */ - H5F_libver_t low, high; /* Low and high bounds */ - herr_t ret; /* Return value */ - - /* Retrieve the low/high version bounds from the input fapl */ - ret = H5Pget_libver_bounds(fapl, &low, &high); - CHECK(ret, FAIL, "H5Pget_libver_bounds"); - - /* Create the file with the input fapl */ - fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Create a committed datatype of string which will be used - later inside the 'for' loop */ - str_tid = H5Tcopy(H5T_C_S1); - CHECK(str_tid, H5I_INVALID_HID, "H5Tcopy"); - ret = H5Tset_size(str_tid, (size_t)10); - CHECK(ret, FAIL, "H5Tset_size"); - ret = H5Tcommit2(fid, "datatype", str_tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - ret = H5Tclose(str_tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create dataspace */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create a dataset with the input tid */ - did = H5Dcreate2(fid, DSET1, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate2"); - - /* Get the dataset's datatype */ - dtid = H5Dget_type(did); - CHECK(dtid, H5I_INVALID_HID, "H5Dget_type"); - - /* Get the internal datatype pointer */ - dtype = (H5T_t *)H5I_object(dtid); - CHECK_PTR(dtype, "H5I_object"); - - /* 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 - */ - - if (dtype->shared->type == H5T_COMPOUND || dtype->shared->type == H5T_ENUM || - dtype->shared->type == H5T_ARRAY) { - if (dtype->shared->type == H5T_ARRAY && low == H5F_LIBVER_EARLIEST) - VERIFY(dtype->shared->version, H5O_DTYPE_VERSION_2, "H5O_dtype_ver_bounds"); - else - VERIFY(dtype->shared->version, H5O_dtype_ver_bounds[low], "H5O_dtype_ver_bounds"); - } - else - VERIFY(dtype->shared->version, H5O_dtype_ver_bounds[H5F_LIBVER_EARLIEST], "H5O_dtype_ver_bounds"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the datatype */ - ret = H5Tclose(dtid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Create a default file access property list */ - new_fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(new_fapl, H5I_INVALID_HID, "H5Pcreate"); - - /* Set up dataspace and dcpl for creating a chunked dataset */ - sid = H5Screate_simple(2, dims2, max_dims2); - CHECK(sid, H5I_INVALID_HID, "H5Screate_simple"); - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_chunk(dcpl, 2, chunks); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Loop through all the combinations of low/high bounds */ - /* Open the file and create the chunked dataset with the input tid */ - /* Verify the dataset's datatype message version */ - /* Also verify the committed atatype message version */ - for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) { - for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) { - H5E_BEGIN_TRY - { - ret = H5Pset_libver_bounds(new_fapl, low, high); - } - H5E_END_TRY - - if (ret < 0) /* Invalid low/high combinations */ - continue; - - /* Open the file */ - H5E_BEGIN_TRY - { - fid = H5Fopen(FILE8, H5F_ACC_RDWR, new_fapl); - } - H5E_END_TRY - - if (fid >= 0) { /* The file open succeeds */ - - /* Get the internal file pointer */ - f = (H5F_t *)H5VL_object(fid); - CHECK_PTR(f, "H5VL_object"); - - /* Open the committed datatype */ - str_tid = H5Topen2(fid, "datatype", H5P_DEFAULT); - CHECK(str_tid, FAIL, "H5Topen2"); - str_dtype = (H5T_t *)H5VL_object(str_tid); - CHECK_PTR(str_dtype, "H5VL_object"); - - /* Verify the committed datatype message version */ - VERIFY(str_dtype->shared->version, H5O_dtype_ver_bounds[H5F_LIBVER_EARLIEST], - "H5O_dtype_ver_bounds"); - - /* Close the committed datatype */ - ret = H5Tclose(str_tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create the chunked dataset */ - did = H5Dcreate2(fid, DSETNAME, tid, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate2"); - - /* Get the dataset's datatype */ - dtid = H5Dget_type(did); - CHECK(dtid, H5I_INVALID_HID, "H5Dget_type"); - - /* Get the internal datatype pointer */ - dtype = (H5T_t *)H5I_object(dtid); - CHECK_PTR(dtype, "H5I_object"); - - if (dtype) { - /* Verify the dataset's 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 - */ - if (dtype->shared->type == H5T_COMPOUND || dtype->shared->type == H5T_ENUM || - dtype->shared->type == H5T_ARRAY) { - if (dtype->shared->type == H5T_ARRAY && f->shared->low_bound == H5F_LIBVER_EARLIEST) - VERIFY(dtype->shared->version, H5O_DTYPE_VERSION_2, "H5O_dtype_ver_bounds"); - else - VERIFY(dtype->shared->version, H5O_dtype_ver_bounds[f->shared->low_bound], - "H5O_dtype_ver_bounds"); - } - else - VERIFY(dtype->shared->version, H5O_dtype_ver_bounds[H5F_LIBVER_EARLIEST], - "H5O_dtype_ver_bounds"); - } - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the dataset's datatype */ - ret = H5Tclose(dtid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Delete the dataset */ - ret = H5Ldelete(fid, DSETNAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - } /* end if */ - } /* end for */ - } /* end for */ - - /* Close the file access property list */ - ret = H5Pclose(new_fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - -} /* end test_libver_bounds_datatype_check() */ - -/**************************************************************** -** -** test_libver_bounds_attributes(): -** Verify the attribute message versions: -** -** (a) Create a file with default fcpl and the input fapl. -** Create a group and attach the following three attributes -** to the group: -** (1) Attribute with a committed datatype -** (2) Attribute with integer type -** (3) Attribute with character encoding set -** Verify the three attributes' message versions. -** Close the file. -** -** (b) Create a fcpl that has shared datatype message enabled. -** Create a file with the fcpl and the input fapl. -** Create a group and attach an attribute with shared -** integer type to the group. -** Verify the attribute message version. -** Close the file -** -** (b) Create a new fapl that is set to the 5 pairs of low/high -** bounds in a "for" loop. For each pair of setting in -** the new fapl: -** --Open the same file in (b) with the fapl -** --Open the group and attach an attribute with integer -** type to the group -** --Verify the attribute message version -** --Delete the attribute -** --Close the group and the file -** -****************************************************************/ -static void -test_libver_bounds_attributes(hid_t fapl) -{ - hid_t fid = H5I_INVALID_HID; /* File ID */ - hid_t fcpl = H5I_INVALID_HID; /* File creation property list */ - hid_t new_fapl = H5I_INVALID_HID; /* File access property list */ - hid_t tid = H5I_INVALID_HID; /* Datatype ID */ - hid_t gid = H5I_INVALID_HID; /* Group ID */ - hid_t sid = H5I_INVALID_HID; /* Dataspace ID */ - hid_t aid = H5I_INVALID_HID; /* Attribute ID */ - hid_t attr_cpl = H5I_INVALID_HID; /* Attribute creation property list */ - H5A_t *attr = NULL; /* Internal attribute pointer */ - H5F_t *f = NULL; /* Internal file pointer */ - H5F_libver_t low, high; /* Low and high bounds */ - herr_t ret; /* Return value */ - - /* Retrieve the low/high bounds from the input fapl */ - ret = H5Pget_libver_bounds(fapl, &low, &high); - CHECK(ret, FAIL, "H5Pget_libver_bounds"); - - /* Create the file */ - fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Integer datatype */ - tid = H5Tcopy(H5T_NATIVE_INT); - CHECK(tid, H5I_INVALID_HID, "H5Tcopy"); - - /* Create a committed datatype */ - ret = H5Tcommit2(fid, "datatype", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, H5I_INVALID_HID, "H5Screate"); - - /* Create a group */ - gid = H5Gcreate2(fid, GRP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, H5I_INVALID_HID, "H5Gcreate2"); - - /* Attach an attribute to the group with the committed datatype */ - aid = H5Acreate2(gid, "attr1", tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, H5I_INVALID_HID, "H5Acreate2"); - - /* Get the internal attribute pointer */ - attr = (H5A_t *)H5VL_object(aid); - CHECK_PTR(attr, "H5VL_object"); - - /* Verify the attribute version */ - if (low == H5F_LIBVER_EARLIEST) - /* The earliest version the library can set for an attribute with committed datatype is 2 */ - VERIFY(attr->shared->version, H5O_ATTR_VERSION_2, "H5O_attr_ver_bounds"); - else - VERIFY(attr->shared->version, H5O_attr_ver_bounds[low], "H5O_attr_ver_bounds"); - - /* Close the attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create an attribute to the group with integer type */ - aid = H5Acreate2(gid, "attr2", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Get the internal attribute pointer */ - attr = (H5A_t *)H5VL_object(aid); - CHECK_PTR(attr, "H5VL_object"); - - /* Verify attribute version */ - VERIFY(attr->shared->version, H5O_attr_ver_bounds[low], "H5O_attr_ver_bounds"); - - /* Close the attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Enable character encoding in attribute creation property list */ - attr_cpl = H5Pcreate(H5P_ATTRIBUTE_CREATE); - CHECK(attr_cpl, H5I_INVALID_HID, "H5Pcreate"); - ret = H5Pset_char_encoding(attr_cpl, H5T_CSET_UTF8); - CHECK(ret, FAIL, "H5Pset_char_encoding"); - - /* Attach an attribute to the group with character encoding set */ - aid = H5Acreate2(gid, "attr3", H5T_NATIVE_INT, sid, attr_cpl, H5P_DEFAULT); - CHECK(aid, H5I_INVALID_HID, "H5Acreate2"); - - /* Get internal attribute pointer */ - attr = (H5A_t *)H5VL_object(aid); - CHECK_PTR(attr, "H5VL_object"); - - /* Verify attribute version */ - if (low == H5F_LIBVER_EARLIEST) - /* The earliest version the library can set for an attribute with character encoding is 3 */ - VERIFY(attr->shared->version, H5O_ATTR_VERSION_3, "H5O_attr_ver_bounds"); - else - VERIFY(attr->shared->version, H5O_attr_ver_bounds[low], "H5O_attr_ver_bounds"); - - /* Close the attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close the attribute creation property list */ - ret = H5Pclose(attr_cpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close the group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Create a copy of the file creation property list */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, H5I_INVALID_HID, "H5Pcreate"); - - /* Enable shared datatype message */ - ret = H5Pset_shared_mesg_nindexes(fcpl, 1); - CHECK(ret, FAIL, "H5Pset_shared_mesg_nindexes"); - ret = H5Pset_shared_mesg_index(fcpl, 0, H5O_SHMESG_DTYPE_FLAG, 2); - CHECK(ret, FAIL, "H5Pset_shared_mesg_index"); - - /* Create the file with shared datatype message enabled */ - fid = H5Fcreate(FILE8, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Create an integer datatype */ - tid = H5Tcopy(H5T_NATIVE_INT); - CHECK(tid, H5I_INVALID_HID, "H5Tcopy"); - - /* Create dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, H5I_INVALID_HID, "H5Screate"); - - /* Create a group */ - gid = H5Gcreate2(fid, GRP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, H5I_INVALID_HID, "H5Gcreate2"); - - /* Attach an attribute to the group with shared integer datatype */ - aid = H5Acreate2(gid, ATTR_NAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, H5I_INVALID_HID, "H5Acreate2"); - - /* Get the internal attribute pointer */ - attr = (H5A_t *)H5VL_object(aid); - CHECK_PTR(attr, "H5VL_object"); - - /* Verify the attribute version */ - if (low == H5F_LIBVER_EARLIEST) - /* The earliest version the library can set for an attribute with shared datatype is 2 */ - VERIFY(attr->shared->version, H5O_ATTR_VERSION_2, "H5O_attr_ver_bounds"); - else - VERIFY(attr->shared->version, H5O_attr_ver_bounds[low], "H5O_attr_ver_bounds"); - - /* Close the attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close the group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Create a default file access property list */ - new_fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(new_fapl, FAIL, "H5Pcreate"); - - /* Create a scalar dataspace to be used later for the attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, H5I_INVALID_HID, "H5Screate"); - - /* Loop through all the combinations of low/high bounds */ - /* Open the file and group and attach an attribute to the group */ - /* Verify the attribute version */ - for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) { - for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) { - H5E_BEGIN_TRY - { - ret = H5Pset_libver_bounds(new_fapl, low, high); - } - H5E_END_TRY - - if (ret < 0) /* Invalid low/high combinations */ - continue; - - /* Open the file */ - H5E_BEGIN_TRY - { - fid = H5Fopen(FILE8, H5F_ACC_RDWR, new_fapl); - } - H5E_END_TRY - - if (fid >= 0) { /* The file open succeeds */ - - /* Get the internal file pointer */ - f = (H5F_t *)H5VL_object(fid); - CHECK_PTR(f, "H5VL_object"); - - /* Open the group */ - gid = H5Gopen2(fid, GRP_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Attach an attribute to the group */ - aid = H5Acreate2(gid, "attr1", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Get the internal attribute pointer */ - attr = (H5A_t *)H5VL_object(aid); - CHECK_PTR(attr, "H5VL_object"); - - /* Verify the attribute message version */ - VERIFY(attr->shared->version, H5O_attr_ver_bounds[f->shared->low_bound], - "H5O_attr_ver_bounds"); - - /* Close the attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Delete the attribute */ - ret = H5Adelete(gid, "attr1"); - CHECK(ret, FAIL, "H5Adelete"); - - /* Close the group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - } /* end if */ - } /* end for */ - } /* end for */ - - /* Close the file access property list */ - ret = H5Pclose(new_fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - -} /* end test_libver_bounds_attributes() */ - -/**************************************************************** -** -** test_libver_macros(): -** Verify that H5_VERSION_GE and H5_VERSION_LE work correactly. -** -****************************************************************/ -static void -test_libver_macros(void) -{ - int major = H5_VERS_MAJOR; - int minor = H5_VERS_MINOR; - int release = H5_VERS_RELEASE; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing macros for library version comparison\n")); - - VERIFY(H5_VERSION_GE(major, minor, release), true, "H5_VERSION_GE"); - VERIFY(H5_VERSION_GE(major - 1, minor, release), true, "H5_VERSION_GE"); - VERIFY(H5_VERSION_GE(major - 1, minor + 1, release), true, "H5_VERSION_GE"); - VERIFY(H5_VERSION_GE(major - 1, minor, release + 1), true, "H5_VERSION_GE"); - VERIFY(H5_VERSION_GE(major, minor - 1, release), true, "H5_VERSION_GE"); - VERIFY(H5_VERSION_GE(major, minor - 1, release + 1), true, "H5_VERSION_GE"); - if (H5_VERS_RELEASE > 0) - VERIFY(H5_VERSION_GE(major, minor, release - 1), true, "H5_VERSION_GE"); - - VERIFY(H5_VERSION_GE(major + 1, minor, release), false, "H5_VERSION_GE"); - VERIFY(H5_VERSION_GE(major + 1, minor - 1, release), false, "H5_VERSION_GE"); - VERIFY(H5_VERSION_GE(major + 1, minor - 1, release - 1), false, "H5_VERSION_GE"); - VERIFY(H5_VERSION_GE(major, minor + 1, release), false, "H5_VERSION_GE"); - VERIFY(H5_VERSION_GE(major, minor + 1, release - 1), false, "H5_VERSION_GE"); - VERIFY(H5_VERSION_GE(major, minor, release + 1), false, "H5_VERSION_GE"); - - VERIFY(H5_VERSION_LE(major, minor, release), true, "H5_VERSION_LE"); - VERIFY(H5_VERSION_LE(major + 1, minor, release), true, "H5_VERSION_LE"); - VERIFY(H5_VERSION_LE(major + 1, minor - 1, release), true, "H5_VERSION_LE"); - VERIFY(H5_VERSION_LE(major + 1, minor - 1, release - 1), true, "H5_VERSION_LE"); - VERIFY(H5_VERSION_LE(major, minor + 1, release), true, "H5_VERSION_LE"); - VERIFY(H5_VERSION_LE(major, minor + 1, release - 1), true, "H5_VERSION_LE"); - VERIFY(H5_VERSION_LE(major, minor, release + 1), true, "H5_VERSION_LE"); - - VERIFY(H5_VERSION_LE(major - 1, minor, release), false, "H5_VERSION_LE"); - VERIFY(H5_VERSION_LE(major - 1, minor + 1, release), false, "H5_VERSION_LE"); - VERIFY(H5_VERSION_LE(major - 1, minor + 1, release + 1), false, "H5_VERSION_LE"); - VERIFY(H5_VERSION_LE(major, minor - 1, release), false, "H5_VERSION_LE"); - VERIFY(H5_VERSION_LE(major, minor - 1, release + 1), false, "H5_VERSION_LE"); - if (H5_VERS_RELEASE > 0) - VERIFY(H5_VERSION_LE(major, minor, release - 1), false, "H5_VERSION_LE"); -} /* test_libver_macros() */ - -/**************************************************************** -** -** test_libver_macros2(): -** Verify that H5_VERSION_GE works correactly and show how -** to use it. -** -****************************************************************/ -static void -test_libver_macros2(void) -{ - hid_t file; - hid_t grp; - htri_t status; - herr_t ret; /* Return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing macros for library version comparison with a file\n")); - - /* - * Create a file. - */ - file = H5Fcreate(FILE6, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* - * Create a group in the file. - */ - grp = H5Gcreate2(file, "Group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Gcreate"); - - /* - * Close the group - */ - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - - /* - * Delete the group using different function based on the library version. - * And verify the action. - */ -#if H5_VERSION_GE(1, 8, 0) - ret = H5Ldelete(file, "Group", H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lunlink"); - - status = H5Lexists(file, "Group", H5P_DEFAULT); - VERIFY(status, false, "H5Lexists"); -#else - ret = H5Gunlink(file, "Group"); - CHECK(ret, FAIL, "H5Gunlink"); - - H5E_BEGIN_TRY - { - grp = H5Gopen(file, "Group"); - } - H5E_END_TRY - VERIFY(grp, FAIL, "H5Gopen"); -#endif - - /* - * Close the file. - */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - -} /* test_libver_macros2() */ -#endif - -#if 0 -/**************************************************************** -** -** test_filesize(): -** Verify H5Fincrement_filesize() and H5Fget_eoa() works as -** indicated in the "RFC: Enhancement to the tool h5clear". -** -****************************************************************/ -static void -test_incr_filesize(void) -{ - hid_t fid; /* File opened with read-write permission */ - h5_stat_size_t filesize; /* Size of file when empty */ - hid_t fcpl; /* File creation property list */ - hid_t fapl; /* File access property list */ - hid_t dspace; /* Dataspace ID */ - hid_t dset; /* Dataset ID */ - hid_t dcpl; /* Dataset creation property list */ - unsigned u; /* Local index variable */ - char filename[FILENAME_LEN]; /* Filename to use */ - char name[32]; /* Dataset name */ - haddr_t stored_eoa; /* The stored EOA value */ - hid_t driver_id = -1; /* ID for this VFD */ - unsigned long driver_flags = 0; /* VFD feature flags */ - herr_t ret; /* Return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing H5Fincrement_filesize() and H5Fget_eoa())\n")); - - fapl = h5_fileaccess(); - h5_fixname(FILE8, fapl, filename, sizeof filename); - - /* Get the VFD feature flags */ - driver_id = H5Pget_driver(fapl); - CHECK(driver_id, FAIL, "H5Pget_driver"); - - ret = H5FDdriver_query(driver_id, &driver_flags); - CHECK(ret, FAIL, "H5PDdriver_query"); - - /* Check whether the VFD feature flag supports these two public routines */ - if (driver_flags & H5FD_FEAT_SUPPORTS_SWMR_IO) { - - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - /* Set file space strategy */ - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, false, (hsize_t)1); - CHECK(ret, FAIL, "H5P_set_file_space_strategy"); - - /* Create the test file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - dspace = H5Screate(H5S_SCALAR); - CHECK(dspace, FAIL, "H5Screate"); - - /* Create a dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Set the space allocation time to early */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create datasets in file */ - for (u = 0; u < 10; u++) { - snprintf(name, sizeof(name), "Dataset %u", u); - dset = H5Dcreate2(fid, name, H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - } /* end for */ - - /* Close dataspace */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Get the file size */ - filesize = h5_get_file_size(filename, fapl); - - /* Open the file */ - fid = H5Fopen(filename, H5F_ACC_RDWR, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Get the stored EOA */ - ret = H5Fget_eoa(fid, &stored_eoa); - CHECK(ret, FAIL, "H5Fget_eoa"); - - /* Verify the stored EOA is the same as filesize */ - VERIFY(filesize, stored_eoa, "file size"); - - /* Set the EOA to the MAX(EOA, EOF) + 512 */ - ret = H5Fincrement_filesize(fid, 512); - CHECK(ret, FAIL, "H5Fincrement_filesize"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Get the file size */ - filesize = h5_get_file_size(filename, fapl); - - /* Verify the filesize is the previous stored_eoa + 512 */ - VERIFY(filesize, stored_eoa + 512, "file size"); - - /* Close the file access property list */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close the file creation property list */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - } -} /* end test_incr_filesize() */ -#endif - -/**************************************************************** -** -** test_min_dset_ohdr(): -** Test API calls to toggle dataset object header minimization. -** -** TODO (as separate function?): -** + setting persists between close and (re)open? -** + dataset header sizes created while changing value of toggle -** -****************************************************************/ -#if 0 -static void -test_min_dset_ohdr(void) -{ - const char basename[] = "min_dset_ohdr_testfile"; - char filename[FILENAME_LEN] = ""; - hid_t file_id = -1; - hid_t file2_id = -1; - bool minimize; - herr_t ret; - - MESSAGE(5, ("Testing dataset object header minimization\n")); - - /*********/ - /* SETUP */ - /*********/ - - h5_fixname(basename, H5P_DEFAULT, filename, sizeof(filename)); - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK_I(file_id, "H5Fcreate"); - - /*********/ - /* TESTS */ - /*********/ - - /*---------------------------------------- - * TEST default value - */ - ret = H5Fget_dset_no_attrs_hint(file_id, &minimize); - CHECK(ret, FAIL, "H5Fget_dset_no_attrs_hint"); - VERIFY(minimize, false, "minimize flag"); - - /*---------------------------------------- - * TEST set to true - */ - ret = H5Fset_dset_no_attrs_hint(file_id, true); - CHECK(ret, FAIL, "H5Fset_dset_no_attrs_hint"); - - ret = H5Fget_dset_no_attrs_hint(file_id, &minimize); - CHECK(ret, FAIL, "H5Fget_dset_no_attrs_hint"); - VERIFY(minimize, true, "minimize flag"); - - /*---------------------------------------- - * TEST second file open on same filename - */ - file2_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK_I(file2_id, "H5Fopen"); - - /* verify true setting on second open - */ - ret = H5Fget_dset_no_attrs_hint(file_id, &minimize); - CHECK(ret, FAIL, "H5Fget_dset_no_attrs_hint"); - VERIFY(minimize, true, "minimize flag"); - - /* re-set to false on first open - */ - ret = H5Fset_dset_no_attrs_hint(file_id, false); - CHECK(ret, FAIL, "H5Fset_dset_no_attrs_hint"); - - /* verify false set on both opens - */ - ret = H5Fget_dset_no_attrs_hint(file_id, &minimize); - CHECK(ret, FAIL, "H5Fget_dset_no_attrs_hint"); - VERIFY(minimize, false, "minimize flag"); - - ret = H5Fget_dset_no_attrs_hint(file2_id, &minimize); - CHECK(ret, FAIL, "H5Fget_dset_no_attrs_hint"); - VERIFY(minimize, false, "minimize flag"); - - /* re-set to true on second open - */ - ret = H5Fset_dset_no_attrs_hint(file2_id, true); - CHECK(ret, FAIL, "H5Fset_dset_no_attrs_hint"); - - /* verify true set on both opens - */ - ret = H5Fget_dset_no_attrs_hint(file_id, &minimize); - CHECK(ret, FAIL, "H5Fget_dset_no_attrs_hint"); - VERIFY(minimize, true, "minimize flag"); - - ret = H5Fget_dset_no_attrs_hint(file2_id, &minimize); - CHECK(ret, FAIL, "H5Fget_dset_no_attrs_hint"); - VERIFY(minimize, true, "minimize flag"); - - /*---------------------------------------- - * TEST error cases - */ - - /* trying to set with invalid file ID */ - H5E_BEGIN_TRY - { - ret = H5Fset_dset_no_attrs_hint(-1, true); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fset_dset_no_attrs_hint"); - - /* trying to get with invalid file ID */ - H5E_BEGIN_TRY - { - ret = H5Fget_dset_no_attrs_hint(-1, &minimize); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fget_dset_no_attrs_hint"); - - /* trying to get with invalid pointer */ - H5E_BEGIN_TRY - { - ret = H5Fget_dset_no_attrs_hint(file_id, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fget_dset_no_attrs_hint"); - - /************/ - /* TEARDOWN */ - /************/ - - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(file2_id); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_min_dset_ohdr() */ -#endif - -/**************************************************************** -** -** test_deprec(): -** Test deprecated functionality. -** -****************************************************************/ -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS -static void -test_deprec(const char *env_h5_drvr) -{ - hid_t file; /* File IDs for old & new files */ - hid_t fcpl; /* File creation property list */ - hid_t fapl; /* File creation property list */ - hid_t new_fapl; - hsize_t align; - unsigned super; /* Superblock version # */ - unsigned freelist; /* Free list version # */ - unsigned stab; /* Symbol table entry version # */ - unsigned shhdr; /* Shared object header version # */ - H5F_info1_t finfo; /* global information about file */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing deprecated routines\n")); - - /* Creating a file with the default file creation property list should - * create a version 0 superblock - */ - - /* Create file with default file creation property list */ - file = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* Get the file's version information */ - ret = H5Fget_info1(file, &finfo); - CHECK(ret, FAIL, "H5Fget_info1"); - VERIFY(finfo.super_ext_size, 0, "H5Fget_info1"); - VERIFY(finfo.sohm.hdr_size, 0, "H5Fget_info1"); - VERIFY(finfo.sohm.msgs_info.index_size, 0, "H5Fget_info1"); - VERIFY(finfo.sohm.msgs_info.heap_size, 0, "H5Fget_info1"); - - /* Get the file's dataset creation property list */ - fcpl = H5Fget_create_plist(file); - CHECK(fcpl, FAIL, "H5Fget_create_plist"); - - /* Get the file's version information */ - ret = H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr); - CHECK(ret, FAIL, "H5Pget_version"); - VERIFY(super, 0, "H5Pget_version"); - VERIFY(freelist, 0, "H5Pget_version"); - VERIFY(stab, 0, "H5Pget_version"); - VERIFY(shhdr, 0, "H5Pget_version"); - - /* Close FCPL */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Only run this part of the test with the sec2/default driver */ - if (h5_using_default_driver(env_h5_drvr)) { - /* Create a file creation property list */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - /* Set a property in the FCPL that will push the superblock version up */ - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, 1, (hsize_t)0); - ret = H5Pset_file_space_page_size(fcpl, (hsize_t)512); - CHECK(ret, FAIL, "H5Pset_file_space_strategy"); - - fapl = H5Pcreate(H5P_FILE_ACCESS); - ret = H5Pset_alignment(fapl, (hsize_t)1, (hsize_t)1024); - CHECK(ret, FAIL, "H5Pset_alignment"); - - /* Creating a file with the non-default file creation property list should - * create a version 2 superblock - */ - - /* Create file with custom file creation property list */ - file = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - new_fapl = H5Fget_access_plist(file); - H5Pget_alignment(new_fapl, NULL, &align); - - /* Close FCPL */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Get the file's version information */ - ret = H5Fget_info1(file, &finfo); - CHECK(ret, FAIL, "H5Fget_info1"); - VERIFY(finfo.super_ext_size, 152, "H5Fget_info1"); - VERIFY(finfo.sohm.hdr_size, 0, "H5Fget_info1"); - VERIFY(finfo.sohm.msgs_info.index_size, 0, "H5Fget_info1"); - VERIFY(finfo.sohm.msgs_info.heap_size, 0, "H5Fget_info1"); - - /* Get the file's dataset creation property list */ - fcpl = H5Fget_create_plist(file); - CHECK(fcpl, FAIL, "H5Fget_create_plist"); - - /* Get the file's version information */ - ret = H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr); - CHECK(ret, FAIL, "H5Pget_version"); - VERIFY(super, 2, "H5Pget_version"); - VERIFY(freelist, 0, "H5Pget_version"); - VERIFY(stab, 0, "H5Pget_version"); - VERIFY(shhdr, 0, "H5Pget_version"); - - /* Close FCPL */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - file = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* Get the file's version information */ - ret = H5Fget_info1(file, &finfo); - CHECK(ret, FAIL, "H5Fget_info1"); - VERIFY(finfo.super_ext_size, 152, "H5Fget_info1"); - VERIFY(finfo.sohm.hdr_size, 0, "H5Fget_info1"); - VERIFY(finfo.sohm.msgs_info.index_size, 0, "H5Fget_info1"); - VERIFY(finfo.sohm.msgs_info.heap_size, 0, "H5Fget_info1"); - - /* Get the file's creation property list */ - fcpl = H5Fget_create_plist(file); - CHECK(fcpl, FAIL, "H5Fget_create_plist"); - - /* Get the file's version information */ - ret = H5Pget_version(fcpl, &super, &freelist, &stab, &shhdr); - CHECK(ret, FAIL, "H5Pget_version"); - VERIFY(super, 2, "H5Pget_version"); - VERIFY(freelist, 0, "H5Pget_version"); - VERIFY(stab, 0, "H5Pget_version"); - VERIFY(shhdr, 0, "H5Pget_version"); - - /* Close FCPL */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - { /* Test deprecated H5Pget/set_file_space() */ - - H5F_file_space_type_t old_strategy; - hsize_t old_threshold; - hid_t fid; - hid_t ffcpl; - - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - ret = H5Pget_file_space(fcpl, &old_strategy, &old_threshold); - CHECK(ret, FAIL, "H5Pget_file_space"); - VERIFY(old_strategy, H5F_FILE_SPACE_ALL, "H5Pget_file_space"); - VERIFY(old_threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space"); - - /* Set file space strategy and free space section threshold */ - ret = H5Pset_file_space(fcpl, H5F_FILE_SPACE_ALL_PERSIST, (hsize_t)0); - CHECK(ret, FAIL, "H5Pget_file_space"); - - /* Get the file space info from the creation property */ - ret = H5Pget_file_space(fcpl, &old_strategy, &old_threshold); - CHECK(ret, FAIL, "H5Pget_file_space"); - VERIFY(old_strategy, H5F_FILE_SPACE_ALL_PERSIST, "H5Pget_file_space"); - VERIFY(old_threshold, H5F_FREE_SPACE_THRESHOLD_DEF, "H5Pget_file_space"); - - ret = H5Pset_file_space(fcpl, H5F_FILE_SPACE_DEFAULT, (hsize_t)3); - CHECK(ret, FAIL, "H5Pget_file_space"); - - ret = H5Pget_file_space(fcpl, &old_strategy, &old_threshold); - CHECK(ret, FAIL, "H5Pget_file_space"); - VERIFY(old_strategy, H5F_FILE_SPACE_ALL_PERSIST, "H5Pget_file_space"); - VERIFY(old_threshold, 3, "H5Pget_file_space"); - - /* Create a file */ - fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - old_strategy = H5F_FILE_SPACE_DEFAULT; - old_threshold = 0; - ffcpl = H5Fget_create_plist(fid); - ret = H5Pget_file_space(ffcpl, &old_strategy, &old_threshold); - CHECK(ret, FAIL, "H5Pget_file_space"); - VERIFY(old_strategy, H5F_FILE_SPACE_ALL_PERSIST, "H5Pget_file_space"); - VERIFY(old_threshold, 3, "H5Pget_file_space"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Pclose(ffcpl); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Reopen the file */ - fid = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - old_strategy = H5F_FILE_SPACE_DEFAULT; - old_threshold = 0; - ffcpl = H5Fget_create_plist(fid); - ret = H5Pget_file_space(ffcpl, &old_strategy, &old_threshold); - CHECK(ret, FAIL, "H5Pget_file_space"); - VERIFY(old_strategy, H5F_FILE_SPACE_ALL_PERSIST, "H5Pget_file_space"); - VERIFY(old_threshold, 3, "H5Pget_file_space"); - - ret = H5Pclose(ffcpl); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } - } - -} /* test_deprec */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - -/**************************************************************** -** -** test_file(): Main low-level file I/O test routine. -** -****************************************************************/ -void -test_file(void) -{ - const char *env_h5_drvr; /* File Driver value from environment */ - hid_t fapl_id = H5I_INVALID_HID; /* VFD-dependent fapl ID */ - bool driver_is_default_compatible; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Low-Level File I/O\n")); - - /* Get the VFD to use */ - env_h5_drvr = getenv(HDF5_DRIVER); - if (env_h5_drvr == NULL) - env_h5_drvr = "nomatch"; - - /* Improved version of VFD-dependent checks */ - fapl_id = h5_fileaccess(); - CHECK(fapl_id, H5I_INVALID_HID, "h5_fileaccess"); - - ret = h5_driver_is_default_vfd_compatible(fapl_id, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); - - test_file_create(); /* Test file creation(also creation templates)*/ - test_file_open(env_h5_drvr); /* Test file opening */ - test_file_reopen(); /* Test file reopening */ - test_file_close(); /* Test file close behavior */ - test_get_file_id(); /* Test H5Iget_file_id */ - test_get_obj_ids(); /* Test H5Fget_obj_ids for Jira Issue 8528 */ - test_file_perm(); /* Test file access permissions */ - test_file_perm2(); /* Test file access permission again */ - test_file_is_accessible(env_h5_drvr); /* Test detecting HDF5 files correctly */ - test_file_delete(fapl_id); /* Test H5Fdelete */ - test_file_open_dot(); /* Test opening objects with "." for a name */ - test_file_open_overlap(); /* Test opening files in an overlapping manner */ - test_file_getname(); /* Test basic H5Fget_name() functionality */ - test_file_double_root_open(); /* Test opening root group from two files works properly */ - test_file_double_group_open(); /* Test opening same group from two files works properly */ - test_file_double_dataset_open(); /* Test opening same dataset from two files works properly */ - test_file_double_datatype_open(); /* Test opening same named datatype from two files works properly */ - test_file_double_file_dataset_open(true); - test_file_double_file_dataset_open(false); -#if 0 - test_userblock_file_size( - env_h5_drvr); /* Tests that files created with a userblock have the correct size */ - test_cached_stab_info(); /* Tests that files are created with cached stab info in the superblock */ - - if (driver_is_default_compatible) { - test_rw_noupdate(); /* Test to ensure that RW permissions don't write the file unless dirtied */ - } - - test_userblock_alignment( - env_h5_drvr); /* Tests that files created with a userblock and alignment interact properly */ - test_userblock_alignment_paged(env_h5_drvr); /* Tests files created with a userblock and alignment (via - paged aggregation) interact properly */ - test_filespace_info(env_h5_drvr); /* Test file creation public routines: */ - /* H5Pget/set_file_space_strategy() & H5Pget/set_file_space_page_size() */ - /* Skipped testing for multi/split drivers */ - test_file_freespace(env_h5_drvr); /* Test file public routine H5Fget_freespace() */ - /* Skipped testing for multi/split drivers */ - /* Setup for multi/split drivers are there already */ - test_sects_freespace(env_h5_drvr, - true); /* Test file public routine H5Fget_free_sections() for new format */ - /* Skipped testing for multi/split drivers */ - /* Setup for multi/split drivers are there already */ - test_sects_freespace(env_h5_drvr, false); /* Test file public routine H5Fget_free_sections() */ - /* Skipped testing for multi/split drivers */ - - if (driver_is_default_compatible) { - test_filespace_compatible(); /* Test compatibility for file space management */ - - test_filespace_round_compatible(); /* Testing file space compatibility for files from trunk to 1_8 to - trunk */ - test_filespace_1_10_0_compatible(); /* Testing file space compatibility for files from release 1.10.0 - */ - } - - test_libver_bounds(); /* Test compatibility for file space management */ - test_libver_bounds_low_high(env_h5_drvr); - test_libver_macros(); /* Test the macros for library version comparison */ - test_libver_macros2(); /* Test the macros for library version comparison */ - test_incr_filesize(); /* Test H5Fincrement_filesize() and H5Fget_eoa() */ - test_min_dset_ohdr(); /* Test dataset object header minimization */ -#ifndef H5_NO_DEPRECATED_SYMBOLS - test_file_ishdf5(env_h5_drvr); /* Test detecting HDF5 files correctly */ - test_deprec(env_h5_drvr); /* Test deprecated routines */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - - ret = H5Pclose(fapl_id); - CHECK(ret, FAIL, "H5Pclose"); - -} /* test_file() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_file - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_file(void) -{ - H5E_BEGIN_TRY - { - H5Fdelete(SFILE1, H5P_DEFAULT); - H5Fdelete(FILE1, H5P_DEFAULT); - H5Fdelete(FILE2, H5P_DEFAULT); - H5Fdelete(FILE3, H5P_DEFAULT); - H5Fdelete(FILE4, H5P_DEFAULT); - H5Fdelete(FILE5, H5P_DEFAULT); - H5Fdelete(FILE6, H5P_DEFAULT); - H5Fdelete(FILE7, H5P_DEFAULT); - H5Fdelete(DST_FILE, H5P_DEFAULT); - } - H5E_END_TRY -} diff --git a/test/API/tgenprop.c b/test/API/tgenprop.c deleted file mode 100644 index 9a1f551..0000000 --- a/test/API/tgenprop.c +++ /dev/null @@ -1,2195 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tgenprop - * - * Test the Generic Property functionality - * - *************************************************************/ - -#define H5P_FRIEND /*suppress error about including H5Ppkg */ - -/* Define this macro to indicate that the testing APIs should be available */ -#define H5P_TESTING - -#include "testhdf5.h" - -/* #include "H5Dprivate.h" */ /* For Dataset creation property list names */ -/* #include "H5Ppkg.h" */ /* Generic Properties */ - -#define FILENAME "tgenprop.h5" - -/* Property definitions */ -#define CLASS1_NAME "Class 1" -#define CLASS1_PATH "root/Class 1" - -#define CLASS2_NAME "Class 2" -#define CLASS2_PATH "root/Class 1/Class 2" - -/* Property definitions */ -#define PROP1_NAME "Property 1" -int prop1_def = 10; /* Property 1 default value */ -#define PROP1_SIZE sizeof(prop1_def) -#define PROP1_DEF_VALUE (&prop1_def) - -#define PROP2_NAME "Property 2" -float prop2_def = 3.14F; /* Property 2 default value */ -#define PROP2_SIZE sizeof(prop2_def) -#define PROP2_DEF_VALUE (&prop2_def) - -#define PROP3_NAME "Property 3" -char prop3_def[10] = "Ten chars"; /* Property 3 default value */ -#define PROP3_SIZE sizeof(prop3_def) -#define PROP3_DEF_VALUE (&prop3_def) - -#define PROP4_NAME "Property 4" -double prop4_def = 1.41; /* Property 4 default value */ -#define PROP4_SIZE sizeof(prop4_def) -#define PROP4_DEF_VALUE (&prop4_def) - -/* Structs used during iteration */ -typedef struct iter_data_t { - int iter_count; - char **names; -} iter_data_t; - -typedef struct count_data_t { - int count; - hid_t id; -} count_data_t; - -/**************************************************************** -** -** test_genprop_basic_class(): Test basic generic property list code. -** Tests creating new generic classes. -** -****************************************************************/ -static void -test_genprop_basic_class(void) -{ - hid_t cid1; /* Generic Property class ID */ - hid_t cid2; /* Generic Property class ID */ - hid_t cid3; /* Generic Property class ID */ - char *name; /* Name of class */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Generic Property List Class Creation Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Check class name */ - name = H5Pget_class_name(cid1); - CHECK_PTR(name, "H5Pget_class_name"); - if (strcmp(name, CLASS1_NAME) != 0) - TestErrPrintf("Class names don't match!, name=%s, CLASS1_NAME=%s\n", name, CLASS1_NAME); - H5free_memory(name); - - /* Check class parent */ - cid2 = H5Pget_class_parent(cid1); - CHECK_I(cid2, "H5Pget_class_parent"); - - /* Verify class parent correct */ - ret = H5Pequal(cid2, H5P_ROOT); - VERIFY(ret, 1, "H5Pequal"); - - /* Make certain false positives aren't being returned */ - ret = H5Pequal(cid2, H5P_FILE_CREATE); - VERIFY(ret, 0, "H5Pequal"); - - /* Close parent class */ - ret = H5Pclose_class(cid2); - CHECK_I(ret, "H5Pclose_class"); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); - - /* Create another new generic class, derived from file creation class */ - cid1 = H5Pcreate_class(H5P_FILE_CREATE, CLASS2_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Check class name */ - name = H5Pget_class_name(cid1); - CHECK_PTR(name, "H5Pget_class_name"); - if (strcmp(name, CLASS2_NAME) != 0) - TestErrPrintf("Class names don't match!, name=%s, CLASS2_NAME=%s\n", name, CLASS2_NAME); - H5free_memory(name); - - /* Check class parent */ - cid2 = H5Pget_class_parent(cid1); - CHECK_I(cid2, "H5Pget_class_parent"); - - /* Verify class parent correct */ - ret = H5Pequal(cid2, H5P_FILE_CREATE); - VERIFY(ret, 1, "H5Pequal"); - - /* Check class parent's parent */ - cid3 = H5Pget_class_parent(cid2); - CHECK_I(cid3, "H5Pget_class_parent"); - - /* Verify class parent's parent correct */ - ret = H5Pequal(cid3, H5P_GROUP_CREATE); - VERIFY(ret, 1, "H5Pequal"); - - /* Close parent class's parent */ - ret = H5Pclose_class(cid3); - CHECK_I(ret, "H5Pclose_class"); - - /* Close parent class */ - ret = H5Pclose_class(cid2); - CHECK_I(ret, "H5Pclose_class"); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); -} /* end test_genprop_basic_class() */ - -/**************************************************************** -** -** test_genprop_basic_class_prop(): Test basic generic property list code. -** Tests adding properties to generic classes. -** -****************************************************************/ -static void -test_genprop_basic_class_prop(void) -{ - hid_t cid1; /* Generic Property class ID */ - size_t size; /* Size of property */ - size_t nprops; /* Number of properties in class */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Generic Property List Class Properties Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 0, "H5Pget_nprops"); - - /* Check the existence of the first property (should fail) */ - ret = H5Pexist(cid1, PROP1_NAME); - VERIFY(ret, 0, "H5Pexist"); - - /* Insert first property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Try to insert the first property again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, - NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pregister2"); - - /* Check the existence of the first property */ - ret = H5Pexist(cid1, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check the size of the first property */ - ret = H5Pget_size(cid1, PROP1_NAME, &size); - CHECK_I(ret, "H5Pget_size"); - VERIFY(size, PROP1_SIZE, "H5Pget_size"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 1, "H5Pget_nprops"); - - /* Insert second property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Try to insert the second property again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Pregister2(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, - NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pregister2"); - - /* Check the existence of the second property */ - ret = H5Pexist(cid1, PROP2_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check the size of the second property */ - ret = H5Pget_size(cid1, PROP2_NAME, &size); - CHECK_I(ret, "H5Pget_size"); - VERIFY(size, PROP2_SIZE, "H5Pget_size"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 2, "H5Pget_nprops"); - - /* Insert third property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Check the existence of the third property */ - ret = H5Pexist(cid1, PROP3_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check the size of the third property */ - ret = H5Pget_size(cid1, PROP3_NAME, &size); - CHECK_I(ret, "H5Pget_size"); - VERIFY(size, PROP3_SIZE, "H5Pget_size"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 3, "H5Pget_nprops"); - - /* Unregister first property */ - ret = H5Punregister(cid1, PROP1_NAME); - CHECK_I(ret, "H5Punregister"); - - /* Try to check the size of the first property (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Pget_size(cid1, PROP1_NAME, &size); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pget_size"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 2, "H5Pget_nprops"); - - /* Unregister second property */ - ret = H5Punregister(cid1, PROP2_NAME); - CHECK_I(ret, "H5Punregister"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 1, "H5Pget_nprops"); - - /* Unregister third property */ - ret = H5Punregister(cid1, PROP3_NAME); - CHECK_I(ret, "H5Punregister"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 0, "H5Pget_nprops"); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); -} /* end test_genprop_basic_class_prop() */ - -/**************************************************************** -** -** test_genprop_iter1(): Property iterator for test_genprop_class_iter -** -****************************************************************/ -static int -test_genprop_iter1(hid_t H5_ATTR_UNUSED id, const char *name, void *iter_data) -{ - iter_data_t *idata = (iter_data_t *)iter_data; - - return strcmp(name, idata->names[idata->iter_count++]); -} - -/**************************************************************** -** -** test_genprop_class_iter(): Test basic generic property list code. -** Tests iterating over properties in a generic class. -** -****************************************************************/ -static void -test_genprop_class_iter(void) -{ - hid_t cid1; /* Generic Property class ID */ - size_t nprops; /* Number of properties in class */ - int idx; /* Index to start iteration at */ - struct { /* Struct for iterations */ - int iter_count; - const char **names; - } iter_struct; - const char *pnames[4] = {/* Names of properties for iterator */ - PROP1_NAME, PROP2_NAME, PROP3_NAME, PROP4_NAME}; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Generic Property List Class Property Iteration Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Insert first property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert second property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert third property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert third property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP4_NAME, PROP4_SIZE, PROP4_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 4, "H5Pget_nprops"); - - /* Iterate over all properties in class */ - iter_struct.iter_count = 0; - iter_struct.names = pnames; - ret = H5Piterate(cid1, NULL, test_genprop_iter1, &iter_struct); - VERIFY(ret, 0, "H5Piterate"); - - /* Iterate over last three properties in class */ - idx = iter_struct.iter_count = 1; - ret = H5Piterate(cid1, &idx, test_genprop_iter1, &iter_struct); - VERIFY(ret, 0, "H5Piterate"); - VERIFY(idx, (int)nprops, "H5Piterate"); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); -} /* end test_genprop_class_iter() */ - -/**************************************************************** -** -** test_genprop_cls_*_cb1(): Property List callbacks for test_genprop_class_callback -** -****************************************************************/ -static herr_t -test_genprop_cls_crt_cb1(hid_t list_id, void *create_data) -{ - count_data_t *cdata = (count_data_t *)create_data; - - cdata->count++; - cdata->id = list_id; - - return SUCCEED; -} - -static herr_t -test_genprop_cls_cpy_cb1(hid_t new_list_id, hid_t H5_ATTR_UNUSED old_list_id, void *copy_data) -{ - count_data_t *cdata = (count_data_t *)copy_data; - - cdata->count++; - cdata->id = new_list_id; - - return SUCCEED; -} - -static herr_t -test_genprop_cls_cls_cb1(hid_t list_id, void *create_data) -{ - count_data_t *cdata = (count_data_t *)create_data; - - cdata->count++; - cdata->id = list_id; - - return SUCCEED; -} - -/**************************************************************** -** -** test_genprop_class_callback(): Test basic generic property list code. -** Tests callbacks for property lists in a generic class. -** -****************************************************************/ -static void -test_genprop_class_callback(void) -{ - hid_t cid1; /* Generic Property class ID */ - hid_t cid2; /* Generic Property class ID */ - hid_t lid1; /* Generic Property list ID */ - hid_t lid2; /* Generic Property list ID */ - hid_t lid3; /* Generic Property list ID */ - size_t nprops; /* Number of properties in class */ - struct { /* Struct for callbacks */ - int count; - hid_t id; - } crt_cb_struct, cpy_cb_struct, cls_cb_struct; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Generic Property List Class Callback Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = - H5Pcreate_class(H5P_ROOT, CLASS1_NAME, test_genprop_cls_crt_cb1, &crt_cb_struct, - test_genprop_cls_cpy_cb1, &cpy_cb_struct, test_genprop_cls_cls_cb1, &cls_cb_struct); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Insert first property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert second property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert third property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 3, "H5Pget_nprops"); - - /* Initialize class callback structs */ - crt_cb_struct.count = 0; - crt_cb_struct.id = (-1); - cpy_cb_struct.count = 0; - cpy_cb_struct.id = (-1); - cls_cb_struct.count = 0; - cls_cb_struct.id = (-1); - - /* Create a property list from the class */ - lid1 = H5Pcreate(cid1); - CHECK_I(lid1, "H5Pcreate"); - - /* Verify that the creation callback occurred */ - VERIFY(crt_cb_struct.count, 1, "H5Pcreate"); - VERIFY(crt_cb_struct.id, lid1, "H5Pcreate"); - - /* Check the number of properties in list */ - ret = H5Pget_nprops(lid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 3, "H5Pget_nprops"); - - /* Create another property list from the class */ - lid2 = H5Pcreate(cid1); - CHECK_I(lid2, "H5Pcreate"); - - /* Verify that the creation callback occurred */ - VERIFY(crt_cb_struct.count, 2, "H5Pcreate"); - VERIFY(crt_cb_struct.id, lid2, "H5Pcreate"); - - /* Check the number of properties in list */ - ret = H5Pget_nprops(lid2, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 3, "H5Pget_nprops"); - - /* Create another property list by copying an existing list */ - lid3 = H5Pcopy(lid1); - CHECK_I(lid3, "H5Pcopy"); - - /* Verify that the copy callback occurred */ - VERIFY(cpy_cb_struct.count, 1, "H5Pcopy"); - VERIFY(cpy_cb_struct.id, lid3, "H5Pcopy"); - - /* Check the number of properties in list */ - ret = H5Pget_nprops(lid3, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 3, "H5Pget_nprops"); - - /* Close first list */ - ret = H5Pclose(lid1); - CHECK_I(ret, "H5Pclose"); - - /* Verify that the close callback occurred */ - VERIFY(cls_cb_struct.count, 1, "H5Pclose"); - VERIFY(cls_cb_struct.id, lid1, "H5Pclose"); - - /* Close second list */ - ret = H5Pclose(lid2); - CHECK_I(ret, "H5Pclose"); - - /* Verify that the close callback occurred */ - VERIFY(cls_cb_struct.count, 2, "H5Pclose"); - VERIFY(cls_cb_struct.id, lid2, "H5Pclose"); - - /* Close third list */ - ret = H5Pclose(lid3); - CHECK_I(ret, "H5Pclose"); - - /* Verify that the close callback occurred */ - VERIFY(cls_cb_struct.count, 3, "H5Pclose"); - VERIFY(cls_cb_struct.id, lid3, "H5Pclose"); - - /* Create another new generic class, derived from first class */ - cid2 = - H5Pcreate_class(cid1, CLASS2_NAME, test_genprop_cls_crt_cb1, &crt_cb_struct, test_genprop_cls_cpy_cb1, - &cpy_cb_struct, test_genprop_cls_cls_cb1, &cls_cb_struct); - CHECK_I(cid2, "H5Pcreate_class"); - - /* Insert fourth property into class (with no callbacks) */ - ret = - H5Pregister2(cid2, PROP4_NAME, PROP4_SIZE, PROP4_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Check the number of properties in class */ - /* (only reports the number of properties in 2nd class) */ - ret = H5Pget_nprops(cid2, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 1, "H5Pget_nprops"); - - /* Create a property list from the 2nd class */ - lid1 = H5Pcreate(cid2); - CHECK_I(lid1, "H5Pcreate"); - - /* Verify that both of the creation callbacks occurred */ - VERIFY(crt_cb_struct.count, 4, "H5Pcreate"); - VERIFY(crt_cb_struct.id, lid1, "H5Pcreate"); - - /* Check the number of properties in list */ - ret = H5Pget_nprops(lid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 4, "H5Pget_nprops"); - - /* Create another property list by copying existing list */ - lid2 = H5Pcopy(lid1); - CHECK_I(lid2, "H5Pcopy"); - - /* Verify that both of the copy callbacks occurred */ - VERIFY(cpy_cb_struct.count, 3, "H5Pcopy"); - VERIFY(cpy_cb_struct.id, lid2, "H5Pcopy"); - - /* Check the number of properties in list */ - ret = H5Pget_nprops(lid2, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 4, "H5Pget_nprops"); - - /* Close first list */ - ret = H5Pclose(lid1); - CHECK_I(ret, "H5Pclose"); - - /* Verify that both of the close callbacks occurred */ - VERIFY(cls_cb_struct.count, 5, "H5Pclose"); - VERIFY(cls_cb_struct.id, lid1, "H5Pclose"); - - /* Close second list */ - ret = H5Pclose(lid2); - CHECK_I(ret, "H5Pclose"); - - /* Verify that both of the close callbacks occurred */ - VERIFY(cls_cb_struct.count, 7, "H5Pclose"); - VERIFY(cls_cb_struct.id, lid2, "H5Pclose"); - - /* Close classes */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); - ret = H5Pclose_class(cid2); - CHECK_I(ret, "H5Pclose_class"); -} /* end test_genprop_class_callback() */ - -/**************************************************************** -** -** test_genprop_basic_list(): Test basic generic property list code. -** Tests creating new generic property lists. -** -****************************************************************/ -static void -test_genprop_basic_list(void) -{ - hid_t cid1; /* Generic Property class ID */ - hid_t cid2; /* Generic Property class ID */ - hid_t lid1; /* Generic Property list ID */ - size_t nprops; /* Number of properties */ - size_t size; /* Size of property */ - int prop1_value; /* Value for property #1 */ - float prop2_value; /* Value for property #2 */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Generic Property List Creation Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Add several properties (w/default values) */ - - /* Insert first property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert second property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 2, "H5Pget_nprops"); - - /* Create a property list from the class */ - lid1 = H5Pcreate(cid1); - CHECK_I(lid1, "H5Pcreate"); - - /* Get the list's class */ - cid2 = H5Pget_class(lid1); - CHECK_I(cid2, "H5Pget_class"); - - /* Check that the list's class is correct */ - ret = H5Pequal(cid1, cid2); - VERIFY(ret, 1, "H5Pequal"); - - /* Check correct "is a" class/list relationship */ - ret = H5Pisa_class(lid1, cid1); - VERIFY(ret, 1, "H5Pisa_class"); - - /* Check "is a" class/list relationship another way */ - ret = H5Pisa_class(lid1, cid2); - VERIFY(ret, 1, "H5Pisa_class"); - - /* Close class */ - ret = H5Pclose_class(cid2); - CHECK_I(ret, "H5Pclose_class"); - - /* Check the number of properties in list */ - ret = H5Pget_nprops(lid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 2, "H5Pget_nprops"); - - /* Check existence of properties */ - ret = H5Pexist(lid1, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - ret = H5Pexist(lid1, PROP2_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check the sizes of the properties */ - ret = H5Pget_size(lid1, PROP1_NAME, &size); - CHECK_I(ret, "H5Pget_size"); - VERIFY(size, PROP1_SIZE, "H5Pget_size"); - ret = H5Pget_size(lid1, PROP2_NAME, &size); - CHECK_I(ret, "H5Pget_size"); - VERIFY(size, PROP2_SIZE, "H5Pget_size"); - - /* Check values of properties (set with default values) */ - ret = H5Pget(lid1, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); - ret = H5Pget(lid1, PROP2_NAME, &prop2_value); - CHECK_I(ret, "H5Pget"); - /* Verify the floating-poing value in this way to avoid compiler warning. */ - if (!H5_FLT_ABS_EQUAL(prop2_value, *PROP2_DEF_VALUE)) - printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n", "H5Pget", - (double)*PROP2_DEF_VALUE, (double)prop2_value, (int)__LINE__, __FILE__); - - /* Close list */ - ret = H5Pclose(lid1); - CHECK_I(ret, "H5Pclose"); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); - -} /* end test_genprop_basic_list() */ - -/**************************************************************** -** -** test_genprop_basic_list_prop(): Test basic generic property list code. -** Tests creating new generic property lists and adding and -** removing properties from them. -** -****************************************************************/ -static void -test_genprop_basic_list_prop(void) -{ - hid_t cid1; /* Generic Property class ID */ - hid_t lid1; /* Generic Property list ID */ - size_t nprops; /* Number of properties */ - int prop1_value; /* Value for property #1 */ - float prop2_value; /* Value for property #2 */ - char prop3_value[10]; /* Property #3 value */ - double prop4_value; /* Property #4 value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Generic Property List Property Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Add several properties (several w/default values) */ - - /* Insert first property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert second property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Create a property list from the class */ - lid1 = H5Pcreate(cid1); - CHECK_I(lid1, "H5Pcreate"); - - /* Check the number of properties in list */ - ret = H5Pget_nprops(lid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 2, "H5Pget_nprops"); - - /* Add temporary properties */ - - /* Insert first temporary property into list (with no callbacks) */ - ret = H5Pinsert2(lid1, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Insert second temporary property into list (with no callbacks) */ - ret = H5Pinsert2(lid1, PROP4_NAME, PROP4_SIZE, PROP4_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Check the number of properties in list */ - ret = H5Pget_nprops(lid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 4, "H5Pget_nprops"); - - /* Check existence of all properties */ - ret = H5Pexist(lid1, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - ret = H5Pexist(lid1, PROP2_NAME); - VERIFY(ret, 1, "H5Pexist"); - ret = H5Pexist(lid1, PROP3_NAME); - VERIFY(ret, 1, "H5Pexist"); - ret = H5Pexist(lid1, PROP4_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check values of permanent properties (set with default values) */ - ret = H5Pget(lid1, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); - ret = H5Pget(lid1, PROP2_NAME, &prop2_value); - CHECK_I(ret, "H5Pget"); - /* Verify the floating-poing value in this way to avoid compiler warning. */ - if (!H5_FLT_ABS_EQUAL(prop2_value, *PROP2_DEF_VALUE)) - printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n", "H5Pget", - (double)*PROP2_DEF_VALUE, (double)prop2_value, (int)__LINE__, __FILE__); - - /* Check values of temporary properties (set with regular values) */ - ret = H5Pget(lid1, PROP3_NAME, &prop3_value); - CHECK_I(ret, "H5Pget"); - if (memcmp(&prop3_value, PROP3_DEF_VALUE, PROP3_SIZE) != 0) - TestErrPrintf("Property #3 doesn't match!, line=%d\n", __LINE__); - ret = H5Pget(lid1, PROP4_NAME, &prop4_value); - CHECK_I(ret, "H5Pget"); - /* Verify the floating-poing value in this way to avoid compiler warning. */ - if (!H5_DBL_ABS_EQUAL(prop4_value, *PROP4_DEF_VALUE)) - printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n", "H5Pget", - *PROP4_DEF_VALUE, prop4_value, (int)__LINE__, __FILE__); - - /* Delete permanent property */ - ret = H5Premove(lid1, PROP2_NAME); - CHECK_I(ret, "H5Premove"); - - /* Check number of properties */ - ret = H5Pget_nprops(lid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 3, "H5Pget_nprops"); - - /* Delete temporary property */ - ret = H5Premove(lid1, PROP3_NAME); - CHECK_I(ret, "H5Premove"); - - /* Check number of properties */ - ret = H5Pget_nprops(lid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 2, "H5Pget_nprops"); - - /* Check existence of remaining properties */ - ret = H5Pexist(lid1, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - ret = H5Pexist(lid1, PROP4_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check values of permanent properties (set with default values) */ - ret = H5Pget(lid1, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); - - /* Check values of temporary properties (set with regular values) */ - ret = H5Pget(lid1, PROP4_NAME, &prop4_value); - CHECK_I(ret, "H5Pget"); - /* Verify the floating-poing value in this way to avoid compiler warning. */ - if (!H5_DBL_ABS_EQUAL(prop4_value, *PROP4_DEF_VALUE)) - printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n", "H5Pget", - *PROP4_DEF_VALUE, prop4_value, (int)__LINE__, __FILE__); - - /* Close list */ - ret = H5Pclose(lid1); - CHECK_I(ret, "H5Pclose"); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); - -} /* end test_genprop_basic_list_prop() */ - -/**************************************************************** -** -** test_genprop_iter2(): Property iterator for test_genprop_list_iter -** -****************************************************************/ -static int -test_genprop_iter2(hid_t H5_ATTR_UNUSED id, const char *name, void *iter_data) -{ - iter_data_t *idata = (iter_data_t *)iter_data; - - return strcmp(name, idata->names[idata->iter_count++]); -} - -/**************************************************************** -** -** test_genprop_list_iter(): Test basic generic property list code. -** Tests iterating over generic property list properties. -** -****************************************************************/ -static void -test_genprop_list_iter(void) -{ - hid_t cid1; /* Generic Property class ID */ - hid_t lid1; /* Generic Property list ID */ - size_t nprops; /* Number of properties */ - int idx; /* Index to start iteration at */ - struct { /* Struct for iterations */ - int iter_count; - const char **names; - } iter_struct; - const char *pnames[4] = {/* Names of properties for iterator */ - PROP3_NAME, PROP4_NAME, PROP1_NAME, PROP2_NAME}; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Generic Property List Iteration Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Add several properties (several w/default values) */ - - /* Insert first property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert second property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Create a property list from the class */ - lid1 = H5Pcreate(cid1); - CHECK_I(lid1, "H5Pcreate"); - - /* Check the number of properties in list */ - ret = H5Pget_nprops(lid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 2, "H5Pget_nprops"); - - /* Add temporary properties */ - - /* Insert first temporary property into class (with no callbacks) */ - ret = H5Pinsert2(lid1, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Insert second temporary property into class (with no callbacks) */ - ret = H5Pinsert2(lid1, PROP4_NAME, PROP4_SIZE, PROP4_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Check the number of properties in list */ - ret = H5Pget_nprops(lid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 4, "H5Pget_nprops"); - - /* Iterate over all properties in list */ - iter_struct.iter_count = 0; - iter_struct.names = pnames; - ret = H5Piterate(lid1, NULL, test_genprop_iter2, &iter_struct); - VERIFY(ret, 0, "H5Piterate"); - - /* Iterate over last three properties in list */ - idx = iter_struct.iter_count = 1; - ret = H5Piterate(lid1, &idx, test_genprop_iter2, &iter_struct); - VERIFY(ret, 0, "H5Piterate"); - VERIFY(idx, (int)nprops, "H5Piterate"); - - /* Close list */ - ret = H5Pclose(lid1); - CHECK_I(ret, "H5Pclose"); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); - -} /* end test_genprop_list_iter() */ - -typedef struct { - /* Creation information */ - int crt_count; - char *crt_name; - void *crt_value; - - /* Set information */ - int set_count; - hid_t set_plist_id; - char *set_name; - void *set_value; - - /* Get information */ - int get_count; - hid_t get_plist_id; - char *get_name; - void *get_value; - - /* Delete information */ - int del_count; - hid_t del_plist_id; - char *del_name; - void *del_value; - - /* Copy information */ - int cop_count; - char *cop_name; - void *cop_value; - - /* Compare information */ - int cmp_count; - - /* Close information */ - int cls_count; - char *cls_name; - void *cls_value; -} prop_cb_info; - -/* Global variables for Callback information */ -prop_cb_info prop1_cb_info; /* Callback statistics for property #1 */ -prop_cb_info prop2_cb_info; /* Callback statistics for property #2 */ -prop_cb_info prop3_cb_info; /* Callback statistics for property #3 */ - -/**************************************************************** -** -** test_genprop_cls_cpy_cb2(): Property Class callback for test_genprop_list_callback -** -****************************************************************/ -static herr_t -test_genprop_cls_cpy_cb2(hid_t new_list_id, hid_t H5_ATTR_UNUSED old_list_id, void *create_data) -{ - count_data_t *cdata = (count_data_t *)create_data; - - cdata->count++; - cdata->id = new_list_id; - - return SUCCEED; -} - -/**************************************************************** -** -** test_genprop_prop_crt_cb1(): Property creation callback for test_genprop_list_callback -** -****************************************************************/ -static herr_t -test_genprop_prop_crt_cb1(const char *name, size_t size, void *def_value) -{ - /* Set the information from the creation call */ - prop1_cb_info.crt_count++; - prop1_cb_info.crt_name = strdup(name); - prop1_cb_info.crt_value = malloc(size); - memcpy(prop1_cb_info.crt_value, def_value, size); - - return (SUCCEED); -} - -/**************************************************************** -** -** test_genprop_prop_set_cb1(): Property set callback for test_genprop_list_callback -** -****************************************************************/ -static herr_t -test_genprop_prop_set_cb1(hid_t plist_id, const char *name, size_t size, void *value) -{ - /* Set the information from the set call */ - prop1_cb_info.set_count++; - prop1_cb_info.set_plist_id = plist_id; - if (prop1_cb_info.set_name == NULL) - prop1_cb_info.set_name = strdup(name); - if (prop1_cb_info.set_value == NULL) - prop1_cb_info.set_value = malloc(size); - memcpy(prop1_cb_info.set_value, value, size); - - return (SUCCEED); -} - -/**************************************************************** -** -** test_genprop_prop_get_cb1(): Property get callback for test_genprop_list_callback -** -****************************************************************/ -static herr_t -test_genprop_prop_get_cb1(hid_t plist_id, const char *name, size_t size, void *value) -{ - /* Set the information from the get call */ - prop1_cb_info.get_count++; - prop1_cb_info.get_plist_id = plist_id; - if (prop1_cb_info.get_name == NULL) - prop1_cb_info.get_name = strdup(name); - if (prop1_cb_info.get_value == NULL) - prop1_cb_info.get_value = malloc(size); - memcpy(prop1_cb_info.get_value, value, size); - - return (SUCCEED); -} - -/**************************************************************** -** -** test_genprop_prop_cop_cb1(): Property copy callback for test_genprop_list_callback -** -****************************************************************/ -static herr_t -test_genprop_prop_cop_cb1(const char *name, size_t size, void *value) -{ - /* Set the information from the get call */ - prop1_cb_info.cop_count++; - if (prop1_cb_info.cop_name == NULL) - prop1_cb_info.cop_name = strdup(name); - if (prop1_cb_info.cop_value == NULL) - prop1_cb_info.cop_value = malloc(size); - memcpy(prop1_cb_info.cop_value, value, size); - - return (SUCCEED); -} - -/**************************************************************** -** -** test_genprop_prop_cmp_cb1(): Property comparison callback for test_genprop_list_callback -** -****************************************************************/ -static int -test_genprop_prop_cmp_cb1(const void *value1, const void *value2, size_t size) -{ - /* Set the information from the comparison call */ - prop1_cb_info.cmp_count++; - - return (memcmp(value1, value2, size)); -} - -/**************************************************************** -** -** test_genprop_prop_cmp_cb3(): Property comparison callback for test_genprop_list_callback -** -****************************************************************/ -static int -test_genprop_prop_cmp_cb3(const void *value1, const void *value2, size_t size) -{ - /* Set the information from the comparison call */ - prop3_cb_info.cmp_count++; - - return (memcmp(value1, value2, size)); -} - -/**************************************************************** -** -** test_genprop_prop_cls_cb1(): Property close callback for test_genprop_list_callback -** -****************************************************************/ -static herr_t -test_genprop_prop_cls_cb1(const char *name, size_t size, void *value) -{ - /* Set the information from the close call */ - prop1_cb_info.cls_count++; - if (prop1_cb_info.cls_name == NULL) - prop1_cb_info.cls_name = strdup(name); - if (prop1_cb_info.cls_value == NULL) - prop1_cb_info.cls_value = malloc(size); - memcpy(prop1_cb_info.cls_value, value, size); - - return (SUCCEED); -} - -/**************************************************************** -** -** test_genprop_prop_del_cb2(): Property delete callback for test_genprop_list_callback -** -****************************************************************/ -static herr_t -test_genprop_prop_del_cb2(hid_t plist_id, const char *name, size_t size, void *value) -{ - /* Set the information from the delete call */ - prop2_cb_info.del_count++; - prop2_cb_info.del_plist_id = plist_id; - prop2_cb_info.del_name = strdup(name); - prop2_cb_info.del_value = malloc(size); - memcpy(prop2_cb_info.del_value, value, size); - - return (SUCCEED); -} - -/**************************************************************** -** -** test_genprop_list_callback(): Test basic generic property list code. -** Tests callbacks for properties in a generic property list. -** -****************************************************************/ -static void -test_genprop_list_callback(void) -{ - hid_t cid1; /* Generic Property class ID */ - hid_t lid1; /* Generic Property list ID */ - hid_t lid2; /* 2nd Generic Property list ID */ - size_t nprops; /* Number of properties in class */ - int prop1_value; /* Value for property #1 */ - int prop1_new_value = 20; /* Property #1 new value */ - float prop2_value; /* Value for property #2 */ - char prop3_value[10]; /* Property #3 value */ - char prop3_new_value[10] = "10 chairs"; /* Property #3 new value */ - double prop4_value; /* Property #4 value */ - struct { /* Struct for callbacks */ - int count; - hid_t id; - } cop_cb_struct; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Generic Property List Property Callback Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, test_genprop_cls_cpy_cb2, &cop_cb_struct, NULL, - NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Insert first property into class (with callbacks) */ - ret = H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, test_genprop_prop_crt_cb1, - test_genprop_prop_set_cb1, test_genprop_prop_get_cb1, NULL, test_genprop_prop_cop_cb1, - test_genprop_prop_cmp_cb1, test_genprop_prop_cls_cb1); - CHECK_I(ret, "H5Pregister2"); - - /* Insert second property into class (with only delete callback) */ - ret = H5Pregister2(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, - test_genprop_prop_del_cb2, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert third property into class (with only compare callback) */ - ret = H5Pregister2(cid1, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, - test_genprop_prop_cmp_cb3, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert fourth property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP4_NAME, PROP4_SIZE, PROP4_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 4, "H5Pget_nprops"); - - /* Initialize class callback structs */ - cop_cb_struct.count = 0; - cop_cb_struct.id = (-1); - - /* Initialize callback information for properties tracked */ - memset(&prop1_cb_info, 0, sizeof(prop_cb_info)); - memset(&prop2_cb_info, 0, sizeof(prop_cb_info)); - memset(&prop3_cb_info, 0, sizeof(prop_cb_info)); - - /* Create a property list from the class */ - lid1 = H5Pcreate(cid1); - CHECK_I(lid1, "H5Pcreate"); - - /* The compare callback should not have been called once on property 1, as - * the property is always copied */ - VERIFY(prop1_cb_info.cmp_count, 0, "H5Pcreate"); - /* The compare callback should not have been called on property 3, as there - * is no create callback */ - VERIFY(prop3_cb_info.cmp_count, 0, "H5Pcreate"); - - /* Verify creation callback information for properties tracked */ - VERIFY(prop1_cb_info.crt_count, 1, "H5Pcreate"); - if (strcmp(prop1_cb_info.crt_name, PROP1_NAME) != 0) - TestErrPrintf("Property #1 name doesn't match!, line=%d\n", __LINE__); - if (memcmp(prop1_cb_info.crt_value, PROP1_DEF_VALUE, PROP1_SIZE) != 0) - TestErrPrintf("Property #1 value doesn't match!, line=%d\n", __LINE__); - - /* Check values of permanent properties (set with default values) */ - ret = H5Pget(lid1, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); - /* The compare callback should not have been called */ - VERIFY(prop1_cb_info.cmp_count, 0, "H5Pget"); - ret = H5Pget(lid1, PROP2_NAME, &prop2_value); - CHECK_I(ret, "H5Pget"); - /* Verify the floating-poing value in this way to avoid compiler warning. */ - if (!H5_FLT_ABS_EQUAL(prop2_value, *PROP2_DEF_VALUE)) - printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n", "H5Pget", - (double)*PROP2_DEF_VALUE, (double)prop2_value, (int)__LINE__, __FILE__); - - /* Check values of temporary properties (set with regular values) */ - ret = H5Pget(lid1, PROP3_NAME, &prop3_value); - CHECK_I(ret, "H5Pget"); - if (memcmp(&prop3_value, PROP3_DEF_VALUE, PROP3_SIZE) != 0) - TestErrPrintf("Property #3 doesn't match!, line=%d\n", __LINE__); - /* The compare callback should not have been called, as there is no get - * callback for this property */ - VERIFY(prop3_cb_info.cmp_count, 0, "H5Pget"); - ret = H5Pget(lid1, PROP4_NAME, &prop4_value); - CHECK_I(ret, "H5Pget"); - /* Verify the floating-poing value in this way to avoid compiler warning. */ - if (!H5_DBL_ABS_EQUAL(prop4_value, *PROP4_DEF_VALUE)) - printf("*** UNEXPECTED VALUE from %s should be %f, but is %f at line %4d in %s\n", "H5Pget", - *PROP4_DEF_VALUE, prop4_value, (int)__LINE__, __FILE__); - - /* Verify get callback information for properties tracked */ - VERIFY(prop1_cb_info.get_count, 1, "H5Pget"); - VERIFY(prop1_cb_info.get_plist_id, lid1, "H5Pget"); - if (strcmp(prop1_cb_info.get_name, PROP1_NAME) != 0) - TestErrPrintf("Property #1 name doesn't match!, line=%d\n", __LINE__); - if (memcmp(prop1_cb_info.get_value, PROP1_DEF_VALUE, PROP1_SIZE) != 0) - TestErrPrintf("Property #1 value doesn't match!, line=%d\n", __LINE__); - - /* Set value of property #1 to different value */ - ret = H5Pset(lid1, PROP1_NAME, &prop1_new_value); - CHECK_I(ret, "H5Pset"); - - /* Verify set callback information for properties tracked */ - VERIFY(prop1_cb_info.set_count, 1, "H5Pset"); - VERIFY(prop1_cb_info.set_plist_id, lid1, "H5Pset"); - if (strcmp(prop1_cb_info.set_name, PROP1_NAME) != 0) - TestErrPrintf("Property #1 name doesn't match!, line=%d\n", __LINE__); - if (memcmp(prop1_cb_info.set_value, &prop1_new_value, PROP1_SIZE) != 0) - TestErrPrintf("Property #1 value doesn't match!, line=%d\n", __LINE__); - - /* The compare callback should not have been called */ - VERIFY(prop1_cb_info.cmp_count, 0, "H5Pset"); - - /* Set value of property #3 to different value */ - ret = H5Pset(lid1, PROP3_NAME, prop3_new_value); - CHECK_I(ret, "H5Pset"); - - /* The compare callback should not have been called */ - VERIFY(prop3_cb_info.cmp_count, 0, "H5Pset"); - - /* Check new value of tracked properties */ - ret = H5Pget(lid1, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, prop1_new_value, "H5Pget"); - - /* Verify get callback information again for properties tracked */ - VERIFY(prop1_cb_info.get_count, 2, "H5Pget"); - VERIFY(prop1_cb_info.get_plist_id, lid1, "H5Pget"); - if (strcmp(prop1_cb_info.get_name, PROP1_NAME) != 0) - TestErrPrintf("Property #1 name doesn't match!, line=%d\n", __LINE__); - if (memcmp(prop1_cb_info.get_value, &prop1_new_value, PROP1_SIZE) != 0) - TestErrPrintf("Property #1 value doesn't match!, line=%d\n", __LINE__); - - /* Delete property #2 */ - ret = H5Premove(lid1, PROP2_NAME); - CHECK_I(ret, "H5Premove"); - - /* Verify delete callback information for properties tracked */ - VERIFY(prop2_cb_info.del_count, 1, "H5Premove"); - VERIFY(prop2_cb_info.del_plist_id, lid1, "H5Premove"); - if (strcmp(prop2_cb_info.del_name, PROP2_NAME) != 0) - TestErrPrintf("Property #2 name doesn't match!, line=%d\n", __LINE__); - if (memcmp(prop2_cb_info.del_value, PROP2_DEF_VALUE, PROP2_SIZE) != 0) - TestErrPrintf("Property #2 value doesn't match!, line=%d\n", __LINE__); - - /* Copy first list */ - lid2 = H5Pcopy(lid1); - CHECK_I(lid2, "H5Pcopy"); - - /* Verify copy callback information for properties tracked */ - VERIFY(prop1_cb_info.cop_count, 1, "H5Pcopy"); - if (strcmp(prop1_cb_info.cop_name, PROP1_NAME) != 0) - TestErrPrintf("Property #1 name doesn't match!, line=%d\n", __LINE__); - if (memcmp(prop1_cb_info.cop_value, &prop1_new_value, PROP1_SIZE) != 0) - TestErrPrintf("Property #1 value doesn't match!, line=%d\n", __LINE__); - - /* Verify that the class creation callback occurred */ - VERIFY(cop_cb_struct.count, 1, "H5Pcopy"); - VERIFY(cop_cb_struct.id, lid2, "H5Pcopy"); - - /* Compare the two lists */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 1, "H5Pequal"); - - /* Verify compare callback information for properties tracked */ - VERIFY(prop1_cb_info.cmp_count, 1, "H5Pequal"); - VERIFY(prop3_cb_info.cmp_count, 1, "H5Pequal"); - - /* Close first list */ - ret = H5Pclose(lid1); - CHECK_I(ret, "H5Pclose"); - - /* Verify close callback information for properties tracked */ - VERIFY(prop1_cb_info.cls_count, 1, "H5Pclose"); - if (strcmp(prop1_cb_info.cls_name, PROP1_NAME) != 0) - TestErrPrintf("Property #1 name doesn't match!, line=%d\n", __LINE__); - if (memcmp(prop1_cb_info.cls_value, &prop1_new_value, PROP1_SIZE) != 0) - TestErrPrintf("Property #1 value doesn't match!, line=%d\n", __LINE__); - - /* Close second list */ - ret = H5Pclose(lid2); - CHECK_I(ret, "H5Pclose"); - - /* Verify close callback information for properties tracked */ - VERIFY(prop1_cb_info.cls_count, 2, "H5Pclose"); - - /* Free memory allocated for tracking properties */ - free(prop1_cb_info.crt_name); - free(prop1_cb_info.crt_value); - free(prop1_cb_info.get_name); - free(prop1_cb_info.get_value); - free(prop1_cb_info.set_name); - free(prop1_cb_info.set_value); - free(prop1_cb_info.cop_name); - free(prop1_cb_info.cop_value); - free(prop1_cb_info.cls_name); - free(prop1_cb_info.cls_value); - free(prop2_cb_info.del_name); - free(prop2_cb_info.del_value); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); -} /* end test_genprop_list_callback() */ - -/**************************************************************** -** -** test_genprop_list_addprop(): Test adding properties to a -** standard HDF5 property list and verify that the library -** ignores the extra properties. -** -****************************************************************/ -static void -test_genprop_list_addprop(void) -{ - hid_t fid; /* File ID */ - hid_t did; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t pid; /* Property List ID */ - int prop1_value; /* Value for property #1 */ - herr_t ret; /* Generic return value */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create scalar dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a dataset creation property list */ - pid = H5Pcreate(H5P_DATASET_CREATE); - CHECK(pid, FAIL, "H5Pcreate"); - - /* Insert temporary property into class (with no callbacks) */ - ret = H5Pinsert2(pid, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Check existence of added property */ - ret = H5Pexist(pid, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check values of property (set with default value) */ - ret = H5Pget(pid, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); - - /* Create a dataset */ - did = H5Dcreate2(fid, "Dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check existence of added property (after using property list) */ - ret = H5Pexist(pid, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check values of property (set with default value) (after using property list) */ - ret = H5Pget(pid, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); - - /* Close property list */ - ret = H5Pclose(pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_genprop_list_addprop() */ - -/**************************************************************** -** -** test_genprop_class_addprop(): Test adding properties to a -** standard HDF5 property class and verify that the library -** ignores the extra properties and continues to recognize the -** derived class as a valid version of the derived-from class. -** -****************************************************************/ -static void -test_genprop_class_addprop(void) -{ - hid_t fid; /* File ID */ - hid_t did; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t cid; /* Property Class ID */ - hid_t pid; /* Property List ID */ - int prop1_value; /* Value for property #1 */ - herr_t ret; /* Generic return value */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create scalar dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a new class, derived from the dataset creation property list class */ - cid = H5Pcreate_class(H5P_DATASET_CREATE, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid, "H5Pcreate_class"); -#if 0 - /* Check existence of an original property */ - ret = H5Pexist(cid, H5O_CRT_PIPELINE_NAME); - VERIFY(ret, 1, "H5Pexist"); -#endif - /* Insert first property into class (with no callbacks) */ - ret = - H5Pregister2(cid, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); -#if 0 - /* Check existence of an original property */ - ret = H5Pexist(cid, H5O_CRT_PIPELINE_NAME); - VERIFY(ret, 1, "H5Pexist"); -#endif - /* Check existence of added property */ - ret = H5Pexist(cid, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Create a derived dataset creation property list */ - pid = H5Pcreate(cid); - CHECK(pid, FAIL, "H5Pcreate"); -#if 0 - /* Check existence of an original property */ - ret = H5Pexist(pid, H5O_CRT_PIPELINE_NAME); - VERIFY(ret, 1, "H5Pexist"); -#endif - /* Check existence of added property */ - ret = H5Pexist(pid, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check values of property (set with default value) */ - ret = H5Pget(pid, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); - - /* Insert second property into class (with no callbacks) */ - ret = - H5Pregister2(cid, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); -#if 0 - /* Check existence of an original property (in class) */ - ret = H5Pexist(cid, H5O_CRT_PIPELINE_NAME); - VERIFY(ret, 1, "H5Pexist"); -#endif - /* Check existence of first added property (in class) */ - ret = H5Pexist(cid, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check existence of second added property (in class) */ - ret = H5Pexist(cid, PROP2_NAME); - VERIFY(ret, 1, "H5Pexist"); -#if 0 - /* Check existence of an original property (in property list) */ - ret = H5Pexist(pid, H5O_CRT_PIPELINE_NAME); - VERIFY(ret, 1, "H5Pexist"); -#endif - /* Check existence of first added property (in property list) */ - ret = H5Pexist(pid, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check existence of second added property (in property list) (should not exist) */ - ret = H5Pexist(pid, PROP2_NAME); - VERIFY(ret, 0, "H5Pexist"); - - /* Create a dataset */ - did = H5Dcreate2(fid, "Dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check existence of added property (after using property list) */ - ret = H5Pexist(pid, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check values of property (set with default value) (after using property list) */ - ret = H5Pget(pid, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); - - /* Close property class */ - ret = H5Pclose_class(cid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close property list */ - ret = H5Pclose(pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_genprop_class_addprop() */ - -/**************************************************************** -** -** test_genprop_list_add_remove_prop(): Test adding then removing the -** same properties to a standard HDF5 property list. This is testing -** also for a memory leak that could be caused by not freeing the -** removed property resources from the property list. -** -****************************************************************/ -static void -test_genprop_list_add_remove_prop(void) -{ - hid_t pid; /* Property List ID */ - herr_t ret; /* Generic return value */ - - /* Create a dataset creation property list */ - pid = H5Pcreate(H5P_DATASET_CREATE); - CHECK(pid, FAIL, "H5Pcreate"); - - /* Insert temporary property into class (with no callbacks) */ - ret = H5Pinsert2(pid, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Delete added property */ - ret = H5Premove(pid, PROP1_NAME); - CHECK_I(ret, "H5Premove"); - - /* Insert temporary property into class (with no callbacks) */ - ret = H5Pinsert2(pid, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Delete added property */ - ret = H5Premove(pid, PROP1_NAME); - CHECK_I(ret, "H5Premove"); - - /* Close property list */ - ret = H5Pclose(pid); - CHECK(ret, FAIL, "H5Pclose"); - -} /* end test_genprop_list_add_remove_prop() */ - -/**************************************************************** -** -** test_genprop_equal(): Test basic generic property list code. -** More tests for H5Pequal() -** -****************************************************************/ -static void -test_genprop_equal(void) -{ - hid_t cid1; /* Generic Property class ID */ - hid_t lid1; /* Generic Property list ID */ - hid_t lid2; /* Generic Property list ID */ - int prop1_new_value = 20; /* Property #1 new value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Generic Property List Equal Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Insert first property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Insert second property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Create a property list from the class */ - lid1 = H5Pcreate(cid1); - CHECK_I(lid1, "H5Pcreate"); - - /* Copy the property list */ - lid2 = H5Pcopy(lid1); - CHECK_I(lid2, "H5Pcopy"); - - /* Check that the lists are equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 1, "H5Pequal"); - - /* Set property in first list to another value */ - ret = H5Pset(lid1, PROP1_NAME, &prop1_new_value); - CHECK_I(ret, "H5Pset"); - - /* Check that the lists are not equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 0, "H5Pequal"); - - /* Set property in first list back to default */ - ret = H5Pset(lid1, PROP1_NAME, PROP1_DEF_VALUE); - CHECK_I(ret, "H5Pset"); - - /* Check that the lists are still equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 1, "H5Pequal"); - - /* Insert first temporary property into first list (with no callbacks) */ - ret = H5Pinsert2(lid1, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Check that the lists are not equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 0, "H5Pequal"); - - /* Insert first temporary property into second list (with no callbacks) */ - ret = H5Pinsert2(lid2, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Check that the lists are equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 1, "H5Pequal"); - - /* Insert second temporary property into second list (with no callbacks) */ - ret = H5Pinsert2(lid2, PROP4_NAME, PROP4_SIZE, PROP4_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Check that the lists are not equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 0, "H5Pequal"); - - /* Insert second temporary property into first list (with no callbacks) */ - ret = H5Pinsert2(lid1, PROP4_NAME, PROP4_SIZE, PROP4_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert2"); - - /* Check that the lists are equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 1, "H5Pequal"); - - /* Remove first temporary property from first list */ - ret = H5Premove(lid1, PROP3_NAME); - CHECK_I(ret, "H5Premove"); - - /* Check that the lists are not equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 0, "H5Pequal"); - - /* Remove second temporary property from second list */ - ret = H5Premove(lid2, PROP4_NAME); - CHECK_I(ret, "H5Premove"); - - /* Check that the lists are not equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 0, "H5Pequal"); - - /* Remove first temporary property from second list */ - ret = H5Premove(lid2, PROP3_NAME); - CHECK_I(ret, "H5Premove"); - - /* Check that the lists are not equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 0, "H5Pequal"); - - /* Remove first permanent property from first list */ - ret = H5Premove(lid1, PROP1_NAME); - CHECK_I(ret, "H5Premove"); - - /* Check that the lists are not equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 0, "H5Pequal"); - - /* Remove second temporary property from first list */ - ret = H5Premove(lid1, PROP4_NAME); - CHECK_I(ret, "H5Premove"); - - /* Check that the lists are not equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 0, "H5Pequal"); - - /* Remove first permanent property from second list */ - ret = H5Premove(lid2, PROP1_NAME); - CHECK_I(ret, "H5Premove"); - - /* Check that the lists are equal */ - ret = H5Pequal(lid1, lid2); - VERIFY(ret, 1, "H5Pequal"); - - /* Close property lists */ - ret = H5Pclose(lid1); - CHECK_I(ret, "H5Pclose"); - ret = H5Pclose(lid2); - CHECK_I(ret, "H5Pclose"); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); -} /* ent test_genprop_equal() */ - -/**************************************************************** -** -** test_genprop_path(): Test basic generic property list code. -** Tests for class paths -** -****************************************************************/ -static void -test_genprop_path(void) -{ - hid_t cid1; /* Generic Property class ID */ - hid_t cid2; /* Generic Property class ID */ -#if 0 - hid_t cid3; /* Generic Property class ID */ - char *path; /* Class path */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Generic Property List Class Path Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Insert first property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); -#if 0 - /* Get full path for first class */ - path = H5P__get_class_path_test(cid1); - CHECK_PTR(path, "H5P__get_class_path_test"); - if (strcmp(path, CLASS1_PATH) != 0) - TestErrPrintf("Class names don't match!, path=%s, CLASS1_PATH=%s\n", path, CLASS1_PATH); - H5free_memory(path); -#endif - /* Create another new generic class, derived from first class */ - cid2 = H5Pcreate_class(cid1, CLASS2_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid2, "H5Pcreate_class"); - - /* Insert second property into class (with no callbacks) */ - ret = - H5Pregister2(cid2, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); -#if 0 - /* Get full path for second class */ - path = H5P__get_class_path_test(cid2); - CHECK_PTR(path, "H5P__get_class_path_test"); - if (strcmp(path, CLASS2_PATH) != 0) - TestErrPrintf("Class names don't match!, path=%s, CLASS2_PATH=%s\n", path, CLASS2_PATH); - - /* Open a copy of the class with the path name */ - cid3 = H5P__open_class_path_test(path); - CHECK_I(cid3, "H5P__open_class_path_test"); - - /* Check that the classes are equal */ - ret = H5Pequal(cid2, cid3); - VERIFY(ret, 1, "H5Pequal"); - - /* Release the path string */ - H5free_memory(path); - - /* Close class */ - ret = H5Pclose_class(cid3); - CHECK_I(ret, "H5Pclose_class"); -#endif - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); - - /* Close class */ - ret = H5Pclose_class(cid2); - CHECK_I(ret, "H5Pclose_class"); - -} /* ent test_genprop_path() */ - -/**************************************************************** -** -** test_genprop_refcount(): Test basic generic property list code. -** Tests for correct reference counting -** -****************************************************************/ -static void -test_genprop_refcount(void) -{ - hid_t cid1; /* Generic Property class ID */ - hid_t lid1; /* Generic Property class ID */ - char *name; /* Name of class */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Generic Property List Reference Count Functionality\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Insert first property into class (with no callbacks) */ - ret = - H5Pregister2(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister2"); - - /* Create a new generic list, derived from the root of the class hierarchy */ - lid1 = H5Pcreate(cid1); - CHECK_I(lid1, "H5Pcreate"); - - /* Check class name */ - name = H5Pget_class_name(cid1); - CHECK_PTR(name, "H5Pget_class_name"); - if (strcmp(name, CLASS1_NAME) != 0) - TestErrPrintf("Class names don't match!, name=%s, CLASS1_NAME=%s\n", name, CLASS1_NAME); - H5free_memory(name); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); - - /* Get the list's class */ - cid1 = H5Pget_class(lid1); - CHECK_I(cid1, "H5Pget_class"); - - /* Check correct "is a" class/list relationship */ - ret = H5Pisa_class(lid1, cid1); - VERIFY(ret, 1, "H5Pisa_class"); - - /* Check class name */ - name = H5Pget_class_name(cid1); - CHECK_PTR(name, "H5Pget_class_name"); - if (strcmp(name, CLASS1_NAME) != 0) - TestErrPrintf("Class names don't match!, name=%s, CLASS1_NAME=%s\n", name, CLASS1_NAME); - H5free_memory(name); - - /* Close list */ - ret = H5Pclose(lid1); - CHECK_I(ret, "H5Pclose"); - - /* Check class name */ - name = H5Pget_class_name(cid1); - CHECK_PTR(name, "H5Pget_class_name"); - if (strcmp(name, CLASS1_NAME) != 0) - TestErrPrintf("Class names don't match!, name=%s, CLASS1_NAME=%s\n", name, CLASS1_NAME); - H5free_memory(name); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); - -} /* ent test_genprop_refcount() */ - -#ifndef H5_NO_DEPRECATED_SYMBOLS -/**************************************************************** -** -** test_genprop_deprec_class(): Test basic generic property list code. -** Tests deprecated property class API routines. -** -****************************************************************/ -static void -test_genprop_deprec_class(void) -{ - hid_t cid1; /* Generic Property class ID */ - size_t size; /* Size of property */ - size_t nprops; /* Number of properties in class */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deprecated Generic Property List Functions\n")); - - /* Create a new generic class, derived from the root of the class hierarchy */ - cid1 = H5Pcreate_class(H5P_ROOT, CLASS1_NAME, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(cid1, "H5Pcreate_class"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 0, "H5Pget_nprops"); - - /* Check the existence of the first property (should fail) */ - ret = H5Pexist(cid1, PROP1_NAME); - VERIFY(ret, 0, "H5Pexist"); - - /* Insert first property into class (with no callbacks) */ - ret = H5Pregister1(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister1"); - - /* Try to insert the first property again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Pregister1(cid1, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pregister1"); - - /* Check the existence of the first property */ - ret = H5Pexist(cid1, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check the size of the first property */ - ret = H5Pget_size(cid1, PROP1_NAME, &size); - CHECK_I(ret, "H5Pget_size"); - VERIFY(size, PROP1_SIZE, "H5Pget_size"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 1, "H5Pget_nprops"); - - /* Insert second property into class (with no callbacks) */ - ret = H5Pregister1(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister1"); - - /* Try to insert the second property again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Pregister1(cid1, PROP2_NAME, PROP2_SIZE, PROP2_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pregister1"); - - /* Check the existence of the second property */ - ret = H5Pexist(cid1, PROP2_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check the size of the second property */ - ret = H5Pget_size(cid1, PROP2_NAME, &size); - CHECK_I(ret, "H5Pget_size"); - VERIFY(size, PROP2_SIZE, "H5Pget_size"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 2, "H5Pget_nprops"); - - /* Insert third property into class (with no callbacks) */ - ret = H5Pregister1(cid1, PROP3_NAME, PROP3_SIZE, PROP3_DEF_VALUE, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pregister1"); - - /* Check the existence of the third property */ - ret = H5Pexist(cid1, PROP3_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check the size of the third property */ - ret = H5Pget_size(cid1, PROP3_NAME, &size); - CHECK_I(ret, "H5Pget_size"); - VERIFY(size, PROP3_SIZE, "H5Pget_size"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 3, "H5Pget_nprops"); - - /* Unregister first property */ - ret = H5Punregister(cid1, PROP1_NAME); - CHECK_I(ret, "H5Punregister"); - - /* Try to check the size of the first property (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Pget_size(cid1, PROP1_NAME, &size); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pget_size"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 2, "H5Pget_nprops"); - - /* Unregister second property */ - ret = H5Punregister(cid1, PROP2_NAME); - CHECK_I(ret, "H5Punregister"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 1, "H5Pget_nprops"); - - /* Unregister third property */ - ret = H5Punregister(cid1, PROP3_NAME); - CHECK_I(ret, "H5Punregister"); - - /* Check the number of properties in class */ - ret = H5Pget_nprops(cid1, &nprops); - CHECK_I(ret, "H5Pget_nprops"); - VERIFY(nprops, 0, "H5Pget_nprops"); - - /* Close class */ - ret = H5Pclose_class(cid1); - CHECK_I(ret, "H5Pclose_class"); -} /* end test_genprop_deprec_class() */ - -/**************************************************************** -** -** test_genprop_deprec2(): Test basic generic property list code. -** Tests deprecated property list API routines. -** -****************************************************************/ -static void -test_genprop_deprec_list(void) -{ - hid_t fid; /* File ID */ - hid_t did; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t pid; /* Property List ID */ - int prop1_value; /* Value for property #1 */ - herr_t ret; /* Generic return value */ - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create scalar dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a dataset creation property list */ - pid = H5Pcreate(H5P_DATASET_CREATE); - CHECK(pid, FAIL, "H5Pcreate"); - - /* Insert temporary property into class (with no callbacks) */ - ret = H5Pinsert1(pid, PROP1_NAME, PROP1_SIZE, PROP1_DEF_VALUE, NULL, NULL, NULL, NULL, NULL); - CHECK_I(ret, "H5Pinsert1"); - - /* Check existence of added property */ - ret = H5Pexist(pid, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check values of property (set with default value) */ - ret = H5Pget(pid, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); - - /* Create a dataset */ - did = H5Dcreate2(fid, "Dataset1", H5T_NATIVE_INT, sid, H5P_DEFAULT, pid, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check existence of added property (after using property list) */ - ret = H5Pexist(pid, PROP1_NAME); - VERIFY(ret, 1, "H5Pexist"); - - /* Check values of property (set with default value) (after using property list) */ - ret = H5Pget(pid, PROP1_NAME, &prop1_value); - CHECK_I(ret, "H5Pget"); - VERIFY(prop1_value, *PROP1_DEF_VALUE, "H5Pget"); - - /* Close property list */ - ret = H5Pclose(pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_genprop_deprec_list() */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - -/**************************************************************** -** -** test_genprop(): Main generic property testing routine. -** -****************************************************************/ -void -test_genprop(void) -{ - /* Output message about test being performed */ - MESSAGE(5, ("Testing Generic Properties\n")); - - /* These tests use the same file... */ - test_genprop_basic_class(); /* Test basic code for creating a generic class */ - test_genprop_basic_class_prop(); /* Test basic code for adding properties to a generic class */ - test_genprop_class_iter(); /* Test code for iterating over properties in a generic class */ - test_genprop_class_callback(); /* Test code for property class callbacks */ - - test_genprop_basic_list(); /* Test basic code for creating a generic property list */ - test_genprop_basic_list_prop(); /* Test basic code for adding properties to a generic property list */ - test_genprop_list_iter(); /* Test basic code for iterating over properties in a generic property list */ - test_genprop_list_callback(); /* Test code for property list callbacks */ - - test_genprop_list_addprop(); /* Test adding properties to HDF5 property list */ - test_genprop_class_addprop(); /* Test adding properties to HDF5 property class */ - - test_genprop_list_add_remove_prop(); /* Test adding and removing the same property several times to HDF5 - property list */ - - test_genprop_equal(); /* Tests for more H5Pequal verification */ - test_genprop_path(); /* Tests for class path verification */ - test_genprop_refcount(); /* Tests for class reference counting */ - -#ifndef H5_NO_DEPRECATED_SYMBOLS - test_genprop_deprec_class(); /* Tests for deprecated routines */ - test_genprop_deprec_list(); /* Tests for deprecated routines */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - -} /* test_genprop() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_genprop - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_genprop(void) -{ - H5Fdelete(FILENAME, H5P_DEFAULT); -} diff --git a/test/API/th5o.c b/test/API/th5o.c deleted file mode 100644 index 8a052ee..0000000 --- a/test/API/th5o.c +++ /dev/null @@ -1,1886 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: th5o - * - * Test public H5O functions for accessing - * - *************************************************************/ - -#include "testhdf5.h" - -#if 0 -#include "H5Fprivate.h" -#include "H5VLprivate.h" -#include "H5VLnative_private.h" -#endif - -#define TEST_FILENAME "th5o_file.h5" - -#define RANK 2 -#define DIM0 5 -#define DIM1 10 - -#define TEST6_DIM1 100 -#define TEST6_DIM2 100 - -/**************************************************************** -** -** test_h5o_open(): Test H5Oopen function. -** -****************************************************************/ -static void -test_h5o_open(void) -{ - hid_t fid; /* HDF5 File ID */ - hid_t grp, dset, dtype, dspace; /* Object identifiers */ - char filename[1024]; - hsize_t dims[RANK]; - H5I_type_t id_type; /* Type of IDs returned from H5Oopen */ - H5G_info_t ginfo; /* Group info struct */ - H5T_class_t type_class; /* Class of the datatype */ - herr_t ret; /* Value returned from API calls */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing H5Oopen\n")); - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Create a new HDF5 file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a group, dataset, and committed datatype within the file */ - /* Create the group */ - grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gcreate2"); - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - - /* Commit the type inside the group */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create the data space for the dataset. */ - dims[0] = DIM0; - dims[1] = DIM1; - dspace = H5Screate_simple(RANK, dims, NULL); - CHECK(dspace, FAIL, "H5Screate_simple"); - - /* Create the dataset. */ - dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Now make sure that H5Oopen can open all three types of objects */ - grp = H5Oopen(fid, "group", H5P_DEFAULT); - CHECK(grp, FAIL, "H5Oopen"); - dtype = H5Oopen(fid, "group/datatype", H5P_DEFAULT); - CHECK(dtype, FAIL, "H5Oopen"); - /* Check that we can use the group as a valid location */ - dset = H5Oopen(grp, "/dataset", H5P_DEFAULT); - CHECK(dset, FAIL, "H5Oopen"); - - /* Make sure that each is the right kind of ID */ - id_type = H5Iget_type(grp); - VERIFY(id_type, H5I_GROUP, "H5Iget_type for group ID"); - id_type = H5Iget_type(dtype); - VERIFY(id_type, H5I_DATATYPE, "H5Iget_type for datatype ID"); - id_type = H5Iget_type(dset); - VERIFY(id_type, H5I_DATASET, "H5Iget_type for dataset ID"); - - /* Do something more complex with each of the IDs to make sure they "work" */ - ret = H5Gget_info(grp, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - VERIFY(ginfo.nlinks, 1, "H5Gget_info"); /* There should be one object, the datatype */ - - type_class = H5Tget_class(dtype); - VERIFY(type_class, H5T_INTEGER, "H5Tget_class"); - - dspace = H5Dget_space(dset); - CHECK(dspace, FAIL, "H5Dget_space"); - - /* Close the IDs */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Trying to open objects with bogus names should fail gracefully */ - H5E_BEGIN_TRY - { - grp = H5Oopen(fid, "bogus_group", H5P_DEFAULT); - VERIFY(grp, FAIL, "H5Oopen"); - dtype = H5Oopen(fid, "group/bogus_datatype", H5P_DEFAULT); - VERIFY(dtype, FAIL, "H5Oopen"); - dset = H5Oopen(fid, "/bogus_dataset", H5P_DEFAULT); - VERIFY(dset, FAIL, "H5Oopen"); - } - H5E_END_TRY - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Trying to open an object with a bogus file ID should fail */ - H5E_BEGIN_TRY - { - dset = H5Oopen(fid, "dataset", H5P_DEFAULT); - VERIFY(dset, FAIL, "H5Oopen"); - } - H5E_END_TRY -} /* test_h5o_open() */ - -/**************************************************************** -** -** test_h5o_close(): Test H5Oclose function. -** -****************************************************************/ -static void -test_h5o_close(void) -{ - hid_t fid; /* HDF5 File ID */ - hid_t grp, dset, dtype, dspace; /* Object identifiers */ - char filename[1024]; - hsize_t dims[RANK]; - herr_t ret; /* Value returned from API calls */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing H5Oclose\n")); - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Create a new HDF5 file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a group, dataset, and committed datatype within the file */ - /* Create the group and close it with H5Oclose */ - grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gcreate2"); - VERIFY_TYPE(H5Iget_type(grp), H5I_GROUP, H5I_type_t, "%d", "H5Iget_type"); - ret = H5Oclose(grp); - CHECK(ret, FAIL, "H5Oclose"); - - /* Commit the type inside the group */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - ret = H5Oclose(dtype); - CHECK(ret, FAIL, "H5Oclose"); - - /* Create the data space for the dataset. */ - dims[0] = DIM0; - dims[1] = DIM1; - dspace = H5Screate_simple(RANK, dims, NULL); - CHECK(dspace, FAIL, "H5Screate_simple"); - - /* Create the dataset. */ - dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - ret = H5Oclose(dset); - CHECK(ret, FAIL, "H5Oclose"); - - /* Attempting to close the data space with H5Oclose should fail */ - H5E_BEGIN_TRY - { - ret = H5Oclose(dspace); - VERIFY(ret, FAIL, "H5Oclose"); - } - H5E_END_TRY - /* Close the dataspace for real */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Make sure that H5Oclose can close objects opened with H5Oopen */ - grp = H5Oopen(fid, "group", H5P_DEFAULT); - CHECK(grp, FAIL, "H5Oopen"); - dtype = H5Oopen(fid, "group/datatype", H5P_DEFAULT); - CHECK(dtype, FAIL, "H5Oopen"); - dset = H5Oopen(fid, "dataset", H5P_DEFAULT); - CHECK(dset, FAIL, "H5Oopen"); - - ret = H5Oclose(grp); - CHECK(ret, FAIL, "H5Oclose"); - ret = H5Oclose(dtype); - CHECK(ret, FAIL, "H5Oclose"); - ret = H5Oclose(dset); - CHECK(ret, FAIL, "H5Oclose"); - - /* Make sure H5Oclose can close objects opened with H5*open */ - grp = H5Gopen2(fid, "group", H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gopen2"); - dtype = H5Topen2(fid, "group/datatype", H5P_DEFAULT); - CHECK(dtype, FAIL, "H5Topen2"); - dset = H5Dopen2(fid, "dataset", H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dopen2"); - - ret = H5Oclose(grp); - CHECK(ret, FAIL, "H5Oclose"); - ret = H5Oclose(dtype); - CHECK(ret, FAIL, "H5Oclose"); - ret = H5Oclose(dset); - CHECK(ret, FAIL, "H5Oclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} - -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS -/**************************************************************** -** -** test_h5o_open_by_addr(): Test H5Oopen_by_addr function. -** -****************************************************************/ -static void -test_h5o_open_by_addr(void) -{ - hid_t fid; /* HDF5 File ID */ - hid_t grp, dset, dtype, dspace; /* Object identifiers */ - char filename[1024]; - H5L_info2_t li; /* Buffer for H5Lget_info2 */ - haddr_t grp_addr; /* Addresses for objects */ - haddr_t dset_addr; - haddr_t dtype_addr; - hsize_t dims[RANK]; - H5I_type_t id_type; /* Type of IDs returned from H5Oopen */ - H5G_info_t ginfo; /* Group info struct */ - H5T_class_t type_class; /* Class of the datatype */ - herr_t ret; /* Value returned from API calls */ - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Create a new HDF5 file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a group, dataset, and committed datatype within the file */ - /* Create the group */ - grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gcreate2"); - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - - /* Commit the type inside the group */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create the data space for the dataset. */ - dims[0] = DIM0; - dims[1] = DIM1; - dspace = H5Screate_simple(RANK, dims, NULL); - CHECK(dspace, FAIL, "H5Screate_simple"); - - /* Create the dataset. */ - dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Get address for each object */ - ret = H5Lget_info2(fid, "group", &li, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info2"); - ret = H5VLnative_token_to_addr(fid, li.u.token, &grp_addr); - CHECK(ret, FAIL, "H5VLnative_token_to_addr"); - - ret = H5Lget_info2(fid, "group/datatype", &li, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info2"); - ret = H5VLnative_token_to_addr(fid, li.u.token, &dtype_addr); - CHECK(ret, FAIL, "H5VLnative_token_to_addr"); - - ret = H5Lget_info2(fid, "dataset", &li, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info2"); - ret = H5VLnative_token_to_addr(fid, li.u.token, &dset_addr); - CHECK(ret, FAIL, "H5VLnative_token_to_addr"); - - /* Now make sure that H5Oopen_by_addr can open all three types of objects */ - grp = H5Oopen_by_addr(fid, grp_addr); - CHECK(grp, FAIL, "H5Oopen_by_addr"); - dtype = H5Oopen_by_addr(fid, dtype_addr); - CHECK(dtype, FAIL, "H5Oopen_by_addr"); - /* Check that we can use the group ID as a valid location */ - dset = H5Oopen_by_addr(grp, dset_addr); - CHECK(dset, FAIL, "H5Oopen_by_addr"); - - /* Make sure that each is the right kind of ID */ - id_type = H5Iget_type(grp); - VERIFY(id_type, H5I_GROUP, "H5Iget_type for group ID"); - id_type = H5Iget_type(dtype); - VERIFY(id_type, H5I_DATATYPE, "H5Iget_type for datatype ID"); - id_type = H5Iget_type(dset); - VERIFY(id_type, H5I_DATASET, "H5Iget_type for dataset ID"); - - /* Do something more complex with each of the IDs to make sure they "work" */ - ret = H5Gget_info(grp, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - VERIFY(ginfo.nlinks, 1, "H5Gget_info"); /* There should be one object, the datatype */ - - type_class = H5Tget_class(dtype); - VERIFY(type_class, H5T_INTEGER, "H5Tget_class"); - - dspace = H5Dget_space(dset); - CHECK(dspace, FAIL, "H5Dget_space"); - - /* Close the IDs */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Try giving some bogus values to H5O_open_by_addr. */ - /* Try to open an object with a bad address */ - grp_addr += 20; - H5E_BEGIN_TRY - { - grp = H5Oopen_by_addr(fid, grp_addr); - } - H5E_END_TRY - VERIFY(grp, FAIL, "H5Oopen_by_addr"); - - /* For instance, an objectno smaller than the end of the file's superblock should - * trigger an error */ - grp_addr = 10; - H5E_BEGIN_TRY - { - grp = H5Oopen_by_addr(fid, grp_addr); - } - H5E_END_TRY - VERIFY(grp, FAIL, "H5Oopen_by_addr"); - - /* Likewise, an objectno larger than the size of the file should fail */ - grp_addr = 0; - grp_addr = 1000000000; - H5E_BEGIN_TRY - { - grp = H5Oopen_by_addr(fid, grp_addr); - } - H5E_END_TRY - VERIFY(grp, FAIL, "H5Oopen_by_addr"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Also, trying to open an object without a valid location should fail */ - H5E_BEGIN_TRY - { - dtype = H5Oopen_by_addr(fid, dtype_addr); - } - H5E_END_TRY - VERIFY(dtype, FAIL, "H5Oopen_by_addr"); -} /* test_h5o_open_by_addr() */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - -/**************************************************************** -** -** test_h5o_open_by_token(): Test H5Oopen_by_token function. -** -****************************************************************/ -static void -test_h5o_open_by_token(void) -{ - hid_t fid; /* HDF5 File ID */ - hid_t grp, dset, dtype, dspace; /* Object identifiers */ - char filename[1024]; - H5L_info2_t li; /* Buffer for H5Lget_info */ - hsize_t dims[RANK]; - H5I_type_t id_type; /* Type of IDs returned from H5Oopen */ - H5G_info_t ginfo; /* Group info struct */ - H5T_class_t type_class; /* Class of the datatype */ - herr_t ret; /* Value returned from API calls */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing H5Oopen_by_token\n")); - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Create a new HDF5 file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a group, dataset, and committed datatype within the file */ - /* Create the group */ - grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gcreate2"); - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - - /* Commit the type inside the group */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create the data space for the dataset. */ - dims[0] = DIM0; - dims[1] = DIM1; - dspace = H5Screate_simple(RANK, dims, NULL); - CHECK(dspace, FAIL, "H5Screate_simple"); - - /* Create the dataset. */ - dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Make sure that H5Oopen_by_token can open all three types of objects */ - ret = H5Lget_info2(fid, "group", &li, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info"); - grp = H5Oopen_by_token(fid, li.u.token); - CHECK(grp, FAIL, "H5Oopen_by_token"); - - ret = H5Lget_info2(fid, "group/datatype", &li, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info"); - dtype = H5Oopen_by_token(fid, li.u.token); - CHECK(dtype, FAIL, "H5Oopen_by_token"); - - ret = H5Lget_info2(fid, "dataset", &li, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info"); - /* Check that we can use the group ID as a valid location */ - dset = H5Oopen_by_token(grp, li.u.token); - CHECK(dset, FAIL, "H5Oopen_by_token"); - - /* Make sure that each is the right kind of ID */ - id_type = H5Iget_type(grp); - VERIFY(id_type, H5I_GROUP, "H5Iget_type for group ID"); - id_type = H5Iget_type(dtype); - VERIFY(id_type, H5I_DATATYPE, "H5Iget_type for datatype ID"); - id_type = H5Iget_type(dset); - VERIFY(id_type, H5I_DATASET, "H5Iget_type for dataset ID"); - - /* Do something more complex with each of the IDs to make sure they "work" */ - ret = H5Gget_info(grp, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - VERIFY(ginfo.nlinks, 1, "H5Gget_info"); /* There should be one object, the datatype */ - - type_class = H5Tget_class(dtype); - VERIFY(type_class, H5T_INTEGER, "H5Tget_class"); - - dspace = H5Dget_space(dset); - CHECK(dspace, FAIL, "H5Dget_space"); - - /* Close the IDs */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Try giving some bogus values to H5O_open_by_token */ - /* Try opening an object using H5O_TOKEN_UNDEF (should fail) */ - H5E_BEGIN_TRY - { - dtype = H5Oopen_by_token(fid, H5O_TOKEN_UNDEF); - } - H5E_END_TRY - VERIFY(dtype, FAIL, "H5Oopen_by_token"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Also, trying to open an object without a valid location (should fail) */ - H5E_BEGIN_TRY - { - dtype = H5Oopen_by_token(fid, li.u.token); - } - H5E_END_TRY - VERIFY(dtype, FAIL, "H5Oopen_by_token"); - -} /* test_h5o_open_by_token() */ - -/**************************************************************** -** -** test_h5o_refcount(): Test H5O refcounting functions. -** -****************************************************************/ -static void -test_h5o_refcount(void) -{ - hid_t fid; /* HDF5 File ID */ - hid_t grp, dset, dtype, dspace; /* Object identifiers */ - char filename[1024]; - H5O_info2_t oinfo; /* Object info struct */ - hsize_t dims[RANK]; - herr_t ret; /* Value returned from API calls */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing retrieval of object reference count with H5Oget_info\n")); - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Create a new HDF5 file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a group, dataset, and committed datatype within the file */ - /* Create the group */ - grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gcreate2"); - - /* Commit the type inside the group */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create the data space for the dataset. */ - dims[0] = DIM0; - dims[1] = DIM1; - dspace = H5Screate_simple(RANK, dims, NULL); - CHECK(dspace, FAIL, "H5Screate_simple"); - - /* Create the dataset. */ - dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Get ref counts for each object. They should all be 1, since each object has a hard link. */ - ret = H5Oget_info_by_name3(fid, "group", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid, "datatype", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid, "dataset", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); - - /* Increment each object's reference count. */ - ret = H5Oincr_refcount(grp); - CHECK(ret, FAIL, "H5Oincr_refcount"); - ret = H5Oincr_refcount(dtype); - CHECK(ret, FAIL, "H5Oincr_refcount"); - ret = H5Oincr_refcount(dset); - CHECK(ret, FAIL, "H5Oincr_refcount"); - - /* Get ref counts for each object. They should all be 2 now. */ - ret = H5Oget_info_by_name3(fid, "group", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid, "datatype", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid, "dataset", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); - - /* Decrement the reference counts and check that they decrease back to 1. */ - ret = H5Odecr_refcount(grp); - CHECK(ret, FAIL, "H5Odecr_refcount"); - ret = H5Odecr_refcount(dtype); - CHECK(ret, FAIL, "H5Odecr_refcount"); - ret = H5Odecr_refcount(dset); - CHECK(ret, FAIL, "H5Odecr_refcount"); - - ret = H5Oget_info_by_name3(fid, "group", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid, "datatype", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid, "dataset", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); - - /* Increment the reference counts and then close the file to make sure the increment is permanent */ - ret = H5Oincr_refcount(grp); - CHECK(ret, FAIL, "H5Oincr_refcount"); - ret = H5Oincr_refcount(dtype); - CHECK(ret, FAIL, "H5Oincr_refcount"); - ret = H5Oincr_refcount(dset); - CHECK(ret, FAIL, "H5Oincr_refcount"); - - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file and check that the reference counts were really incremented */ - fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - grp = H5Gopen2(fid, "group", H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gopen2"); - dtype = H5Topen2(fid, "datatype", H5P_DEFAULT); - CHECK(dtype, FAIL, "H5Topen2"); - dset = H5Dopen2(fid, "dataset", H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dopen2"); - - ret = H5Oget_info_by_name3(fid, "group", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid, "datatype", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid, "dataset", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); - - /* Decrement the reference counts and close the file */ - ret = H5Odecr_refcount(grp); - CHECK(ret, FAIL, "H5Odecr_refcount"); - ret = H5Odecr_refcount(dtype); - CHECK(ret, FAIL, "H5Odecr_refcount"); - ret = H5Odecr_refcount(dset); - CHECK(ret, FAIL, "H5Odecr_refcount"); - - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file and check that the reference counts were really decremented */ - fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - grp = H5Gopen2(fid, "group", H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gopen2"); - dtype = H5Topen2(fid, "datatype", H5P_DEFAULT); - CHECK(dtype, FAIL, "H5Topen2"); - dset = H5Dopen2(fid, "dataset", H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dopen2"); - - ret = H5Oget_info_by_name3(fid, "group", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid, "datatype", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid, "dataset", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); - - /* Close the IDs */ - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Make sure that bogus IDs return errors properly */ - H5E_BEGIN_TRY - { - ret = H5Oincr_refcount(grp); - VERIFY(ret, FAIL, "H5Oincr_refcount"); - ret = H5Oincr_refcount(dtype); - VERIFY(ret, FAIL, "H5Oincr_refcount"); - ret = H5Oincr_refcount(dset); - VERIFY(ret, FAIL, "H5Oincr_refcount"); - ret = H5Odecr_refcount(grp); - VERIFY(ret, FAIL, "H5Odecr_refcount"); - ret = H5Odecr_refcount(dtype); - VERIFY(ret, FAIL, "H5Odecr_refcount"); - ret = H5Odecr_refcount(dset); - VERIFY(ret, FAIL, "H5Odecr_refcount"); - } - H5E_END_TRY - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_h5o_refcount() */ - -/**************************************************************** -** -** test_h5o_plist(): Test object creation properties -** -****************************************************************/ -static void -test_h5o_plist(void) -{ - hid_t fid; /* HDF5 File ID */ - hid_t grp, dset, dtype, dspace; /* Object identifiers */ - hid_t fapl; /* File access property list */ - hid_t gcpl, dcpl, tcpl; /* Object creation properties */ - char filename[1024]; - unsigned def_max_compact, def_min_dense; /* Default phase change parameters */ - unsigned max_compact, min_dense; /* Actual phase change parameters */ - herr_t ret; /* Value returned from API calls */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Object creation properties\n")); - - /* Make a FAPL that uses the "use the latest version of the format" flag */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Set the "use the latest version of the format" bounds for creating objects in the file */ - ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - h5_fixname(TEST_FILENAME, fapl, filename, sizeof filename); - - /* Create a new HDF5 file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create group, dataset & named datatype creation property lists */ - gcpl = H5Pcreate(H5P_GROUP_CREATE); - CHECK(gcpl, FAIL, "H5Pcreate"); - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - tcpl = H5Pcreate(H5P_DATATYPE_CREATE); - CHECK(tcpl, FAIL, "H5Pcreate"); - - /* Retrieve default attribute phase change values */ - ret = H5Pget_attr_phase_change(gcpl, &def_max_compact, &def_min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - - /* Set non-default attribute phase change values on each creation property list */ - ret = H5Pset_attr_phase_change(gcpl, def_max_compact + 1, def_min_dense - 1); - CHECK(ret, FAIL, "H5Pset_attr_phase_change"); - ret = H5Pset_attr_phase_change(dcpl, def_max_compact + 1, def_min_dense - 1); - CHECK(ret, FAIL, "H5Pset_attr_phase_change"); - ret = H5Pset_attr_phase_change(tcpl, def_max_compact + 1, def_min_dense - 1); - CHECK(ret, FAIL, "H5Pset_attr_phase_change"); - - /* Retrieve attribute phase change values on each creation property list and verify */ - ret = H5Pget_attr_phase_change(gcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); - VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); - VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); - ret = H5Pget_attr_phase_change(tcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); - VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); - - /* Create a group, dataset, and committed datatype within the file, - * using the respective type of creation property lists. - */ - - /* Create the group anonymously and link it in */ - grp = H5Gcreate_anon(fid, gcpl, H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gcreate_anon"); - ret = H5Olink(grp, fid, "group", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Olink"); - - /* Commit the type inside the group anonymously and link it in */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - ret = H5Tcommit_anon(fid, dtype, tcpl, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit_anon"); - ret = H5Olink(dtype, fid, "datatype", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Olink"); - - /* Create the dataspace for the dataset. */ - dspace = H5Screate(H5S_SCALAR); - CHECK(dspace, FAIL, "H5Screate"); - - /* Create the dataset anonymously and link it in */ - dset = H5Dcreate_anon(fid, H5T_NATIVE_INT, dspace, dcpl, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate_anon"); - ret = H5Olink(dset, fid, "dataset", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Olink"); - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close current creation property lists */ - ret = H5Pclose(gcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(tcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Retrieve each object's creation property list */ - gcpl = H5Gget_create_plist(grp); - CHECK(gcpl, FAIL, "H5Gget_create_plist"); - tcpl = H5Tget_create_plist(dtype); - CHECK(tcpl, FAIL, "H5Tget_create_plist"); - dcpl = H5Dget_create_plist(dset); - CHECK(dcpl, FAIL, "H5Dget_create_plist"); - - /* Retrieve attribute phase change values on each creation property list and verify */ - ret = H5Pget_attr_phase_change(gcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); - VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); - VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); - ret = H5Pget_attr_phase_change(tcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); - VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); - - /* Close current objects */ - ret = H5Pclose(gcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(tcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file and check that the object creation properties persist */ - fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open objects */ - grp = H5Gopen2(fid, "group", H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gopen2"); - dtype = H5Topen2(fid, "datatype", H5P_DEFAULT); - CHECK(dtype, FAIL, "H5Topen2"); - dset = H5Dopen2(fid, "dataset", H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dopen2"); - - /* Retrieve each object's creation property list */ - gcpl = H5Gget_create_plist(grp); - CHECK(gcpl, FAIL, "H5Gget_create_plist"); - tcpl = H5Tget_create_plist(dtype); - CHECK(tcpl, FAIL, "H5Tget_create_plist"); - dcpl = H5Dget_create_plist(dset); - CHECK(dcpl, FAIL, "H5Dget_create_plist"); - - /* Retrieve attribute phase change values on each creation property list and verify */ - ret = H5Pget_attr_phase_change(gcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); - VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); - ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); - VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); - ret = H5Pget_attr_phase_change(tcpl, &max_compact, &min_dense); - CHECK(ret, FAIL, "H5Pget_attr_phase_change"); - VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); - VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); - - /* Close current objects */ - ret = H5Pclose(gcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(tcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close the FAPL */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); -} /* test_h5o_plist() */ - -/**************************************************************** -** -** test_h5o_link(): Test creating link to object -** -****************************************************************/ -static void -test_h5o_link(void) -{ - hid_t file_id = -1; - hid_t group_id = -1; - hid_t space_id = -1; - hid_t dset_id = -1; - hid_t type_id = -1; - hid_t fapl_id = -1; - hid_t lcpl_id = -1; - char filename[1024]; - hsize_t dims[2] = {TEST6_DIM1, TEST6_DIM2}; - htri_t committed; /* Whether the named datatype is committed */ - H5F_libver_t low, high; /* File format bounds */ - int *wdata; - int *rdata; - int i, n; - herr_t ret; /* Value returned from API calls */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing H5Olink\n")); - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Allocate memory buffers */ - /* (These are treated as 2-D buffers) */ - wdata = (int *)malloc((size_t)(TEST6_DIM1 * TEST6_DIM2) * sizeof(int)); - CHECK_PTR(wdata, "malloc"); - rdata = (int *)malloc((size_t)(TEST6_DIM1 * TEST6_DIM2) * sizeof(int)); - CHECK_PTR(rdata, "malloc"); - - /* Initialize the raw data */ - for (i = n = 0; i < (TEST6_DIM1 * TEST6_DIM2); i++) - wdata[i] = n++; - - /* Create the dataspace */ - space_id = H5Screate_simple(2, dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - - /* Create LCPL with intermediate group creation flag set */ - lcpl_id = H5Pcreate(H5P_LINK_CREATE); - CHECK(lcpl_id, FAIL, "H5Pcreate"); - ret = H5Pset_create_intermediate_group(lcpl_id, true); - CHECK(ret, FAIL, "H5Pset_create_intermediate_group"); - - /* Create a file access property list */ - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl_id, FAIL, "H5Pcreate"); - - /* 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++) { - - /* Set version bounds */ - H5E_BEGIN_TRY - { - ret = H5Pset_libver_bounds(fapl_id, low, high); - } - H5E_END_TRY - - if (ret < 0) /* Invalid low/high combinations */ - continue; - - /* Create a new HDF5 file */ - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Close the FAPL */ - ret = H5Pclose(fapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Create and commit a datatype with no name */ - type_id = H5Tcopy(H5T_NATIVE_INT); - CHECK(type_id, FAIL, "H5Fcreate"); - ret = H5Tcommit_anon(file_id, type_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit_anon"); - committed = H5Tcommitted(type_id); - VERIFY(committed, true, "H5Tcommitted"); - - /* Create a dataset with no name using the committed datatype*/ - dset_id = H5Dcreate_anon(file_id, type_id, space_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate_anon"); - - /* Verify that we can write to and read from the dataset */ - - /* Write the data to the dataset */ - ret = H5Dwrite(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read the data back */ - ret = H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the data */ - for (i = 0; i < (TEST6_DIM1 * TEST6_DIM2); i++) - VERIFY(wdata[i], rdata[i], "H5Dread"); - - /* Create a group with no name*/ - group_id = H5Gcreate_anon(file_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group_id, FAIL, "H5Gcreate_anon"); - - /* Link nameless datatype into nameless group */ - ret = H5Olink(type_id, group_id, "datatype", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Olink"); - - /* Link nameless dataset into nameless group with intermediate group */ - ret = H5Olink(dset_id, group_id, "inter_group/dataset", lcpl_id, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Olink"); - - /* Close IDs for dataset and datatype */ - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Tclose(type_id); - CHECK(ret, FAIL, "H5Tclose"); - - /* Re-open datatype using new link */ - type_id = H5Topen2(group_id, "datatype", H5P_DEFAULT); - CHECK(type_id, FAIL, "H5Topen2"); - - /* Link nameless group to root group and close the group ID*/ - ret = H5Olink(group_id, file_id, "/group", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Olink"); - ret = H5Gclose(group_id); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open dataset through root group and verify its data */ - dset_id = H5Dopen2(file_id, "/group/inter_group/dataset", H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dopen2"); - - /* Read data from dataset */ - ret = H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - for (i = 0; i < (TEST6_DIM1 * TEST6_DIM2); i++) - VERIFY(wdata[i], rdata[i], "H5Dread"); - - /* Close open IDs */ - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Tclose(type_id); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - } /* for high */ - } /* for low */ - - /* Close remaining IDs */ - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Pclose(lcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Release buffers */ - free(wdata); - free(rdata); -} /* end test_h5o_link() */ - -#if 0 -/**************************************************************** -** -** test_h5o_comment(): Test H5Oset(get)_comment functions. -** -****************************************************************/ -static void -test_h5o_comment(void) -{ - hid_t fid; /* HDF5 File ID */ - hid_t grp, dset, dtype, dspace; /* Object identifiers */ - hid_t attr_space, attr_id; - char filename[1024]; - hsize_t dims[RANK]; - hsize_t attr_dims = 1; - int attr_value = 5; - const char *file_comment = "file comment"; - const char *grp_comment = "group comment"; - const char *dset_comment = "dataset comment"; - const char *dtype_comment = "datatype comment"; - char check_comment[64]; - ssize_t comment_len = 0; - ssize_t len; - herr_t ret; /* Value returned from API calls */ - int ret_value; - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Create a new HDF5 file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create an attribute for the file */ - attr_space = H5Screate_simple(1, &attr_dims, NULL); - CHECK(attr_space, FAIL, "H5Screate_simple"); - attr_id = H5Acreate2(fid, "file attribute", H5T_NATIVE_INT, attr_space, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate2"); - ret = H5Awrite(attr_id, H5T_NATIVE_INT, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - - /* Putting a comment on the file through its attribute */ - ret = H5Oset_comment(attr_id, file_comment); - CHECK(ret, FAIL, "H5Oset_comment"); - - ret = H5Sclose(attr_space); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create a group, dataset, and committed datatype within the file */ - /* Create the group */ - grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gcreate2"); - - /* Putting a comment on the group */ - ret = H5Oset_comment(grp, grp_comment); - CHECK(ret, FAIL, "H5Oset_comment"); - - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - - /* Commit the type inside the group */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Putting a comment on the committed data type */ - ret = H5Oset_comment(dtype, dtype_comment); - CHECK(ret, FAIL, "H5Oset_comment"); - - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create the data space for the dataset. */ - dims[0] = DIM0; - dims[1] = DIM1; - dspace = H5Screate_simple(RANK, dims, NULL); - CHECK(dspace, FAIL, "H5Screate_simple"); - - /* Create the dataset. */ - dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - - /* Putting a comment on the dataset */ - ret = H5Oset_comment(dset, dset_comment); - CHECK(ret, FAIL, "H5Oset_comment"); - - /* Putting a comment on the dataspace. It's supposed to fail. */ - H5E_BEGIN_TRY - { - ret = H5Oset_comment(dspace, "dataspace comment"); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Oset_comment"); - - /* Close the file */ - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Now make sure that the comments are correct all 4 types of objects */ - /* Open file */ - fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Getting the comment on the file and verify it */ - comment_len = H5Oget_comment(fid, NULL, (size_t)0); - CHECK(comment_len, FAIL, "H5Oget_comment"); - - len = H5Oget_comment(fid, check_comment, (size_t)comment_len + 1); - CHECK(len, FAIL, "H5Oget_comment"); - - ret_value = strcmp(file_comment, check_comment); - VERIFY(ret_value, 0, "H5Oget_comment"); - - /* Open the group */ - grp = H5Gopen2(fid, "group", H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gopen2"); - - /* Getting the comment on the group and verify it */ - comment_len = H5Oget_comment(grp, NULL, (size_t)0); - CHECK(comment_len, FAIL, "H5Oget_comment"); - - len = H5Oget_comment(grp, check_comment, (size_t)comment_len + 1); - CHECK(len, FAIL, "H5Oget_comment"); - - ret_value = strcmp(grp_comment, check_comment); - VERIFY(ret_value, 0, "H5Oget_comment"); - - /* Open the datatype */ - dtype = H5Topen2(fid, "group/datatype", H5P_DEFAULT); - CHECK(dtype, FAIL, "H5Topen2"); - - /* Getting the comment on the datatype and verify it */ - comment_len = H5Oget_comment(dtype, NULL, (size_t)0); - CHECK(comment_len, FAIL, "H5Oget_comment"); - - len = H5Oget_comment(dtype, check_comment, (size_t)comment_len + 1); - CHECK(len, FAIL, "H5Oget_comment"); - - ret_value = strcmp(dtype_comment, check_comment); - VERIFY(ret_value, 0, "H5Oget_comment"); - - /* Open the dataset */ - dset = H5Dopen2(fid, "dataset", H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dopen2"); - - /* Getting the comment on the dataset and verify it */ - comment_len = H5Oget_comment(dset, NULL, (size_t)0); - CHECK(comment_len, FAIL, "H5Oget_comment"); - - len = H5Oget_comment(dset, check_comment, (size_t)comment_len + 1); - CHECK(ret, len, "H5Oget_comment"); - - ret_value = strcmp(dset_comment, check_comment); - VERIFY(ret_value, 0, "H5Oget_comment"); - - /* Close the IDs */ - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* test_h5o_comment() */ - -/**************************************************************** -** -** test_h5o_comment_by_name(): Test H5Oset(get)_comment_by_name functions. -** -****************************************************************/ -static void -test_h5o_comment_by_name(void) -{ - hid_t fid; /* HDF5 File ID */ - hid_t grp, dset, dtype, dspace; /* Object identifiers */ - hid_t attr_space, attr_id; - char filename[1024]; - hsize_t dims[RANK]; - hsize_t attr_dims = 1; - int attr_value = 5; - const char *file_comment = "file comment by name"; - const char *grp_comment = "group comment by name"; - const char *dset_comment = "dataset comment by name"; - const char *dtype_comment = "datatype comment by name"; - char check_comment[64]; - ssize_t comment_len = 0; - ssize_t len; - herr_t ret; /* Value returned from API calls */ - int ret_value; - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Create a new HDF5 file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create an attribute for the file */ - attr_space = H5Screate_simple(1, &attr_dims, NULL); - CHECK(attr_space, FAIL, "H5Screate_simple"); - attr_id = H5Acreate2(fid, "file attribute", H5T_NATIVE_INT, attr_space, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate2"); - ret = H5Awrite(attr_id, H5T_NATIVE_INT, &attr_value); - CHECK(ret, FAIL, "H5Awrite"); - - /* Putting a comment on the file through its attribute */ - ret = H5Oset_comment_by_name(attr_id, ".", file_comment, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oset_comment_by_name"); - - ret = H5Sclose(attr_space); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create a group, dataset, and committed datatype within the file */ - /* Create the group */ - grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gcreate2"); - - /* Putting a comment on the group */ - ret = H5Oset_comment_by_name(fid, "group", grp_comment, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oset_comment_by_name"); - - /* Commit the type inside the group */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Putting a comment on the committed data type */ - ret = H5Oset_comment_by_name(grp, "datatype", dtype_comment, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oset_comment_by_name"); - - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create the data space for the dataset. */ - dims[0] = DIM0; - dims[1] = DIM1; - dspace = H5Screate_simple(RANK, dims, NULL); - CHECK(dspace, FAIL, "H5Screate_simple"); - - /* Create the dataset. */ - dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - - /* Putting a comment on the dataset */ - ret = H5Oset_comment_by_name(fid, "dataset", dset_comment, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oset_comment_by_name"); - - /* Putting a comment on the dataspace. It's supposed to fail. */ - H5E_BEGIN_TRY - { - ret = H5Oset_comment_by_name(dspace, ".", "dataspace comment", H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Oset_comment"); - - /* Close the file */ - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Now make sure that the comments are correct all 4 types of objects */ - /* Open file */ - fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Getting the comment on the file and verify it */ - comment_len = H5Oget_comment_by_name(fid, ".", NULL, (size_t)0, H5P_DEFAULT); - CHECK(comment_len, FAIL, "H5Oget_comment_by_name"); - - len = H5Oget_comment_by_name(fid, ".", check_comment, (size_t)comment_len + 1, H5P_DEFAULT); - CHECK(len, FAIL, "H5Oget_comment_by_name"); - - ret_value = strcmp(file_comment, check_comment); - VERIFY(ret_value, 0, "H5Oget_comment_by_name"); - - /* Open the group */ - grp = H5Gopen2(fid, "group", H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gopen2"); - - /* Getting the comment on the group and verify it */ - comment_len = H5Oget_comment_by_name(fid, "group", NULL, (size_t)0, H5P_DEFAULT); - CHECK(comment_len, FAIL, "H5Oget_comment_by_name"); - - len = H5Oget_comment_by_name(fid, "group", check_comment, (size_t)comment_len + 1, H5P_DEFAULT); - CHECK(len, FAIL, "H5Oget_comment_by_name"); - - ret_value = strcmp(grp_comment, check_comment); - VERIFY(ret_value, 0, "H5Oget_comment_by_name"); - - /* Getting the comment on the datatype and verify it */ - comment_len = H5Oget_comment_by_name(grp, "datatype", NULL, (size_t)0, H5P_DEFAULT); - CHECK(comment_len, FAIL, "H5Oget_comment_by_name"); - - len = H5Oget_comment_by_name(grp, "datatype", check_comment, (size_t)comment_len + 1, H5P_DEFAULT); - CHECK(len, FAIL, "H5Oget_comment"); - - ret_value = strcmp(dtype_comment, check_comment); - VERIFY(ret_value, 0, "H5Oget_comment_by_name"); - - /* Getting the comment on the dataset and verify it */ - comment_len = H5Oget_comment_by_name(fid, "dataset", NULL, (size_t)0, H5P_DEFAULT); - CHECK(comment_len, FAIL, "H5Oget_comment_by_name"); - - len = H5Oget_comment_by_name(fid, "dataset", check_comment, (size_t)comment_len + 1, H5P_DEFAULT); - CHECK(len, FAIL, "H5Oget_comment_by_name"); - - ret_value = strcmp(dset_comment, check_comment); - VERIFY(ret_value, 0, "H5Oget_comment_by_name"); - - /* Close the IDs */ - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* test_h5o_comment_by_name() */ -#endif - -/**************************************************************** -** -** test_h5o_getinfo_same_file(): Test that querying the object info for -** objects in the same file will return the same file "number" -** -****************************************************************/ -static void -test_h5o_getinfo_same_file(void) -{ - hid_t fid1, fid2; /* HDF5 File ID */ - hid_t gid1, gid2; /* Group IDs */ - char filename[1024]; - H5O_info2_t oinfo1, oinfo2; /* Object info structs */ - herr_t ret; /* Value returned from API calls */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing H5Oget_info on objects in same file\n")); - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Create a new HDF5 file */ - fid1 = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create two groups in the file */ - gid1 = H5Gcreate2(fid1, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gcreate2"); - gid2 = H5Gcreate2(fid1, "group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gcreate2"); - - /* Reset object info */ - memset(&oinfo1, 0, sizeof(oinfo1)); - memset(&oinfo2, 0, sizeof(oinfo2)); - - /* Query the object info for each object, through group IDs */ - ret = H5Oget_info3(gid1, &oinfo1, H5O_INFO_BASIC); - CHECK(ret, FAIL, "H5Oget_info3"); - ret = H5Oget_info3(gid2, &oinfo2, H5O_INFO_BASIC); - CHECK(ret, FAIL, "H5Oget_info3"); - - VERIFY(oinfo1.fileno, oinfo2.fileno, "file number from H5Oget_info3"); - - /* Reset object info */ - memset(&oinfo1, 0, sizeof(oinfo1)); - memset(&oinfo2, 0, sizeof(oinfo2)); - - /* Query the object info for each object, by name */ - ret = H5Oget_info_by_name3(fid1, "group1", &oinfo1, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid1, "group2", &oinfo2, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - - VERIFY(oinfo1.fileno, oinfo2.fileno, "file number from H5Oget_info3"); - - /* Close everything */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open file twice */ - fid1 = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - fid2 = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Open the two groups in the file */ - gid1 = H5Gopen2(fid1, "group1", H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gopen2"); - gid2 = H5Gopen2(fid2, "group2", H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - - /* Reset object info */ - memset(&oinfo1, 0, sizeof(oinfo1)); - memset(&oinfo2, 0, sizeof(oinfo2)); - - /* Query the object info for each object, through group IDs */ - ret = H5Oget_info3(gid1, &oinfo1, H5O_INFO_BASIC); - CHECK(ret, FAIL, "H5Oget_info3"); - ret = H5Oget_info3(gid2, &oinfo2, H5O_INFO_BASIC); - CHECK(ret, FAIL, "H5Oget_info3"); - - VERIFY(oinfo1.fileno, oinfo2.fileno, "file number from H5Oget_info3"); - - /* Reset object info */ - memset(&oinfo1, 0, sizeof(oinfo1)); - memset(&oinfo2, 0, sizeof(oinfo2)); - - /* Query the object info for each object, by name */ - ret = H5Oget_info_by_name3(fid1, "group1", &oinfo1, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(fid1, "group2", &oinfo2, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - - VERIFY(oinfo1.fileno, oinfo2.fileno, "file number from H5Oget_info3"); - - /* Close everything */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - -} /* test_h5o_getinfo_same_file() */ - -#ifndef H5_NO_DEPRECATED_SYMBOLS -#if 0 -/**************************************************************** -** -** test_h5o_open_by_addr_deprec(): Test H5Oopen_by_addr function. -** -****************************************************************/ -static void -test_h5o_open_by_addr_deprec(void) -{ - hid_t fid; /* HDF5 File ID */ - hid_t grp, dset, dtype, dspace; /* Object identifiers */ - char filename[1024]; - H5L_info1_t li; /* Buffer for H5Lget_info1 */ - haddr_t grp_addr; /* Addresses for objects */ - haddr_t dset_addr; - haddr_t dtype_addr; - hsize_t dims[RANK]; - H5I_type_t id_type; /* Type of IDs returned from H5Oopen */ - H5G_info_t ginfo; /* Group info struct */ - H5T_class_t type_class; /* Class of the datatype */ - herr_t ret; /* Value returned from API calls */ - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Create a new HDF5 file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a group, dataset, and committed datatype within the file */ - /* Create the group */ - grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp, FAIL, "H5Gcreate2"); - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - - /* Commit the type inside the group */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create the data space for the dataset. */ - dims[0] = DIM0; - dims[1] = DIM1; - dspace = H5Screate_simple(RANK, dims, NULL); - CHECK(dspace, FAIL, "H5Screate_simple"); - - /* Create the dataset. */ - dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Get address for each object */ - ret = H5Lget_info1(fid, "group", &li, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info"); - grp_addr = li.u.address; - ret = H5Lget_info1(fid, "group/datatype", &li, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info"); - dtype_addr = li.u.address; - ret = H5Lget_info1(fid, "dataset", &li, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info"); - dset_addr = li.u.address; - - /* Now make sure that H5Oopen_by_addr can open all three types of objects */ - grp = H5Oopen_by_addr(fid, grp_addr); - CHECK(grp, FAIL, "H5Oopen_by_addr"); - dtype = H5Oopen_by_addr(fid, dtype_addr); - CHECK(dtype, FAIL, "H5Oopen_by_addr"); - /* Check that we can use the group ID as a valid location */ - dset = H5Oopen_by_addr(grp, dset_addr); - CHECK(dset, FAIL, "H5Oopen_by_addr"); - - /* Make sure that each is the right kind of ID */ - id_type = H5Iget_type(grp); - VERIFY(id_type, H5I_GROUP, "H5Iget_type for group ID"); - id_type = H5Iget_type(dtype); - VERIFY(id_type, H5I_DATATYPE, "H5Iget_type for datatype ID"); - id_type = H5Iget_type(dset); - VERIFY(id_type, H5I_DATASET, "H5Iget_type for dataset ID"); - - /* Do something more complex with each of the IDs to make sure they "work" */ - ret = H5Gget_info(grp, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - VERIFY(ginfo.nlinks, 1, "H5Gget_info"); /* There should be one object, the datatype */ - - type_class = H5Tget_class(dtype); - VERIFY(type_class, H5T_INTEGER, "H5Tget_class"); - - dspace = H5Dget_space(dset); - CHECK(dspace, FAIL, "H5Dget_space"); - - /* Close the IDs */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Try giving some bogus values to H5O_open_by_addr. */ - /* Try to open an object with a bad address */ - grp_addr += 20; - H5E_BEGIN_TRY - { - grp = H5Oopen_by_addr(fid, grp_addr); - } - H5E_END_TRY - VERIFY(grp, FAIL, "H5Oopen_by_addr"); - - /* For instance, an objectno smaller than the end of the file's superblock should - * trigger an error */ - grp_addr = 10; - H5E_BEGIN_TRY - { - grp = H5Oopen_by_addr(fid, grp_addr); - } - H5E_END_TRY - VERIFY(grp, FAIL, "H5Oopen_by_addr"); - - /* Likewise, an objectno larger than the size of the file should fail */ - grp_addr = 0; - grp_addr = 1000000000; - H5E_BEGIN_TRY - { - grp = H5Oopen_by_addr(fid, grp_addr); - } - H5E_END_TRY - VERIFY(grp, FAIL, "H5Oopen_by_addr"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Also, trying to open an object without a valid location should fail */ - H5E_BEGIN_TRY - { - dtype = H5Oopen_by_addr(fid, dtype_addr); - } - H5E_END_TRY - VERIFY(dtype, FAIL, "H5Oopen_by_addr"); -} /* test_h5o_open_by_addr_deprec() */ - -/**************************************************************** -** -** visit_obj_cb(): -** This is the callback function invoked by H5Ovisit1() in -** test_h5o_getinfo_visit(): -** --Verify that the object info returned to the callback -** function is the same as H5Oget_info2(). -** -****************************************************************/ -static int -visit_obj_cb(hid_t group_id, const char *name, const H5O_info1_t *oinfo1, void H5_ATTR_UNUSED *_op_data) -{ - H5O_info1_t oinfo2; /* Object info structs */ - - /* Verify the object info for "group1", "group2" and the root group */ - if (!(strcmp(name, "group1"))) { - H5Oget_info_by_name2(group_id, name, &oinfo2, H5O_INFO_NUM_ATTRS, H5P_DEFAULT); - VERIFY(oinfo1->num_attrs, oinfo2.num_attrs, "obj info from H5Ovisit1"); - } - else if (!(strcmp(name, "group2"))) { - H5Oget_info_by_name2(group_id, name, &oinfo2, H5O_INFO_HDR, H5P_DEFAULT); - VERIFY(oinfo1->hdr.nmesgs, oinfo2.hdr.nmesgs, "obj info from H5Ovisit1/H5Oget_info2"); - VERIFY(oinfo1->hdr.nchunks, oinfo2.hdr.nchunks, "obj info from H5Ovisit1/H5Oget_info2"); - } - else if (!(strcmp(name, "."))) { - H5Oget_info_by_name2(group_id, name, &oinfo2, H5O_INFO_META_SIZE, H5P_DEFAULT); - VERIFY(oinfo1->meta_size.obj.index_size, oinfo2.meta_size.obj.index_size, - "obj info from H5Ovisit1/H5Oget_info2"); - VERIFY(oinfo1->meta_size.obj.heap_size, oinfo2.meta_size.obj.heap_size, - "obj info from H5Ovisit1/H5Oget_info2"); - } - - return (H5_ITER_CONT); -} /* end visit_obj_cb() */ - -/**************************************************************** -** -** test_h5o_getinfo_visit(): -** Verify that the object info returned via H5Oget_info1() -** and H5Oget_info2() are the same. -** Verify that the object info retrieved via H5Ovisit1() is -** the same as H5Oget_info2(). -** -****************************************************************/ -static void -test_h5o_getinfo_visit(void) -{ - hid_t fid = -1; /* HDF5 File ID */ - hid_t gid1 = -1, gid2 = -1; /* Group IDs */ - hid_t sid = -1; /* Dataspace ID */ - hid_t aid = -1; /* Attribute ID */ - char filename[1024]; - H5O_info1_t oinfo1, oinfo2; /* Object info structs */ - char attrname[25]; /* Attribute name */ - int j; /* Local index variable */ - herr_t ret; /* Value returned from API calls */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing info returned by H5Oget_info vs H5Ovisit\n")); - - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - - /* Create an HDF5 file */ - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create "group1" in the file */ - gid1 = H5Gcreate2(fid, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gcreate2"); - - /* Create dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Attach 10 attributes to "group1" */ - for (j = 0; j < 10; j++) { - /* Create the attribute name */ - snprintf(attrname, sizeof(attrname), "attr%u", j); - /* Create the attribute */ - aid = H5Acreate2(gid1, attrname, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - /* Close the attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - } - - /* Create "group2" in the file */ - gid2 = H5Gcreate2(fid, "group2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gcreate2"); - - /* Reset object info */ - memset(&oinfo1, 0, sizeof(oinfo1)); - memset(&oinfo2, 0, sizeof(oinfo2)); - - /* Query the object info for "group1" via H5Oget_info1 and H5Oget_info2 */ - ret = H5Oget_info1(gid1, &oinfo1); - CHECK(ret, FAIL, "H5Oget_info1"); - ret = H5Oget_info2(gid1, &oinfo2, H5O_INFO_BASIC | H5O_INFO_NUM_ATTRS); - CHECK(ret, FAIL, "H5Oget_info2"); - - /* Verify the object info for "group1" is correct */ - VERIFY(oinfo1.fileno, oinfo2.fileno, "obj info from H5Oget_info1/2"); - VERIFY(oinfo1.num_attrs, oinfo2.num_attrs, "obj info from H5Oget_info1/2"); - - /* Reset object info */ - memset(&oinfo1, 0, sizeof(oinfo1)); - memset(&oinfo2, 0, sizeof(oinfo2)); - - /* Query the object info for "group2" via H5Oget_info1 and H5Oget_info2 */ - ret = H5Oget_info_by_name1(fid, "group2", &oinfo1, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - ret = H5Oget_info_by_name2(fid, "group2", &oinfo2, H5O_INFO_HDR | H5O_INFO_META_SIZE, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - - /* Verify the object info for "group2" is correct */ - VERIFY(oinfo1.hdr.nmesgs, oinfo2.hdr.nmesgs, "obj info from H5Oget_info1/2"); - VERIFY(oinfo1.hdr.nchunks, oinfo2.hdr.nchunks, "obj info from H5Oget_info1/2"); - VERIFY(oinfo1.meta_size.obj.index_size, oinfo2.meta_size.obj.index_size, "obj info from H5Oget_info1/2"); - VERIFY(oinfo1.meta_size.obj.heap_size, oinfo2.meta_size.obj.heap_size, "obj info from H5Oget_info1/2"); - - /* Close everything */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Verify the object info returned to the callback function is correct */ - ret = H5Ovisit1(fid, H5_INDEX_NAME, H5_ITER_INC, visit_obj_cb, NULL); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* test_h5o_getinfo_visit() */ -#endif -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - -/**************************************************************** -** -** test_h5o(): Main H5O (generic object) testing routine. -** -****************************************************************/ -void -test_h5o(void) -{ - /* Output message about test being performed */ - MESSAGE(5, ("Testing Objects\n")); - - test_h5o_open(); /* Test generic open function */ -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - test_h5o_open_by_addr(); /* Test opening objects by address */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - test_h5o_open_by_token(); /* Test opening objects by token */ - test_h5o_close(); /* Test generic close function */ - test_h5o_refcount(); /* Test incrementing and decrementing reference count */ - test_h5o_plist(); /* Test object creation properties */ - test_h5o_link(); /* Test object link routine */ -#if 0 - test_h5o_comment(); /* Test routines for comment */ - test_h5o_comment_by_name(); /* Test routines for comment by name */ -#endif - test_h5o_getinfo_same_file(); /* Test info for objects in the same file */ -#ifndef H5_NO_DEPRECATED_SYMBOLS -#if 0 - test_h5o_open_by_addr_deprec(); /* Test opening objects by address with H5Lget_info1 */ - test_h5o_getinfo_visit(); /* Test object info for H5Oget_info1/2 and H5Ovisit1 */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif -} /* test_h5o() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_h5o - * - * Purpose: Cleanup temporary test files - * - * Return: none - * - *------------------------------------------------------------------------- - */ -void -cleanup_h5o(void) -{ - char filename[1024]; - - H5E_BEGIN_TRY - { - h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); - H5Fdelete(filename, H5P_DEFAULT); - } - H5E_END_TRY -} diff --git a/test/API/th5s.c b/test/API/th5s.c deleted file mode 100644 index 3ab21f4..0000000 --- a/test/API/th5s.c +++ /dev/null @@ -1,3542 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: th5s - * - * Test the dataspace functionality - * - *************************************************************/ - -#include "testhdf5.h" -/* #include "H5srcdir.h" */ - -/* #include "H5Iprivate.h" */ -/* #include "H5Pprivate.h" */ - -#if 0 -/* - * 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 */ -#define H5S_TESTING /*suppress warning about H5S testing funcs*/ -#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 */ -#endif - -#define TESTFILE "th5s.h5" -#define DATAFILE "th5s1.h5" -#define NULLFILE "th5s2.h5" -#define BASICFILE "th5s3.h5" -#define ZEROFILE "th5s4.h5" -#define BASICDATASET "basic_dataset" -#define BASICDATASET1 "basic_dataset1" -#define BASICDATASET2 "basic_dataset2" -#define BASICDATASET3 "basic_dataset3" -#define BASICDATASET4 "basic_dataset4" -#define BASICATTR "basic_attribute" -#define NULLDATASET "null_dataset" -#define NULLATTR "null_attribute" -#define EXTFILE_NAME "ext_file" - -/* 3-D dataset with fixed dimensions */ -#define SPACE1_RANK 3 -#define SPACE1_DIM1 3 -#define SPACE1_DIM2 15 -#define SPACE1_DIM3 13 - -/* 4-D dataset with one unlimited dimension */ -#define SPACE2_RANK 4 -#define SPACE2_DIM1 0 -#define SPACE2_DIM2 15 -#define SPACE2_DIM3 13 -#define SPACE2_DIM4 23 -#define SPACE2_MAX1 H5S_UNLIMITED -#define SPACE2_MAX2 15 -#define SPACE2_MAX3 13 -#define SPACE2_MAX4 23 - -/* Scalar dataset with simple datatype */ -#define SPACE3_RANK 0 -unsigned space3_data = 65; - -/* Scalar dataset with compound datatype */ -#define SPACE4_FIELDNAME1 "c1" -#define SPACE4_FIELDNAME2 "u" -#define SPACE4_FIELDNAME3 "f" -#define SPACE4_FIELDNAME4 "c2" -size_t space4_field1_off = 0; -size_t space4_field2_off = 0; -size_t space4_field3_off = 0; -size_t space4_field4_off = 0; -struct space4_struct { - char c1; - unsigned u; - float f; - char c2; -} space4_data = {'v', 987123, -3.14F, 'g'}; /* Test data for 4th dataspace */ - -/* - * Testing configuration defines used by: - * test_h5s_encode_regular_hyper() - * test_h5s_encode_irregular_hyper() - * test_h5s_encode_points() - */ -#define CONFIG_8 1 -#define CONFIG_16 2 -#define CONFIG_32 3 -#define POWER8 256 /* 2^8 */ -#define POWER16 65536 /* 2^16 */ -#define POWER32 4294967296 /* 2^32 */ - -/**************************************************************** -** -** test_h5s_basic(): Test basic H5S (dataspace) code. -** -****************************************************************/ -static void -test_h5s_basic(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t dset1; /* Dataset ID */ - hid_t aid1; /* Attribute ID */ - int rank; /* Logical rank of dataspace */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2, SPACE2_DIM3, SPACE2_DIM4}; - hsize_t dims3[H5S_MAX_RANK + 1]; - hsize_t max2[] = {SPACE2_MAX1, SPACE2_MAX2, SPACE2_MAX3, SPACE2_MAX4}; - hsize_t tdims[4]; /* Dimension array to test with */ - hsize_t tmax[4]; - hssize_t n; /* Number of dataspace elements */ -#if 0 - bool driver_is_default_compatible; -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dataspace Manipulation\n")); - - sid1 = H5Screate_simple(SPACE1_RANK, dims1, max2); - CHECK(sid1, FAIL, "H5Screate_simple"); - - n = H5Sget_simple_extent_npoints(sid1); - CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(n, SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3, "H5Sget_simple_extent_npoints"); - - rank = H5Sget_simple_extent_ndims(sid1); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, SPACE1_RANK, "H5Sget_simple_extent_ndims"); - - rank = H5Sget_simple_extent_dims(sid1, tdims, NULL); - CHECK(rank, FAIL, "H5Sget_simple_extent_dims"); - VERIFY(memcmp(tdims, dims1, SPACE1_RANK * sizeof(hsize_t)), 0, "H5Sget_simple_extent_dims"); - - sid2 = H5Screate_simple(SPACE2_RANK, dims2, max2); - CHECK(sid2, FAIL, "H5Screate_simple"); - - n = H5Sget_simple_extent_npoints(sid2); - CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(n, SPACE2_DIM1 * SPACE2_DIM2 * SPACE2_DIM3 * SPACE2_DIM4, "H5Sget_simple_extent_npoints"); - - rank = H5Sget_simple_extent_ndims(sid2); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, SPACE2_RANK, "H5Sget_simple_extent_ndims"); - - rank = H5Sget_simple_extent_dims(sid2, tdims, tmax); - CHECK(rank, FAIL, "H5Sget_simple_extent_dims"); - VERIFY(memcmp(tdims, dims2, SPACE2_RANK * sizeof(hsize_t)), 0, "H5Sget_simple_extent_dims"); - VERIFY(memcmp(tmax, max2, SPACE2_RANK * sizeof(hsize_t)), 0, "H5Sget_simple_extent_dims"); - - /* Change max dims to be equal to the dimensions */ - ret = H5Sset_extent_simple(sid1, SPACE1_RANK, dims1, NULL); - CHECK(ret, FAIL, "H5Sset_extent_simple"); - rank = H5Sget_simple_extent_dims(sid1, tdims, tmax); - CHECK(rank, FAIL, "H5Sget_simple_extent_dims"); - VERIFY(memcmp(tdims, dims1, SPACE1_RANK * sizeof(hsize_t)), 0, "H5Sget_simple_extent_dims"); - VERIFY(memcmp(tmax, dims1, SPACE1_RANK * sizeof(hsize_t)), 0, "H5Sget_simple_extent_dims"); - - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* - * Check to be sure we can't create a simple dataspace that has too many - * dimensions. - */ - H5E_BEGIN_TRY - { - sid1 = H5Screate_simple(H5S_MAX_RANK + 1, dims3, NULL); - } - H5E_END_TRY - VERIFY(sid1, FAIL, "H5Screate_simple"); -#if 0 - /* - * Try reading a file that has been prepared that has a dataset with a - * higher dimensionality than what the library can handle. - * - * If this test fails and the H5S_MAX_RANK variable has changed, follow - * the instructions in space_overflow.c for regenerating the th5s.h5 file. - */ - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK_I(ret, "h5_driver_is_default_vfd_compatible"); - - if (driver_is_default_compatible) { - const char *testfile = H5_get_srcdir_filename(TESTFILE); /* Corrected test file name */ - - fid1 = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK_I(fid1, "H5Fopen"); - if (fid1 >= 0) { - dset1 = H5Dopen2(fid1, "dset", H5P_DEFAULT); - VERIFY(dset1, FAIL, "H5Dopen2"); - ret = H5Fclose(fid1); - CHECK_I(ret, "H5Fclose"); - } - else - printf("***cannot open the pre-created H5S_MAX_RANK test file (%s)\n", testfile); - } -#endif - /* Verify that incorrect dimensions don't work */ - dims1[0] = H5S_UNLIMITED; - H5E_BEGIN_TRY - { - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - } - H5E_END_TRY - VERIFY(sid1, FAIL, "H5Screate_simple"); - - dims1[0] = H5S_UNLIMITED; - sid1 = H5Screate(H5S_SIMPLE); - CHECK(sid1, FAIL, "H5Screate"); - - H5E_BEGIN_TRY - { - ret = H5Sset_extent_simple(sid1, SPACE1_RANK, dims1, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sset_extent_simple"); - - ret = H5Sclose(sid1); - CHECK_I(ret, "H5Sclose"); - - /* - * Try writing simple dataspaces without setting their extents - */ - /* Create the file */ - fid1 = H5Fcreate(BASICFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - dims1[0] = SPACE1_DIM1; - - sid1 = H5Screate(H5S_SIMPLE); - CHECK(sid1, FAIL, "H5Screate"); - sid2 = H5Screate_simple(1, dims1, dims1); - CHECK(sid2, FAIL, "H5Screate"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) { - /* This dataset's space has no extent; it should not be created */ - H5E_BEGIN_TRY - { - dset1 = - H5Dcreate2(fid1, BASICDATASET, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(dset1, FAIL, "H5Dcreate2"); - } - - dset1 = H5Dcreate2(fid1, BASICDATASET2, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - - /* Try some writes with the bad dataspace (sid1) */ - H5E_BEGIN_TRY - { - ret = H5Dwrite(dset1, H5T_NATIVE_INT, sid1, H5S_ALL, H5P_DEFAULT, &n); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dwrite"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) { - H5E_BEGIN_TRY - { - ret = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, sid1, H5P_DEFAULT, &n); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dwrite"); - - H5E_BEGIN_TRY - { - ret = H5Dwrite(dset1, H5T_NATIVE_INT, sid1, sid1, H5P_DEFAULT, &n); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dwrite"); - } - - /* Try to iterate using the bad dataspace */ - H5E_BEGIN_TRY - { - ret = H5Diterate(&n, H5T_NATIVE_INT, sid1, NULL, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Diterate"); - - /* Try to fill using the bad dataspace */ - H5E_BEGIN_TRY - { - ret = H5Dfill(NULL, H5T_NATIVE_INT, &n, H5T_NATIVE_INT, sid1); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dfill"); - - if ((vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) && (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC)) { - /* Now use the bad dataspace as the space for an attribute */ - H5E_BEGIN_TRY - { - aid1 = H5Acreate2(dset1, BASICATTR, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(aid1, FAIL, "H5Acreate2"); - } - - /* Make sure that dataspace reads using the bad dataspace fail */ - H5E_BEGIN_TRY - { - ret = H5Dread(dset1, H5T_NATIVE_INT, sid1, H5S_ALL, H5P_DEFAULT, &n); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dread"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) { - H5E_BEGIN_TRY - { - ret = H5Dread(dset1, H5T_NATIVE_INT, H5S_ALL, sid1, H5P_DEFAULT, &n); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dread"); - - H5E_BEGIN_TRY - { - ret = H5Dread(dset1, H5T_NATIVE_INT, sid1, sid1, H5P_DEFAULT, &n); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dread"); - } - - /* Clean up */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_h5s_basic() */ - -/**************************************************************** -** -** test_h5s_null(): Test NULL dataspace -** -****************************************************************/ -static void -test_h5s_null(void) -{ - hid_t fid; /* File ID */ - hid_t sid; /* Dataspace IDs */ - hid_t dset_sid, dset_sid2; /* Dataspace IDs */ - hid_t attr_sid; /* Dataspace IDs */ - hid_t did; /* Dataset ID */ - hid_t attr; /*Attribute ID */ - H5S_class_t stype; /* dataspace type */ - hssize_t nelem; /* Number of elements */ - unsigned uval = 2; /* Buffer for writing to dataset */ - int val = 1; /* Buffer for writing to attribute */ - H5S_sel_type sel_type; /* Type of selection currently */ - hsize_t dims[1] = {10}; /* Dimensions for converting null dataspace to simple */ - H5S_class_t space_type; /* Type of dataspace */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Null Dataspace\n")); - - /* Create the file */ - fid = H5Fcreate(NULLFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - sid = H5Screate(H5S_NULL); - CHECK(sid, FAIL, "H5Screate"); - - /* Check that the null dataspace actually has 0 elements */ - nelem = H5Sget_simple_extent_npoints(sid); - VERIFY(nelem, 0, "H5Sget_simple_extent_npoints"); - - /* Check that the dataspace was created with an "all" selection */ - sel_type = H5Sget_select_type(sid); - VERIFY(sel_type, H5S_SEL_ALL, "H5Sget_select_type"); - - /* Check that the null dataspace has 0 elements selected */ - nelem = H5Sget_select_npoints(sid); - VERIFY(nelem, 0, "H5Sget_select_npoints"); - - /* Change to "none" selection */ - ret = H5Sselect_none(sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Check that the null dataspace has 0 elements selected */ - nelem = H5Sget_select_npoints(sid); - VERIFY(nelem, 0, "H5Sget_select_npoints"); - - /* Check to be sure we can't set a hyperslab selection on a null dataspace */ - H5E_BEGIN_TRY - { - hsize_t start[1] = {0}; - hsize_t count[1] = {0}; - - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, NULL, count, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - - /* Check to be sure we can't set a point selection on a null dataspace */ - H5E_BEGIN_TRY - { - hsize_t coord[1][1]; /* Coordinates for point selection */ - - coord[0][0] = 0; - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)1, (const hsize_t *)coord); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sselect_elements"); - - /* Create first dataset */ - did = H5Dcreate2(fid, NULLDATASET, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Write "nothing" to the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &uval); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Write "nothing" to the dataset (with type conversion :-) */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &val); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Try reading from the dataset (make certain our buffer is unmodified) */ - ret = H5Dread(did, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &uval); - CHECK(ret, FAIL, "H5Dread"); - VERIFY(uval, 2, "H5Dread"); - - /* Try reading from the dataset (with type conversion :-) (make certain our buffer is unmodified) */ - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &val); - CHECK(ret, FAIL, "H5Dread"); - VERIFY(val, 1, "H5Dread"); - - /* Create an attribute for the group */ - attr = H5Acreate2(did, NULLATTR, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write "nothing" to the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_INT, &val); - CHECK(ret, FAIL, "H5Awrite"); - - /* Write "nothing" to the attribute (with type conversion :-) */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, &uval); - CHECK(ret, FAIL, "H5Awrite"); - - /* Try reading from the attribute (make certain our buffer is unmodified) */ - ret = H5Aread(attr, H5T_NATIVE_INT, &val); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(val, 1, "H5Aread"); - - /* Try reading from the attribute (with type conversion :-) (make certain our buffer is unmodified) */ - ret = H5Aread(attr, H5T_NATIVE_UINT, &uval); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(uval, 2, "H5Aread"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Verify that we've got the right kind of dataspace */ - space_type = H5Sget_simple_extent_type(sid); - VERIFY(space_type, H5S_NULL, "H5Sget_simple_extent_type"); - - /* Convert the null dataspace to a simple dataspace */ - ret = H5Sset_extent_simple(sid, 1, dims, NULL); - CHECK(ret, FAIL, "H5Sset_extent_simple"); - - /* Verify that we've got the right kind of dataspace now */ - space_type = H5Sget_simple_extent_type(sid); - VERIFY(space_type, H5S_SIMPLE, "H5Sget_simple_extent_type"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /*============================================ - * Reopen the file to check the dataspace - *============================================ - */ - fid = H5Fopen(NULLFILE, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Reopen the dataset */ - did = H5Dopen2(fid, NULLDATASET, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Get the space of the dataset */ - dset_sid = H5Dget_space(did); - CHECK(dset_sid, FAIL, "H5Dget_space"); - - /* Query the NULL dataspace */ - dset_sid2 = H5Scopy(dset_sid); - CHECK(dset_sid2, FAIL, "H5Scopy"); - - /* Verify the class type of dataspace */ - stype = H5Sget_simple_extent_type(dset_sid2); - VERIFY(stype, H5S_NULL, "H5Sget_simple_extent_type"); - - /* Verify there is zero element in the dataspace */ - ret = (herr_t)H5Sget_simple_extent_npoints(dset_sid2); - VERIFY(ret, 0, "H5Sget_simple_extent_npoints"); - - /* Try reading from the dataset (make certain our buffer is unmodified) */ - ret = H5Dread(did, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &uval); - CHECK(ret, FAIL, "H5Dread"); - VERIFY(uval, 2, "H5Dread"); - - /* Close the dataspace */ - ret = H5Sclose(dset_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(dset_sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Open the attribute for the dataset */ - attr = H5Aopen(did, NULLATTR, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Get the space of the dataset */ - attr_sid = H5Aget_space(attr); - CHECK(attr_sid, FAIL, "H5Aget_space"); - - /* Verify the class type of dataspace */ - stype = H5Sget_simple_extent_type(attr_sid); - VERIFY(stype, H5S_NULL, "H5Sget_simple_extent_type"); - - /* Verify there is zero element in the dataspace */ - ret = (herr_t)H5Sget_simple_extent_npoints(attr_sid); - VERIFY(ret, 0, "H5Sget_simple_extent_npoints"); - - /* Close the dataspace */ - ret = H5Sclose(attr_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Try reading from the attribute (make certain our buffer is unmodified) */ - ret = H5Aread(attr, H5T_NATIVE_INT, &val); - CHECK(ret, FAIL, "H5Aread"); - VERIFY(val, 1, "H5Aread"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_h5s_null() */ - -/**************************************************************** -** -** test_h5s_zero_dim(): Test the code for dataspace with zero dimension size -** -****************************************************************/ -static void -test_h5s_zero_dim(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t sid1, attr_sid; /* Dataspace ID */ - hid_t sid_chunk; /* Dataspace ID for chunked dataset */ - hid_t dset1; /* Dataset ID */ - hid_t plist_id; /* Dataset creation property list */ - hid_t attr; /* Attribute ID */ - int rank; /* Logical rank of dataspace */ - hsize_t dims1[] = {0, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t max_dims[] = {SPACE1_DIM1 + 1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t extend_dims[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t chunk_dims[] = {SPACE1_DIM1, SPACE1_DIM2 / 3, SPACE1_DIM3}; - hsize_t tdims[SPACE1_RANK]; /* Dimension array to test with */ - int wdata[SPACE1_DIM2][SPACE1_DIM3]; - int rdata[SPACE1_DIM2][SPACE1_DIM3]; - short wdata_short[SPACE1_DIM2][SPACE1_DIM3]; - short rdata_short[SPACE1_DIM2][SPACE1_DIM3]; - int wdata_real[SPACE1_DIM1][SPACE1_DIM2][SPACE1_DIM3]; - int rdata_real[SPACE1_DIM1][SPACE1_DIM2][SPACE1_DIM3]; - int val = 3; - hsize_t start[] = {0, 0, 0}; - hsize_t count[] = {3, 15, 13}; - hsize_t coord[1][3]; /* Coordinates for point selection */ - hssize_t nelem; /* Number of elements */ - H5S_sel_type sel_type; /* Type of selection currently */ - H5S_class_t stype; /* dataspace type */ - H5D_alloc_time_t alloc_time; /* Space allocation time */ - herr_t ret; /* Generic return value */ - unsigned int i, j, k; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dataspace with zero dimension size\n")); - - /* Initialize the data */ - for (i = 0; i < SPACE1_DIM2; i++) - for (j = 0; j < SPACE1_DIM3; j++) { - wdata[i][j] = (int)(i + j); - rdata[i][j] = 7; - wdata_short[i][j] = (short)(i + j); - rdata_short[i][j] = 7; - } - - for (i = 0; i < SPACE1_DIM1; i++) - for (j = 0; j < SPACE1_DIM2; j++) - for (k = 0; k < SPACE1_DIM3; k++) - wdata_real[i][j][k] = (int)(i + j + k); - - /* Test with different space allocation times */ - for (alloc_time = H5D_ALLOC_TIME_EARLY; alloc_time <= H5D_ALLOC_TIME_INCR; alloc_time++) { - - /* Make sure we can create the space with the dimension size 0 (starting from v1.8.7). - * The dimension doesn't need to be unlimited. */ - dims1[0] = 0; - dims1[1] = SPACE1_DIM2; - dims1[2] = SPACE1_DIM3; - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - sid1 = H5Screate(H5S_SIMPLE); - CHECK(sid1, FAIL, "H5Screate"); - - /* SID1 has the 1st dimension size as zero. The maximal dimension will be - * the same as the dimension because of the NULL passed in. */ - ret = H5Sset_extent_simple(sid1, SPACE1_RANK, dims1, NULL); - CHECK(ret, FAIL, "H5Sset_extent_simple"); - - /* Check that the dataspace actually has 0 elements */ - nelem = H5Sget_simple_extent_npoints(sid1); - VERIFY(nelem, 0, "H5Sget_simple_extent_npoints"); - - /* Check that the dataspace was created with an "all" selection */ - sel_type = H5Sget_select_type(sid1); - VERIFY(sel_type, H5S_SEL_ALL, "H5Sget_select_type"); - - /* Check that the dataspace has 0 elements selected */ - nelem = H5Sget_select_npoints(sid1); - VERIFY(nelem, 0, "H5Sget_select_npoints"); - - /* Change to "none" selection */ - ret = H5Sselect_none(sid1); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Check that the dataspace has 0 elements selected */ - nelem = H5Sget_select_npoints(sid1); - VERIFY(nelem, 0, "H5Sget_select_npoints"); - - /* Try to select all dataspace */ - ret = H5Sselect_all(sid1); - CHECK(ret, FAIL, "H5Sselect_all"); - - /* Check that the dataspace has 0 elements selected */ - nelem = H5Sget_select_npoints(sid1); - VERIFY(nelem, 0, "H5Sget_select_npoints"); - - /* Create the dataspace for chunked dataset with the first dimension size as zero. - * The maximal dimensions are bigger than the dimensions for later expansion. */ - sid_chunk = H5Screate_simple(SPACE1_RANK, dims1, max_dims); - CHECK(sid_chunk, FAIL, "H5Screate_simple"); - - /*============================================ - * Make sure we can use 0-dimension to create - * contiguous, chunked, compact, and external - * datasets, and also attribute. - *============================================ - */ - fid1 = H5Fcreate(ZEROFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /*===================== Contiguous dataset =======================*/ - plist_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plist_id, FAIL, "H5Pcreate"); - - ret = H5Pset_alloc_time(plist_id, alloc_time); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - dset1 = H5Dcreate2(fid1, BASICDATASET, H5T_NATIVE_INT, sid1, H5P_DEFAULT, plist_id, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - - ret = H5Pclose(plist_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Write "nothing" to the dataset */ - ret = H5Dwrite(dset1, H5T_NATIVE_INT, sid1, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - /* Try reading from the dataset (make certain our buffer is unmodified) */ - ret = H5Dread(dset1, H5T_NATIVE_INT, sid1, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM2; i++) { - for (j = 0; j < SPACE1_DIM3; j++) { - if (rdata[i][j] != 7) { - H5_FAILED(); - printf("element [%d][%d] is %d but should have been 7\n", i, j, rdata[i][j]); - } - } - } - - /* Write "nothing" to the dataset (with type conversion :-) */ - ret = H5Dwrite(dset1, H5T_NATIVE_SHORT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata_short); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - /* Try reading from the dataset (make certain our buffer is unmodified) */ - ret = H5Dread(dset1, H5T_NATIVE_INT, sid1, H5S_ALL, H5P_DEFAULT, rdata_short); - CHECK(ret, FAIL, "H5Dread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM2; i++) { - for (j = 0; j < SPACE1_DIM3; j++) { - if (rdata_short[i][j] != 7) { - H5_FAILED(); - printf("element [%d][%d] is %d but should have been 7\n", i, j, rdata_short[i][j]); - } - } - } - - if (vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) { - /* Select a hyperslab beyond its current dimension sizes, then try to write - * the data. It should fail. */ - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - H5E_BEGIN_TRY - { - ret = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, sid1, H5P_DEFAULT, wdata); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dwrite"); - } - - /* Change to "none" selection */ - ret = H5Sselect_none(sid1); - CHECK(ret, FAIL, "H5Sselect_none"); - - if (vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) { - /* Select a point beyond the dimension size, then try to write the data. - * It should fail. */ - coord[0][0] = 2; - coord[0][1] = 5; - coord[0][2] = 3; - ret = H5Sselect_elements(sid1, H5S_SELECT_SET, (size_t)1, (const hsize_t *)coord); - CHECK(ret, FAIL, "H5Sselect_elements"); - - H5E_BEGIN_TRY - { - ret = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, sid1, H5P_DEFAULT, &val); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dwrite"); - } - - /* Restore the selection to all */ - ret = H5Sselect_all(sid1); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - - /*=================== Chunked dataset ====================*/ - plist_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plist_id, FAIL, "H5Pcreate"); - - ret = H5Pset_chunk(plist_id, SPACE1_RANK, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* ret = H5Pset_alloc_time(plist_id, alloc_time); */ - /* CHECK(ret, FAIL, "H5Pset_alloc_time"); */ - - dset1 = - H5Dcreate2(fid1, BASICDATASET1, H5T_NATIVE_INT, sid_chunk, H5P_DEFAULT, plist_id, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - - /* Write "nothing" to the dataset */ - ret = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - /* Try reading from the dataset (make certain our buffer is unmodified) */ - ret = H5Dread(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM2; i++) - for (j = 0; j < SPACE1_DIM3; j++) { - if (rdata[i][j] != 7) { - H5_FAILED(); - printf("element [%d][%d] is %d but should have been 7\n", i, j, rdata[i][j]); - } - } - - /* Now extend the dataset to SPACE1_DIM1*SPACE1_DIM2*SPACE1_DIM3 and make sure - * we can write data to it */ - extend_dims[0] = SPACE1_DIM1; - ret = H5Dset_extent(dset1, extend_dims); - CHECK(ret, FAIL, "H5Dset_extent"); - - ret = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata_real); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - ret = H5Dread(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata_real); - CHECK(ret, FAIL, "H5Dread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM1; i++) { - for (j = 0; j < SPACE1_DIM2; j++) { - for (k = 0; k < SPACE1_DIM3; k++) { - if (rdata_real[i][j][k] != wdata_real[i][j][k]) { - H5_FAILED(); - printf("element [%d][%d][%d] is %d but should have been %d\n", i, j, k, - rdata_real[i][j][k], wdata_real[i][j][k]); - } - } - } - } - - /* Now shrink the first dimension size of the dataset to 0 and make sure no data is in it */ - extend_dims[0] = 0; - ret = H5Dset_extent(dset1, extend_dims); - CHECK(ret, FAIL, "H5Dset_extent"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - /* Try reading from the dataset (make certain our buffer is unmodified) */ - ret = H5Dread(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM2; i++) - for (j = 0; j < SPACE1_DIM3; j++) { - if (rdata[i][j] != 7) { - H5_FAILED(); - printf("element [%d][%d] is %d but should have been 7\n", i, j, rdata[i][j]); - } - } - if ((vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) && - (vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) { - /* Now extend the first dimension size of the dataset to SPACE1_DIM1*3 past the maximal size. - * It is supposed to fail. */ - extend_dims[0] = SPACE1_DIM1 * 3; - H5E_BEGIN_TRY - { - ret = H5Dset_extent(dset1, extend_dims); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dset_extent"); - } - ret = H5Pclose(plist_id); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - - /*=================== Compact dataset =====================*/ - plist_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plist_id, FAIL, "H5Pcreate"); - - ret = H5Pset_layout(plist_id, H5D_COMPACT); - CHECK(ret, FAIL, "H5Pset_layout"); - - /* Don't set the allocation time for compact storage datasets (must be early) */ - - dset1 = H5Dcreate2(fid1, BASICDATASET2, H5T_NATIVE_INT, sid1, H5P_DEFAULT, plist_id, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - - /* Write "nothing" to the dataset */ - ret = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - /* Try reading from the dataset (make certain our buffer is unmodified) */ - ret = H5Dread(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM2; i++) - for (j = 0; j < SPACE1_DIM3; j++) { - if (rdata[i][j] != 7) { - H5_FAILED(); - printf("element [%d][%d] is %d but should have been 7\n", i, j, rdata[i][j]); - } - } - - ret = H5Pclose(plist_id); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - - /*=========== Contiguous dataset with external storage ============*/ - plist_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plist_id, FAIL, "H5Pcreate"); - - /* Change the DCPL for contiguous layout with external storage. The size of the reserved - * space in the external file is the size of the dataset (zero because one dimension size is zero). - * There's no need to clean up the external file since the library doesn't create it - * until the data is written to it. */ - ret = H5Pset_external(plist_id, EXTFILE_NAME, (off_t)0, (hsize_t)0); - CHECK(ret, FAIL, "H5Pset_external"); - - ret = H5Pset_alloc_time(plist_id, alloc_time); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - dset1 = H5Dcreate2(fid1, BASICDATASET3, H5T_NATIVE_INT, sid1, H5P_DEFAULT, plist_id, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - - /* Write "nothing" to the dataset */ - ret = H5Dwrite(dset1, H5T_NATIVE_INT, sid1, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - /* Try reading from the dataset (make certain our buffer is unmodified) */ - ret = H5Dread(dset1, H5T_NATIVE_INT, sid1, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM2; i++) { - for (j = 0; j < SPACE1_DIM3; j++) { - if (rdata[i][j] != 7) { - H5_FAILED(); - printf("element [%d][%d] is %d but should have been 7\n", i, j, rdata[i][j]); - } - } - } - - ret = H5Pclose(plist_id); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - - /*=============== Create an attribute for the file ================*/ - attr = H5Acreate2(fid1, NULLATTR, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Acreate2"); - - /* Write "nothing" to the attribute */ - ret = H5Awrite(attr, H5T_NATIVE_INT, wdata); - CHECK(ret, FAIL, "H5Awrite"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - /* Try reading from the attribute (make certain our buffer is unmodified) */ - ret = H5Aread(attr, H5T_NATIVE_INT, rdata); - CHECK(ret, FAIL, "H5Aread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM2; i++) { - for (j = 0; j < SPACE1_DIM3; j++) { - if (rdata[i][j] != 7) { - H5_FAILED(); - printf("element [%d][%d] is %d but should have been 7\n", i, j, rdata[i][j]); - } - } - } - - /* Write "nothing" to the attribute (with type conversion :-) */ - ret = H5Awrite(attr, H5T_NATIVE_SHORT, wdata_short); - CHECK(ret, FAIL, "H5Awrite"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - /* Try reading from the attribute (with type conversion :-) (make certain our buffer is unmodified) */ - ret = H5Aread(attr, H5T_NATIVE_SHORT, rdata_short); - CHECK(ret, FAIL, "H5Aread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM2; i++) { - for (j = 0; j < SPACE1_DIM3; j++) { - if (rdata_short[i][j] != 7) { - H5_FAILED(); - printf("element [%d][%d] is %d but should have been 7\n", i, j, rdata_short[i][j]); - } - } - } - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /*=============================================================== - * Extend the dimension to make it a normal dataspace (3x15x13). - * Verify that data can be written to and read from the chunked - * dataset now. - *=============================================================== - */ - dims1[0] = SPACE1_DIM1; - ret = H5Sset_extent_simple(sid_chunk, SPACE1_RANK, dims1, max_dims); - CHECK(ret, FAIL, "H5Sset_extent_simple"); - - nelem = H5Sget_simple_extent_npoints(sid_chunk); - CHECK(nelem, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(nelem, SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3, "H5Sget_simple_extent_npoints"); - - rank = H5Sget_simple_extent_ndims(sid_chunk); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, SPACE1_RANK, "H5Sget_simple_extent_ndims"); - - rank = H5Sget_simple_extent_dims(sid_chunk, tdims, NULL); - CHECK(rank, FAIL, "H5Sget_simple_extent_dims"); - VERIFY(memcmp(tdims, dims1, SPACE1_RANK * sizeof(hsize_t)), 0, "H5Sget_simple_extent_dims"); - - /* Set it to chunked dataset */ - plist_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plist_id, FAIL, "H5Pcreate"); - - ret = H5Pset_chunk(plist_id, SPACE1_RANK, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - ret = H5Pset_alloc_time(plist_id, alloc_time); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - dset1 = - H5Dcreate2(fid1, BASICDATASET4, H5T_NATIVE_INT, sid_chunk, H5P_DEFAULT, plist_id, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dcreate2"); - - ret = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata_real); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - ret = H5Dread(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata_real); - CHECK(ret, FAIL, "H5Dread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM1; i++) { - for (j = 0; j < SPACE1_DIM2; j++) { - for (k = 0; k < SPACE1_DIM3; k++) { - if (rdata_real[i][j][k] != wdata_real[i][j][k]) { - H5_FAILED(); - printf("element [%d][%d][%d] is %d but should have been %d\n", i, j, k, - rdata_real[i][j][k], wdata_real[i][j][k]); - } - } - } - } - - ret = H5Pclose(plist_id); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Change the dimensions to make them zero size again (0x0x0). Verify that - * no element is in the dataspace. */ - dims1[0] = dims1[1] = dims1[2] = 0; - ret = H5Sset_extent_simple(sid_chunk, SPACE1_RANK, dims1, NULL); - CHECK(ret, FAIL, "H5Sset_extent_simple"); - - /* Check that the dataspace actually has 0 elements */ - nelem = H5Sget_simple_extent_npoints(sid_chunk); - VERIFY(nelem, 0, "H5Sget_simple_extent_npoints"); - - /* Check that the dataspace was created with an "all" selection */ - sel_type = H5Sget_select_type(sid_chunk); - VERIFY(sel_type, H5S_SEL_ALL, "H5Sget_select_type"); - - /* Check that the dataspace has 0 elements selected */ - nelem = H5Sget_select_npoints(sid_chunk); - VERIFY(nelem, 0, "H5Sget_select_npoints"); - - /* Change to "none" selection */ - ret = H5Sselect_none(sid_chunk); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Check that the dataspace has 0 elements selected */ - nelem = H5Sget_select_npoints(sid_chunk); - VERIFY(nelem, 0, "H5Sget_select_npoints"); - - ret = H5Sclose(sid_chunk); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /*============================================ - * Reopen the file to check the dataspace - *============================================ - */ - fid1 = H5Fopen(ZEROFILE, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Reopen the chunked dataset */ - dset1 = H5Dopen2(fid1, BASICDATASET1, H5P_DEFAULT); - CHECK(dset1, FAIL, "H5Dopen2"); - - /* Get the space of the dataset and query it */ - sid1 = H5Dget_space(dset1); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Verify the class type of dataspace */ - stype = H5Sget_simple_extent_type(sid1); - VERIFY(stype, H5S_SIMPLE, "H5Sget_simple_extent_type"); - - /* Verify there is zero element in the dataspace */ - nelem = H5Sget_simple_extent_npoints(sid1); - VERIFY(nelem, 0, "H5Sget_simple_extent_npoints"); - - /* Verify the dimension sizes are correct */ - rank = H5Sget_simple_extent_dims(sid1, tdims, NULL); - CHECK(rank, FAIL, "H5Sget_simple_extent_dims"); - VERIFY(tdims[0], 0, "H5Sget_simple_extent_dims"); - VERIFY(tdims[1], SPACE1_DIM2, "H5Sget_simple_extent_dims"); - VERIFY(tdims[2], SPACE1_DIM3, "H5Sget_simple_extent_dims"); - - /* Try reading from the dataset (make certain our buffer is unmodified) */ - ret = H5Dread(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM2; i++) { - for (j = 0; j < SPACE1_DIM3; j++) { - if (rdata[i][j] != 7) { - H5_FAILED(); - printf("element [%d][%d] is %d but should have been 7\n", i, j, rdata[i][j]); - } - } - } - - /* Close the dataset and its dataspace */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Open the attribute for the file */ - attr = H5Aopen(fid1, NULLATTR, H5P_DEFAULT); - CHECK(attr, FAIL, "H5Aopen"); - - /* Get the space of the dataset */ - attr_sid = H5Aget_space(attr); - CHECK(attr_sid, FAIL, "H5Aget_space"); - - /* Verify the class type of dataspace */ - stype = H5Sget_simple_extent_type(attr_sid); - VERIFY(stype, H5S_SIMPLE, "H5Sget_simple_extent_type"); - - /* Verify there is zero element in the dataspace */ - nelem = H5Sget_simple_extent_npoints(attr_sid); - VERIFY(nelem, 0, "H5Sget_simple_extent_npoints"); - - /* Try reading from the attribute (make certain our buffer is unmodified) */ - ret = H5Aread(attr, H5T_NATIVE_SHORT, rdata_short); - CHECK(ret, FAIL, "H5Aread"); - - /* Check results */ - for (i = 0; i < SPACE1_DIM2; i++) { - for (j = 0; j < SPACE1_DIM3; j++) { - if (rdata_short[i][j] != 7) { - H5_FAILED(); - printf("element [%d][%d] is %d but should have been 7\n", i, j, rdata_short[i][j]); - } - } - } - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close the dataspace */ - ret = H5Sclose(attr_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ -} /* test_h5s_zero_dim() */ - -/**************************************************************** -** -** test_h5s_encode(): Test H5S (dataspace) encoding and decoding. -** -** Note: See "RFC: H5Sencode/H5Sdecode Format Change". -** -****************************************************************/ -static void -test_h5s_encode(H5F_libver_t low, H5F_libver_t high) -{ - hid_t sid1, sid2, sid3; /* Dataspace ID */ - hid_t decoded_sid1, decoded_sid2, decoded_sid3; - int rank; /* Logical rank of dataspace */ - hid_t fapl = -1; /* File access property list ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - size_t sbuf_size = 0, null_size = 0, scalar_size = 0; - unsigned char *sbuf = NULL, *null_sbuf = NULL, *scalar_buf = NULL; - hsize_t tdims[4]; /* Dimension array to test with */ - hssize_t n; /* Number of dataspace elements */ - hsize_t start[] = {0, 0, 0}; - hsize_t stride[] = {2, 5, 3}; - hsize_t count[] = {2, 2, 2}; - hsize_t block[] = {1, 3, 1}; - H5S_sel_type sel_type; - H5S_class_t space_type; - hssize_t nblocks; - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dataspace Encoding and Decoding\n")); - - /*------------------------------------------------------------------------- - * Test encoding and decoding of simple dataspace and hyperslab selection. - *------------------------------------------------------------------------- - */ - - /* Create the file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Set low/high bounds in the fapl */ - ret = H5Pset_libver_bounds(fapl, low, high); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Create the dataspace */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Set the hyperslab selection */ - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Encode simple dataspace in a buffer with the fapl setting */ - ret = H5Sencode2(sid1, NULL, &sbuf_size, fapl); - CHECK(ret, FAIL, "H5Sencode2"); - - if (sbuf_size > 0) { - sbuf = (unsigned char *)calloc((size_t)1, sbuf_size); - CHECK_PTR(sbuf, "calloc"); - } - - /* Try decoding bogus buffer */ - H5E_BEGIN_TRY - { - ret_id = H5Sdecode(sbuf); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Sdecode"); - - /* Encode the simple dataspace in a buffer with the fapl setting */ - ret = H5Sencode2(sid1, sbuf, &sbuf_size, fapl); - CHECK(ret, FAIL, "H5Sencode"); - - /* Decode from the dataspace buffer and return an object handle */ - decoded_sid1 = H5Sdecode(sbuf); - CHECK(decoded_sid1, FAIL, "H5Sdecode"); - - /* Verify the decoded dataspace */ - n = H5Sget_simple_extent_npoints(decoded_sid1); - CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(n, SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3, "H5Sget_simple_extent_npoints"); - - /* Retrieve and verify the dataspace rank */ - rank = H5Sget_simple_extent_ndims(decoded_sid1); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, SPACE1_RANK, "H5Sget_simple_extent_ndims"); - - /* Retrieve and verify the dataspace dimensions */ - rank = H5Sget_simple_extent_dims(decoded_sid1, tdims, NULL); - CHECK(rank, FAIL, "H5Sget_simple_extent_dims"); - VERIFY(memcmp(tdims, dims1, SPACE1_RANK * sizeof(hsize_t)), 0, "H5Sget_simple_extent_dims"); - - /* Verify the type of dataspace selection */ - sel_type = H5Sget_select_type(decoded_sid1); - VERIFY(sel_type, H5S_SEL_HYPERSLABS, "H5Sget_select_type"); - - /* Verify the number of hyperslab blocks */ - nblocks = H5Sget_select_hyper_nblocks(decoded_sid1); - VERIFY(nblocks, 2 * 2 * 2, "H5Sget_select_hyper_nblocks"); - - /* Close the dataspaces */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(decoded_sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /*------------------------------------------------------------------------- - * Test encoding and decoding of null dataspace. - *------------------------------------------------------------------------- - */ - sid2 = H5Screate(H5S_NULL); - CHECK(sid2, FAIL, "H5Screate"); - - /* Encode null dataspace in a buffer */ - ret = H5Sencode2(sid2, NULL, &null_size, fapl); - CHECK(ret, FAIL, "H5Sencode"); - - if (null_size > 0) { - null_sbuf = (unsigned char *)calloc((size_t)1, null_size); - CHECK_PTR(null_sbuf, "calloc"); - } - - /* Encode the null dataspace in the buffer */ - ret = H5Sencode2(sid2, null_sbuf, &null_size, fapl); - CHECK(ret, FAIL, "H5Sencode2"); - - /* Decode from the dataspace buffer and return an object handle */ - decoded_sid2 = H5Sdecode(null_sbuf); - CHECK(decoded_sid2, FAIL, "H5Sdecode"); - - /* Verify the decoded dataspace type */ - space_type = H5Sget_simple_extent_type(decoded_sid2); - VERIFY(space_type, H5S_NULL, "H5Sget_simple_extent_type"); - - /* Close the dataspaces */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(decoded_sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /*------------------------------------------------------------------------- - * Test encoding and decoding of scalar dataspace. - *------------------------------------------------------------------------- - */ - /* Create scalar dataspace */ - sid3 = H5Screate(H5S_SCALAR); - CHECK(sid3, FAIL, "H5Screate_simple"); - - /* Encode scalar dataspace in a buffer */ - ret = H5Sencode2(sid3, NULL, &scalar_size, fapl); - CHECK(ret, FAIL, "H5Sencode"); - - if (scalar_size > 0) { - scalar_buf = (unsigned char *)calloc((size_t)1, scalar_size); - CHECK_PTR(scalar_buf, "calloc"); - } - - /* Encode the scalar dataspace in the buffer */ - ret = H5Sencode2(sid3, scalar_buf, &scalar_size, fapl); - CHECK(ret, FAIL, "H5Sencode2"); - - /* Decode from the dataspace buffer and return an object handle */ - decoded_sid3 = H5Sdecode(scalar_buf); - CHECK(decoded_sid3, FAIL, "H5Sdecode"); - - /* Verify extent type */ - space_type = H5Sget_simple_extent_type(decoded_sid3); - VERIFY(space_type, H5S_SCALAR, "H5Sget_simple_extent_type"); - - /* Verify decoded dataspace */ - n = H5Sget_simple_extent_npoints(decoded_sid3); - CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(n, 1, "H5Sget_simple_extent_npoints"); - - /* Retrieve and verify the dataspace rank */ - rank = H5Sget_simple_extent_ndims(decoded_sid3); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, 0, "H5Sget_simple_extent_ndims"); - - /* Close the dataspaces */ - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(decoded_sid3); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the file access property list */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Release resources */ - if (sbuf) - free(sbuf); - if (null_sbuf) - free(null_sbuf); - if (scalar_buf) - free(scalar_buf); -} /* test_h5s_encode() */ - -#ifndef H5_NO_DEPRECATED_SYMBOLS - -/**************************************************************** -** -** test_h5s_encode(): Test H5S (dataspace) encoding and decoding. -** -****************************************************************/ -static void -test_h5s_encode1(void) -{ - hid_t sid1, sid2, sid3; /* Dataspace ID */ - hid_t decoded_sid1, decoded_sid2, decoded_sid3; - int rank; /* Logical rank of dataspace */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - size_t sbuf_size = 0, null_size = 0, scalar_size = 0; - unsigned char *sbuf = NULL, *null_sbuf = NULL, *scalar_buf = NULL; - hsize_t tdims[4]; /* Dimension array to test with */ - hssize_t n; /* Number of dataspace elements */ - hsize_t start[] = {0, 0, 0}; - hsize_t stride[] = {2, 5, 3}; - hsize_t count[] = {2, 2, 2}; - hsize_t block[] = {1, 3, 1}; - H5S_sel_type sel_type; - H5S_class_t space_type; - hssize_t nblocks; - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dataspace Encoding (H5Sencode1) and Decoding\n")); - - /*------------------------------------------------------------------------- - * Test encoding and decoding of simple dataspace and hyperslab selection. - *------------------------------------------------------------------------- - */ - /* Create the dataspace */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Set the hyperslab selection */ - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Encode simple dataspace in a buffer with the fapl setting */ - ret = H5Sencode1(sid1, NULL, &sbuf_size); - CHECK(ret, FAIL, "H5Sencode2"); - - if (sbuf_size > 0) { - sbuf = (unsigned char *)calloc((size_t)1, sbuf_size); - CHECK_PTR(sbuf, "calloc"); - } - - /* Try decoding bogus buffer */ - H5E_BEGIN_TRY - { - ret_id = H5Sdecode(sbuf); - } - H5E_END_TRY - VERIFY(ret_id, FAIL, "H5Sdecode"); - - /* Encode the simple dataspace in a buffer */ - ret = H5Sencode1(sid1, sbuf, &sbuf_size); - CHECK(ret, FAIL, "H5Sencode"); - - /* Decode from the dataspace buffer and return an object handle */ - decoded_sid1 = H5Sdecode(sbuf); - CHECK(decoded_sid1, FAIL, "H5Sdecode"); - - /* Verify the decoded dataspace */ - n = H5Sget_simple_extent_npoints(decoded_sid1); - CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(n, SPACE1_DIM1 * SPACE1_DIM2 * SPACE1_DIM3, "H5Sget_simple_extent_npoints"); - - /* Retrieve and verify the dataspace rank */ - rank = H5Sget_simple_extent_ndims(decoded_sid1); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, SPACE1_RANK, "H5Sget_simple_extent_ndims"); - - /* Retrieve and verify the dataspace dimensions */ - rank = H5Sget_simple_extent_dims(decoded_sid1, tdims, NULL); - CHECK(rank, FAIL, "H5Sget_simple_extent_dims"); - VERIFY(memcmp(tdims, dims1, SPACE1_RANK * sizeof(hsize_t)), 0, "H5Sget_simple_extent_dims"); - - /* Verify the type of dataspace selection */ - sel_type = H5Sget_select_type(decoded_sid1); - VERIFY(sel_type, H5S_SEL_HYPERSLABS, "H5Sget_select_type"); - - /* Verify the number of hyperslab blocks */ - nblocks = H5Sget_select_hyper_nblocks(decoded_sid1); - VERIFY(nblocks, 2 * 2 * 2, "H5Sget_select_hyper_nblocks"); - - /* Close the dataspaces */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(decoded_sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /*------------------------------------------------------------------------- - * Test encoding and decoding of null dataspace. - *------------------------------------------------------------------------- - */ - sid2 = H5Screate(H5S_NULL); - CHECK(sid2, FAIL, "H5Screate"); - - /* Encode null dataspace in a buffer */ - ret = H5Sencode1(sid2, NULL, &null_size); - CHECK(ret, FAIL, "H5Sencode"); - - if (null_size > 0) { - null_sbuf = (unsigned char *)calloc((size_t)1, null_size); - CHECK_PTR(null_sbuf, "calloc"); - } - - /* Encode the null dataspace in the buffer */ - ret = H5Sencode1(sid2, null_sbuf, &null_size); - CHECK(ret, FAIL, "H5Sencode2"); - - /* Decode from the dataspace buffer and return an object handle */ - decoded_sid2 = H5Sdecode(null_sbuf); - CHECK(decoded_sid2, FAIL, "H5Sdecode"); - - /* Verify the decoded dataspace type */ - space_type = H5Sget_simple_extent_type(decoded_sid2); - VERIFY(space_type, H5S_NULL, "H5Sget_simple_extent_type"); - - /* Close the dataspaces */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(decoded_sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /*------------------------------------------------------------------------- - * Test encoding and decoding of scalar dataspace. - *------------------------------------------------------------------------- - */ - /* Create scalar dataspace */ - sid3 = H5Screate(H5S_SCALAR); - CHECK(sid3, FAIL, "H5Screate"); - - /* Encode scalar dataspace in a buffer */ - ret = H5Sencode1(sid3, NULL, &scalar_size); - CHECK(ret, FAIL, "H5Sencode"); - - if (scalar_size > 0) { - scalar_buf = (unsigned char *)calloc((size_t)1, scalar_size); - CHECK_PTR(scalar_buf, "calloc"); - } - - /* Encode the scalar dataspace in the buffer */ - ret = H5Sencode1(sid3, scalar_buf, &scalar_size); - CHECK(ret, FAIL, "H5Sencode2"); - - /* Decode from the dataspace buffer and return an object handle */ - decoded_sid3 = H5Sdecode(scalar_buf); - CHECK(decoded_sid3, FAIL, "H5Sdecode"); - - /* Verify extent type */ - space_type = H5Sget_simple_extent_type(decoded_sid3); - VERIFY(space_type, H5S_SCALAR, "H5Sget_simple_extent_type"); - - /* Verify decoded dataspace */ - n = H5Sget_simple_extent_npoints(decoded_sid3); - CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(n, 1, "H5Sget_simple_extent_npoints"); - - /* Retrieve and verify the dataspace rank */ - rank = H5Sget_simple_extent_ndims(decoded_sid3); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, 0, "H5Sget_simple_extent_ndims"); - - /* Close the dataspaces */ - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(decoded_sid3); - CHECK(ret, FAIL, "H5Sclose"); - - /* Release resources */ - if (sbuf) - free(sbuf); - if (null_sbuf) - free(null_sbuf); - if (scalar_buf) - free(scalar_buf); -} /* test_h5s_encode1() */ - -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - -/**************************************************************** -** -** test_h5s_check_encoding(): -** This is the helper routine to verify that H5Sencode2() -** works as specified in the RFC for the library format setting -** in the file access property list. -** See "RFC: H5Sencode/H5Sdeocde Format Change". -** -** This routine is used by: -** test_h5s_encode_regular_hyper() -** test_h5s_encode_irregular_hyper() -** test_h5s_encode_points() -** -****************************************************************/ -static herr_t -test_h5s_check_encoding(hid_t in_fapl, hid_t in_sid, uint32_t expected_version, uint8_t expected_enc_size, - bool expected_to_fail) -{ - char *buf = NULL; /* Pointer to the encoded buffer */ - size_t buf_size; /* Size of the encoded buffer */ - hid_t d_sid = -1; /* The decoded dataspace ID */ - htri_t check; - hsize_t in_low_bounds[1]; /* The low bounds for the selection for in_sid */ - hsize_t in_high_bounds[1]; /* The high bounds for the selection for in_sid */ - hsize_t d_low_bounds[1]; /* The low bounds for the selection for d_sid */ - hsize_t d_high_bounds[1]; /* The high bounds for the selection for d_sid */ - herr_t ret; /* Return value */ - - /* Get buffer size for encoding with the format setting in in_fapl */ - H5E_BEGIN_TRY - { - ret = H5Sencode2(in_sid, NULL, &buf_size, in_fapl); - } - H5E_END_TRY - - if (expected_to_fail) { - VERIFY(ret, FAIL, "H5Screate_simple"); - } - else { - - CHECK(ret, FAIL, "H5Sencode2"); - - /* Allocate the buffer for encoding */ - buf = (char *)malloc(buf_size); - CHECK_PTR(buf, "malloc"); - - /* Encode according to the setting in in_fapl */ - ret = H5Sencode2(in_sid, buf, &buf_size, in_fapl); - CHECK(ret, FAIL, "H5Sencode2"); - - /* Decode the buffer */ - d_sid = H5Sdecode(buf); - CHECK(d_sid, FAIL, "H5Sdecode"); - - /* Verify the number of selected points for in_sid and d_sid */ - VERIFY(H5Sget_select_npoints(in_sid), H5Sget_select_npoints(d_sid), "Compare npoints"); - - /* Verify if the two dataspace selections (in_sid, d_sid) are the same shape */ - check = H5Sselect_shape_same(in_sid, d_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare the starting/ending coordinates of the bounding box for in_sid and d_sid */ - ret = H5Sget_select_bounds(in_sid, in_low_bounds, in_high_bounds); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - ret = H5Sget_select_bounds(d_sid, d_low_bounds, d_high_bounds); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(in_low_bounds[0], d_low_bounds[0], "Compare selection low bounds"); - VERIFY(in_high_bounds[0], d_high_bounds[0], "Compare selection high bounds"); - - /* - * See "RFC: H5Sencode/H5Sdeocde Format Change" for the verification of: - * H5S_SEL_POINTS: - * --the expected version for point selection info - * --the expected encoded size (version 2 points selection info) - * H5S_SEL_HYPERSLABS: - * --the expected version for hyperslab selection info - * --the expected encoded size (version 3 hyperslab selection info) - */ - - if (H5Sget_select_type(in_sid) == H5S_SEL_POINTS) { - - /* Verify the version */ - VERIFY((uint32_t)buf[35], expected_version, "Version for point selection"); - - /* Verify the encoded size for version 2 */ - if (expected_version == 2) - VERIFY((uint8_t)buf[39], expected_enc_size, "Encoded size of point selection info"); - } - - if (H5Sget_select_type(in_sid) == H5S_SEL_HYPERSLABS) { - - /* Verify the version */ - VERIFY((uint32_t)buf[35], expected_version, "Version for hyperslab selection info"); - - /* Verify the encoded size for version 3 */ - if (expected_version == 3) - VERIFY((uint8_t)buf[40], expected_enc_size, "Encoded size of selection info"); - - } /* hyperslab selection */ - - ret = H5Sclose(d_sid); - CHECK(ret, FAIL, "H5Sclose"); - if (buf) - free(buf); - } - - return (0); - -} /* test_h5s_check_encoding */ - -/**************************************************************** -** -** test_h5s_encode_regular_hyper(): -** This test verifies that H5Sencode2() works as specified in -** the RFC for regular hyperslabs. -** See "RFC: H5Sencode/H5Sdeocde Format Change". -** -****************************************************************/ -static void -test_h5s_encode_regular_hyper(H5F_libver_t low, H5F_libver_t high) -{ - hid_t fapl = -1; /* File access property list ID */ - hid_t sid = -1; /* Dataspace ID */ - hsize_t numparticles = 8388608; /* Used to calculate dimension size */ - unsigned num_dsets = 513; /* Used to calculate dimension size */ - hsize_t total_particles = numparticles * num_dsets; - hsize_t vdsdims[1] = {total_particles}; /* Dimension size */ - hsize_t start, stride, count, block; /* Selection info */ - unsigned config; /* Testing configuration */ - unsigned unlim; /* H5S_UNLIMITED setting or not */ - herr_t ret; /* Generic return value */ - uint32_t expected_version = 0; /* Expected version for selection info */ - uint8_t expected_enc_size = 0; /* Expected encoded size for selection info */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dataspace encoding of regular hyperslabs\n")); - - /* Create the file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Set the low/high bounds in the fapl */ - ret = H5Pset_libver_bounds(fapl, low, high); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Create the dataspace */ - sid = H5Screate_simple(1, vdsdims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Testing with each configuration */ - for (config = CONFIG_16; config <= CONFIG_32; config++) { - bool expected_to_fail = false; - - /* Testing with unlimited or not */ - for (unlim = 0; unlim <= 1; unlim++) { - start = 0; - count = unlim ? H5S_UNLIMITED : 2; - - if ((high <= H5F_LIBVER_V18) && (unlim || config == CONFIG_32)) - expected_to_fail = true; - - if (low >= H5F_LIBVER_V112) - expected_version = 3; - else if (config == CONFIG_16 && !unlim) - expected_version = 1; - else - expected_version = 2; - - /* test 1 */ - switch (config) { - case CONFIG_16: - stride = POWER16 - 1; - block = 4; - expected_enc_size = (uint8_t)(expected_version == 3 ? 2 : 4); - break; - case CONFIG_32: - stride = POWER32 - 1; - block = 4; - expected_enc_size = (uint8_t)(expected_version == 3 ? 4 : 8); - - break; - default: - assert(0); - break; - } /* end switch */ - - /* Set the hyperslab selection */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, &start, &stride, &count, &block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Verify the version and encoded size expected for this configuration */ - ret = test_h5s_check_encoding(fapl, sid, expected_version, expected_enc_size, expected_to_fail); - CHECK(ret, FAIL, "test_h5s_check_encoding"); - - /* test 2 */ - switch (config) { - case CONFIG_16: - stride = POWER16 - 1; - block = POWER16 - 2; - expected_enc_size = (uint8_t)(expected_version == 3 ? 2 : 4); - break; - case CONFIG_32: - stride = POWER32 - 1; - block = POWER32 - 2; - expected_enc_size = (uint8_t)(expected_version == 3 ? 4 : 8); - break; - default: - assert(0); - break; - } /* end switch */ - - /* Set the hyperslab selection */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, &start, &stride, &count, &block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Verify the version and encoded size for this configuration */ - ret = test_h5s_check_encoding(fapl, sid, expected_version, expected_enc_size, expected_to_fail); - CHECK(ret, FAIL, "test_h5s_check_encoding"); - - /* test 3 */ - switch (config) { - case CONFIG_16: - stride = POWER16 - 1; - block = POWER16 - 1; - expected_enc_size = 4; - break; - case CONFIG_32: - stride = POWER32 - 1; - block = POWER32 - 1; - expected_enc_size = 8; - break; - default: - assert(0); - break; - } - - /* Set the hyperslab selection */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, &start, &stride, &count, &block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Verify the version and encoded size expected for this configuration */ - ret = test_h5s_check_encoding(fapl, sid, expected_version, expected_enc_size, expected_to_fail); - CHECK(ret, FAIL, "test_h5s_check_encoding"); - - /* test 4 */ - switch (config) { - case CONFIG_16: - stride = POWER16; - block = POWER16 - 2; - expected_enc_size = 4; - break; - case CONFIG_32: - stride = POWER32; - block = POWER32 - 2; - expected_enc_size = 8; - break; - default: - assert(0); - break; - } /* end switch */ - - /* Set the hyperslab selection */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, &start, &stride, &count, &block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Verify the version and encoded size expected for this configuration */ - ret = test_h5s_check_encoding(fapl, sid, expected_version, expected_enc_size, expected_to_fail); - CHECK(ret, FAIL, "test_h5s_check_encoding"); - - /* test 5 */ - switch (config) { - case CONFIG_16: - stride = POWER16; - block = 1; - expected_enc_size = 4; - break; - case CONFIG_32: - stride = POWER32; - block = 1; - expected_enc_size = 8; - break; - default: - assert(0); - break; - } - - /* Set the hyperslab selection */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, &start, &stride, &count, &block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Verify the version and encoded size expected for this configuration */ - ret = test_h5s_check_encoding(fapl, sid, expected_version, expected_enc_size, expected_to_fail); - CHECK(ret, FAIL, "test_h5s_check_encoding"); - - } /* for unlim */ - } /* for config */ - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - -} /* test_h5s_encode_regular_hyper() */ - -/**************************************************************** -** -** test_h5s_encode_irregular_hyper(): -** This test verifies that H5Sencode2() works as specified in -** the RFC for irregular hyperslabs. -** See "RFC: H5Sencode/H5Sdeocde Format Change". -** -****************************************************************/ -static void -test_h5s_encode_irregular_hyper(H5F_libver_t low, H5F_libver_t high) -{ - hid_t fapl = -1; /* File access property list ID */ - hid_t sid; /* Dataspace ID */ - hsize_t numparticles = 8388608; /* Used to calculate dimension size */ - unsigned num_dsets = 513; /* Used to calculate dimension size */ - hsize_t total_particles = numparticles * num_dsets; - hsize_t vdsdims[1] = {total_particles}; /* Dimension size */ - hsize_t start, stride, count, block; /* Selection info */ - htri_t is_regular; /* Is this a regular hyperslab */ - unsigned config; /* Testing configuration */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dataspace encoding of irregular hyperslabs\n")); - - /* Create the file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Set the low/high bounds in the fapl */ - ret = H5Pset_libver_bounds(fapl, low, high); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Create the dataspace */ - sid = H5Screate_simple(1, vdsdims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Testing with each configuration */ - for (config = CONFIG_8; config <= CONFIG_32; config++) { - bool expected_to_fail = false; /* Whether H5Sencode2 is expected to fail */ - uint32_t expected_version = 0; /* Expected version for selection info */ - uint32_t expected_enc_size = 0; /* Expected encoded size for selection info */ - - start = 0; - count = 2; - block = 4; - - /* H5Sencode2 is expected to fail for library v110 and below - when the selection exceeds the 32 bits integer limit */ - if (high <= H5F_LIBVER_V110 && config == CONFIG_32) - expected_to_fail = true; - - if (low >= H5F_LIBVER_V112 || config == CONFIG_32) - expected_version = 3; - else - expected_version = 1; - - switch (config) { - case CONFIG_8: - stride = POWER8 - 2; - break; - - case CONFIG_16: - stride = POWER16 - 2; - break; - - case CONFIG_32: - stride = POWER32 - 2; - break; - - default: - assert(0); - break; - } - - /* Set the hyperslab selection */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, &start, &stride, &count, &block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start = 8; - count = 5; - block = 2; - - switch (config) { - case CONFIG_8: - stride = POWER8; - expected_enc_size = expected_version == 3 ? 2 : 4; - break; - - case CONFIG_16: - stride = POWER16; - expected_enc_size = 4; - break; - - case CONFIG_32: - stride = POWER32; - expected_enc_size = 8; - break; - - default: - assert(0); - break; - } - - /* Set the hyperslab selection */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, &start, &stride, &count, &block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Should be irregular hyperslab */ - is_regular = H5Sis_regular_hyperslab(sid); - VERIFY(is_regular, false, "H5Sis_regular_hyperslab"); - - /* Verify the version and encoded size expected for the configuration */ - assert(expected_enc_size <= 255); - ret = test_h5s_check_encoding(fapl, sid, expected_version, (uint8_t)expected_enc_size, - expected_to_fail); - CHECK(ret, FAIL, "test_h5s_check_encoding"); - - } /* for config */ - - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - -} /* test_h5s_encode_irregular_hyper() */ - -/**************************************************************** -** -** test_h5s_encode_points(): -** This test verifies that H5Sencode2() works as specified in -** the RFC for point selection. -** See "RFC: H5Sencode/H5Sdeocde Format Change". -** -****************************************************************/ -static void -test_h5s_encode_points(H5F_libver_t low, H5F_libver_t high) -{ - hid_t fapl = -1; /* File access property list ID */ - hid_t sid; /* Dataspace ID */ - hsize_t numparticles = 8388608; /* Used to calculate dimension size */ - unsigned num_dsets = 513; /* used to calculate dimension size */ - hsize_t total_particles = numparticles * num_dsets; - hsize_t vdsdims[1] = {total_particles}; /* Dimension size */ - hsize_t coord[4]; /* The point coordinates */ - herr_t ret; /* Generic return value */ - bool expected_to_fail = false; /* Expected to fail or not */ - uint32_t expected_version = 0; /* Expected version for selection info */ - uint8_t expected_enc_size = 0; /* Expected encoded size of selection info */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dataspace encoding of points selection\n")); - - /* Create the file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Set the low/high bounds in the fapl */ - ret = H5Pset_libver_bounds(fapl, low, high); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Create the dataspace */ - sid = H5Screate_simple(1, vdsdims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* test 1 */ - coord[0] = 5; - coord[1] = 15; - coord[2] = POWER16; - coord[3] = 19; - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)4, coord); - CHECK(ret, FAIL, "H5Sselect_elements"); - - expected_to_fail = false; - expected_enc_size = 4; - expected_version = 1; - - if (low >= H5F_LIBVER_V112) - expected_version = 2; - - /* Verify the version and encoded size expected for the configuration */ - ret = test_h5s_check_encoding(fapl, sid, expected_version, expected_enc_size, expected_to_fail); - CHECK(ret, FAIL, "test_h5s_check_encoding"); - - /* test 2 */ - coord[0] = 5; - coord[1] = 15; - coord[2] = POWER32 - 1; - coord[3] = 19; - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)4, coord); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Expected result same as test 1 */ - ret = test_h5s_check_encoding(fapl, sid, expected_version, expected_enc_size, expected_to_fail); - CHECK(ret, FAIL, "test_h5s_check_encoding"); - - /* test 3 */ - if (high <= H5F_LIBVER_V110) - expected_to_fail = true; - - if (high >= H5F_LIBVER_V112) { - expected_version = 2; - expected_enc_size = 8; - } - - coord[0] = 5; - coord[1] = 15; - coord[2] = POWER32 + 1; - coord[3] = 19; - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)4, coord); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Verify the version and encoded size expected for the configuration */ - ret = test_h5s_check_encoding(fapl, sid, expected_version, expected_enc_size, expected_to_fail); - CHECK(ret, FAIL, "test_h5s_check_encoding"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - -} /* test_h5s_encode_points() */ - -/**************************************************************** -** -** test_h5s_encode_length(): -** Test to verify HDFFV-10271 is fixed. -** Verify that version 2 hyperslab encoding length is correct. -** -** See "RFC: H5Sencode/H5Sdecode Format Change" for the -** description of the encoding format. -** -****************************************************************/ -static void -test_h5s_encode_length(void) -{ - hid_t sid; /* Dataspace ID */ - hid_t decoded_sid; /* Dataspace ID from H5Sdecode2 */ - size_t sbuf_size = 0; /* Buffer size for H5Sencode2/1 */ - unsigned char *sbuf = NULL; /* Buffer for H5Sencode2/1 */ - hsize_t dims[1] = {500}; /* Dimension size */ - hsize_t start, count, block, stride; /* Hyperslab selection specifications */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Version 2 Hyperslab Encoding Length is correct\n")); - - /* Create dataspace */ - sid = H5Screate_simple(1, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Setting H5S_UNLIMITED in count will use version 2 for hyperslab encoding */ - start = 0; - stride = 10; - block = 4; - count = H5S_UNLIMITED; - - /* Set hyperslab selection */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, &start, &stride, &count, &block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Encode simple dataspace in a buffer */ - ret = H5Sencode2(sid, NULL, &sbuf_size, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Sencode"); - - /* Allocate the buffer */ - if (sbuf_size > 0) { - sbuf = (unsigned char *)calloc((size_t)1, sbuf_size); - CHECK_PTR(sbuf, "H5Sencode2"); - } - - /* Encode the dataspace */ - ret = H5Sencode2(sid, sbuf, &sbuf_size, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Sencode"); - - /* Verify that length stored at this location in the buffer is correct */ - VERIFY((uint32_t)sbuf[40], 36, "Length for encoding version 2"); - VERIFY((uint32_t)sbuf[35], 2, "Hyperslab encoding version is 2"); - - /* Decode from the dataspace buffer and return an object handle */ - decoded_sid = H5Sdecode(sbuf); - CHECK(decoded_sid, FAIL, "H5Sdecode"); - - /* Verify that the original and the decoded dataspace are equal */ - VERIFY(H5Sget_select_npoints(sid), H5Sget_select_npoints(decoded_sid), "Compare npoints"); - - /* Close the decoded dataspace */ - ret = H5Sclose(decoded_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Free the buffer */ - if (sbuf) - free(sbuf); - - /* Close the original dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - -} /* test_h5s_encode_length() */ - -/**************************************************************** -** -** test_h5s_scalar_write(): Test scalar H5S (dataspace) writing code. -** -****************************************************************/ -static void -test_h5s_scalar_write(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - int rank; /* Logical rank of dataspace */ - hsize_t tdims[4]; /* Dimension array to test with */ - hssize_t n; /* Number of dataspace elements */ - H5S_class_t ext_type; /* Extent type */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Scalar Dataspace Manipulation during Writing\n")); - - /* Create file */ - fid1 = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Verify a non-zero rank fails with a NULL dimension. */ - H5E_BEGIN_TRY - { - sid1 = H5Screate_simple(SPACE1_RANK, NULL, NULL); - } - H5E_END_TRY - VERIFY(sid1, FAIL, "H5Screate_simple"); - - /* Create scalar dataspace */ - sid1 = H5Screate_simple(SPACE3_RANK, NULL, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Retrieve the number of elements in the dataspace selection */ - n = H5Sget_simple_extent_npoints(sid1); - CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(n, 1, "H5Sget_simple_extent_npoints"); - - /* Get the dataspace rank */ - rank = H5Sget_simple_extent_ndims(sid1); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, SPACE3_RANK, "H5Sget_simple_extent_ndims"); - - /* Get the dataspace dimension sizes */ - rank = H5Sget_simple_extent_dims(sid1, tdims, NULL); - VERIFY(rank, 0, "H5Sget_simple_extent_dims"); - - /* Verify extent type */ - ext_type = H5Sget_simple_extent_type(sid1); - VERIFY(ext_type, H5S_SCALAR, "H5Sget_simple_extent_type"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", H5T_NATIVE_UINT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write to the dataset */ - ret = H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &space3_data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close scalar dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_h5s_scalar_write() */ - -/**************************************************************** -** -** test_h5s_scalar_read(): Test scalar H5S (dataspace) reading code. -** -****************************************************************/ -static void -test_h5s_scalar_read(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - int rank; /* Logical rank of dataspace */ - hsize_t tdims[4]; /* Dimension array to test with */ - hssize_t n; /* Number of dataspace elements */ - unsigned rdata; /* Scalar data read in */ - herr_t ret; /* Generic return value */ - H5S_class_t ext_type; /* Extent type */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Scalar Dataspace Manipulation during Reading\n")); - - /* Create file */ - fid1 = H5Fopen(DATAFILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Create a dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - n = H5Sget_simple_extent_npoints(sid1); - CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(n, 1, "H5Sget_simple_extent_npoints"); - - rank = H5Sget_simple_extent_ndims(sid1); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, SPACE3_RANK, "H5Sget_simple_extent_ndims"); - - rank = H5Sget_simple_extent_dims(sid1, tdims, NULL); - VERIFY(rank, 0, "H5Sget_simple_extent_dims"); - - /* Verify extent type */ - ext_type = H5Sget_simple_extent_type(sid1); - VERIFY(ext_type, H5S_SCALAR, "H5Sget_simple_extent_type"); - - ret = H5Dread(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); - CHECK(ret, FAIL, "H5Dread"); - VERIFY(rdata, space3_data, "H5Dread"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close scalar dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_h5s_scalar_read() */ - -/**************************************************************** -** -** test_h5s_compound_scalar_write(): Test scalar H5S (dataspace) writing for -** compound datatypes. -** -****************************************************************/ -static void -test_h5s_compound_scalar_write(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t tid1; /* Attribute datatype ID */ - hid_t sid1; /* Dataspace ID */ - int rank; /* Logical rank of dataspace */ - hsize_t tdims[4]; /* Dimension array to test with */ - hssize_t n; /* Number of dataspace elements */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Scalar Dataspace Manipulation for Writing Compound Datatypes\n")); - - /* Create file */ - fid1 = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create the compound datatype. */ - tid1 = H5Tcreate(H5T_COMPOUND, sizeof(struct space4_struct)); - CHECK(tid1, FAIL, "H5Tcreate"); - space4_field1_off = HOFFSET(struct space4_struct, c1); - ret = H5Tinsert(tid1, SPACE4_FIELDNAME1, space4_field1_off, H5T_NATIVE_SCHAR); - CHECK(ret, FAIL, "H5Tinsert"); - space4_field2_off = HOFFSET(struct space4_struct, u); - ret = H5Tinsert(tid1, SPACE4_FIELDNAME2, space4_field2_off, H5T_NATIVE_UINT); - CHECK(ret, FAIL, "H5Tinsert"); - space4_field3_off = HOFFSET(struct space4_struct, f); - ret = H5Tinsert(tid1, SPACE4_FIELDNAME3, space4_field3_off, H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - space4_field4_off = HOFFSET(struct space4_struct, c2); - ret = H5Tinsert(tid1, SPACE4_FIELDNAME4, space4_field4_off, H5T_NATIVE_SCHAR); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create scalar dataspace */ - sid1 = H5Screate_simple(SPACE3_RANK, NULL, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - n = H5Sget_simple_extent_npoints(sid1); - CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(n, 1, "H5Sget_simple_extent_npoints"); - - rank = H5Sget_simple_extent_ndims(sid1); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, SPACE3_RANK, "H5Sget_simple_extent_ndims"); - - rank = H5Sget_simple_extent_dims(sid1, tdims, NULL); - VERIFY(rank, 0, "H5Sget_simple_extent_dims"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, &space4_data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close compound datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close scalar dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_h5s_compound_scalar_write() */ - -/**************************************************************** -** -** test_h5s_compound_scalar_read(): Test scalar H5S (dataspace) reading for -** compound datatypes. -** -****************************************************************/ -static void -test_h5s_compound_scalar_read(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t type; /* Datatype */ - int rank; /* Logical rank of dataspace */ - hsize_t tdims[4]; /* Dimension array to test with */ - hssize_t n; /* Number of dataspace elements */ - struct space4_struct rdata; /* Scalar data read in */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Scalar Dataspace Manipulation for Reading Compound Datatypes\n")); - - /* Create file */ - fid1 = H5Fopen(DATAFILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Create a dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - n = H5Sget_simple_extent_npoints(sid1); - CHECK(n, FAIL, "H5Sget_simple_extent_npoints"); - VERIFY(n, 1, "H5Sget_simple_extent_npoints"); - - rank = H5Sget_simple_extent_ndims(sid1); - CHECK(rank, FAIL, "H5Sget_simple_extent_ndims"); - VERIFY(rank, SPACE3_RANK, "H5Sget_simple_extent_ndims"); - - rank = H5Sget_simple_extent_dims(sid1, tdims, NULL); - VERIFY(rank, 0, "H5Sget_simple_extent_dims"); - - type = H5Dget_type(dataset); - CHECK(type, FAIL, "H5Dget_type"); - - ret = H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); - CHECK(ret, FAIL, "H5Dread"); - if (memcmp(&space4_data, &rdata, sizeof(struct space4_struct)) != 0) { - printf("scalar data different: space4_data.c1=%c, read_data4.c1=%c\n", space4_data.c1, rdata.c1); - printf("scalar data different: space4_data.u=%u, read_data4.u=%u\n", space4_data.u, rdata.u); - printf("scalar data different: space4_data.f=%f, read_data4.f=%f\n", (double)space4_data.f, - (double)rdata.f); - TestErrPrintf("scalar data different: space4_data.c1=%c, read_data4.c1=%c\n", space4_data.c1, - rdata.c2); - } /* end if */ - - /* Close datatype */ - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close scalar dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_h5s_compound_scalar_read() */ - -/* Data array sizes for chunk test */ -#define CHUNK_DATA_NX 50000 -#define CHUNK_DATA_NY 3 - -/**************************************************************** -** -** test_h5s_chunk(): Exercise chunked I/O, testing when data conversion -** is necessary and the entire chunk read in doesn't fit into the -** conversion buffer -** -****************************************************************/ -static void -test_h5s_chunk(void) -{ - herr_t status; - hid_t fileID, dsetID; - hid_t plist_id; - hid_t space_id; - hsize_t dims[2]; - hsize_t csize[2]; - double **chunk_data_dbl = NULL; - double *chunk_data_dbl_data = NULL; - float **chunk_data_flt = NULL; - float *chunk_data_flt_data = NULL; - int i, j; - - /* Allocate memory */ - chunk_data_dbl_data = (double *)calloc(CHUNK_DATA_NX * CHUNK_DATA_NY, sizeof(double)); - CHECK_PTR(chunk_data_dbl_data, "calloc"); - chunk_data_dbl = (double **)calloc(CHUNK_DATA_NX, sizeof(chunk_data_dbl_data)); - CHECK_PTR(chunk_data_dbl, "calloc"); - for (i = 0; i < CHUNK_DATA_NX; i++) - chunk_data_dbl[i] = chunk_data_dbl_data + (i * CHUNK_DATA_NY); - - chunk_data_flt_data = (float *)calloc(CHUNK_DATA_NX * CHUNK_DATA_NY, sizeof(float)); - CHECK_PTR(chunk_data_flt_data, "calloc"); - chunk_data_flt = (float **)calloc(CHUNK_DATA_NX, sizeof(chunk_data_flt_data)); - CHECK_PTR(chunk_data_flt, "calloc"); - for (i = 0; i < CHUNK_DATA_NX; i++) - chunk_data_flt[i] = chunk_data_flt_data + (i * CHUNK_DATA_NY); - - fileID = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fileID, FAIL, "H5Fcreate"); - - plist_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plist_id, FAIL, "H5Pcreate"); - - csize[0] = CHUNK_DATA_NX; - csize[1] = CHUNK_DATA_NY; - status = H5Pset_chunk(plist_id, 2, csize); - CHECK(status, FAIL, "H5Pset_chunk"); - - /* Create the dataspace */ - dims[0] = CHUNK_DATA_NX; - dims[1] = CHUNK_DATA_NY; - space_id = H5Screate_simple(2, dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - - dsetID = H5Dcreate2(fileID, "coords", H5T_NATIVE_FLOAT, space_id, H5P_DEFAULT, plist_id, H5P_DEFAULT); - CHECK(dsetID, FAIL, "H5Dcreate2"); - - /* Initialize float array */ - for (i = 0; i < CHUNK_DATA_NX; i++) - for (j = 0; j < CHUNK_DATA_NY; j++) - chunk_data_flt[i][j] = (float)(i + 1) * 2.5F - (float)j * 100.3F; - - status = H5Dwrite(dsetID, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, chunk_data_flt_data); - CHECK(status, FAIL, "H5Dwrite"); - - status = H5Pclose(plist_id); - CHECK(status, FAIL, "H5Pclose"); - status = H5Sclose(space_id); - CHECK(status, FAIL, "H5Sclose"); - status = H5Dclose(dsetID); - CHECK(status, FAIL, "H5Dclose"); - status = H5Fclose(fileID); - CHECK(status, FAIL, "H5Fclose"); - - /* Reset/initialize the data arrays to read in */ - memset(chunk_data_dbl_data, 0, sizeof(double) * CHUNK_DATA_NX * CHUNK_DATA_NY); - memset(chunk_data_flt_data, 0, sizeof(float) * CHUNK_DATA_NX * CHUNK_DATA_NY); - - fileID = H5Fopen(DATAFILE, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fileID, FAIL, "H5Fopen"); - dsetID = H5Dopen2(fileID, "coords", H5P_DEFAULT); - CHECK(dsetID, FAIL, "H5Dopen2"); - - status = H5Dread(dsetID, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, chunk_data_dbl_data); - CHECK(status, FAIL, "H5Dread"); - status = H5Dread(dsetID, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, chunk_data_flt_data); - CHECK(status, FAIL, "H5Dread"); - - status = H5Dclose(dsetID); - CHECK(status, FAIL, "H5Dclose"); - status = H5Fclose(fileID); - CHECK(status, FAIL, "H5Fclose"); - - for (i = 0; i < CHUNK_DATA_NX; i++) { - for (j = 0; j < CHUNK_DATA_NY; j++) { - /* Check if the two values are within 0.001% range. */ - if (!H5_DBL_REL_EQUAL(chunk_data_dbl[i][j], (double)chunk_data_flt[i][j], 0.00001)) - TestErrPrintf("%u: chunk_data_dbl[%d][%d]=%e, chunk_data_flt[%d][%d]=%e\n", - (unsigned)__LINE__, i, j, chunk_data_dbl[i][j], i, j, - (double)chunk_data_flt[i][j]); - } /* end for */ - } /* end for */ - - free(chunk_data_dbl); - free(chunk_data_dbl_data); - free(chunk_data_flt); - free(chunk_data_flt_data); -} /* test_h5s_chunk() */ - -/**************************************************************** -** -** test_h5s_extent_equal(): Exercise extent comparison code -** -****************************************************************/ -static void -test_h5s_extent_equal(void) -{ - hid_t null_space; /* Null dataspace */ - hid_t scalar_space; /* Scalar dataspace */ - hid_t d1_space1, d1_space2, d1_space3, d1_space4; /* 1-D dataspaces */ - hid_t d2_space1, d2_space2, d2_space3, d2_space4; /* 2-D dataspaces */ - hid_t d3_space1, d3_space2, d3_space3, d3_space4; /* 3-D dataspaces */ - hsize_t d1_dims1[1] = {10}, /* 1-D dimensions */ - d1_dims2[1] = {20}, d1_dims3[1] = {H5S_UNLIMITED}; - hsize_t d2_dims1[2] = {10, 10}, /* 2-D dimensions */ - d2_dims2[2] = {20, 20}, d2_dims3[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; - hsize_t d3_dims1[3] = {10, 10, 10}, /* 3-D dimensions */ - d3_dims2[3] = {20, 20, 20}, d3_dims3[3] = {H5S_UNLIMITED, H5S_UNLIMITED, H5S_UNLIMITED}; - htri_t ext_equal; /* Whether two dataspace extents are equal */ - herr_t ret; /* Generic error return */ - - /* Create dataspaces */ - null_space = H5Screate(H5S_NULL); - CHECK(null_space, FAIL, "H5Screate"); - - scalar_space = H5Screate(H5S_SCALAR); - CHECK(scalar_space, FAIL, "H5Screate"); - - d1_space1 = H5Screate_simple(1, d1_dims1, NULL); - CHECK(d1_space1, FAIL, "H5Screate"); - d1_space2 = H5Screate_simple(1, d1_dims2, NULL); - CHECK(d1_space2, FAIL, "H5Screate"); - d1_space3 = H5Screate_simple(1, d1_dims1, d1_dims2); - CHECK(d1_space3, FAIL, "H5Screate"); - d1_space4 = H5Screate_simple(1, d1_dims1, d1_dims3); - CHECK(d1_space4, FAIL, "H5Screate"); - - d2_space1 = H5Screate_simple(2, d2_dims1, NULL); - CHECK(d2_space1, FAIL, "H5Screate"); - d2_space2 = H5Screate_simple(2, d2_dims2, NULL); - CHECK(d2_space2, FAIL, "H5Screate"); - d2_space3 = H5Screate_simple(2, d2_dims1, d2_dims2); - CHECK(d2_space3, FAIL, "H5Screate"); - d2_space4 = H5Screate_simple(2, d2_dims1, d2_dims3); - CHECK(d2_space4, FAIL, "H5Screate"); - - d3_space1 = H5Screate_simple(3, d3_dims1, NULL); - CHECK(d3_space1, FAIL, "H5Screate"); - d3_space2 = H5Screate_simple(3, d3_dims2, NULL); - CHECK(d3_space2, FAIL, "H5Screate"); - d3_space3 = H5Screate_simple(3, d3_dims1, d3_dims2); - CHECK(d3_space3, FAIL, "H5Screate"); - d3_space4 = H5Screate_simple(3, d3_dims1, d3_dims3); - CHECK(d3_space4, FAIL, "H5Screate"); - - /* Compare all dataspace combinations */ - - /* Compare null dataspace against all others, including itself */ - ext_equal = H5Sextent_equal(null_space, null_space); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(null_space, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare scalar dataspace against all others, including itself */ - ext_equal = H5Sextent_equal(scalar_space, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, scalar_space); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(scalar_space, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare small 1-D dataspace w/no max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d1_space1, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d1_space1); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space1, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare larger 1-D dataspace w/no max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d1_space2, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d1_space2); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space2, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare small 1-D dataspace w/fixed max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d1_space3, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d1_space3); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space3, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare small 1-D dataspace w/unlimited max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d1_space4, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d1_space4); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d1_space4, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare small 2-D dataspace w/no max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d2_space1, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d2_space1); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space1, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare larger 2-D dataspace w/no max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d2_space2, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d2_space2); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space2, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare small 2-D dataspace w/fixed max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d2_space3, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d2_space3); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space3, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare small 2-D dataspace w/unlimited max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d2_space4, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d2_space4); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d2_space4, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare small 3-D dataspace w/no max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d3_space1, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d3_space1); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space1, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare larger 2-D dataspace w/no max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d3_space2, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d3_space2); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space2, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare small 2-D dataspace w/fixed max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d3_space3, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d3_space3); - VERIFY(ext_equal, true, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space3, d3_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - - /* Compare small 2-D dataspace w/unlimited max. dims against all others, including itself */ - ext_equal = H5Sextent_equal(d3_space4, null_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, scalar_space); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d1_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d1_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d1_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d1_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d2_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d2_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d2_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d2_space4); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d3_space1); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d3_space2); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d3_space3); - VERIFY(ext_equal, false, "H5Sextent_equal"); - ext_equal = H5Sextent_equal(d3_space4, d3_space4); - VERIFY(ext_equal, true, "H5Sextent_equal"); - - /* Close dataspaces */ - ret = H5Sclose(null_space); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(scalar_space); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(d1_space1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(d1_space2); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(d1_space3); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(d1_space4); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(d2_space1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(d2_space2); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(d2_space3); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(d2_space4); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(d3_space1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(d3_space2); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(d3_space3); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(d3_space4); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_h5s_extent_equal() */ - -/**************************************************************** -** -** test_h5s_extent_copy(): Exercise extent copy code -** -****************************************************************/ -static void -test_h5s_extent_copy(void) -{ - hid_t spaces[14] = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; /* Array of all dataspaces */ - hid_t tmp_space = -1; - hsize_t d1_dims1[1] = {10}, /* 1-D dimensions */ - d1_dims2[1] = {20}, d1_dims3[1] = {H5S_UNLIMITED}; - hsize_t d2_dims1[2] = {10, 10}, /* 2-D dimensions */ - d2_dims2[2] = {20, 20}, d2_dims3[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; - hsize_t d3_dims1[3] = {10, 10, 10}, /* 3-D dimensions */ - d3_dims2[3] = {20, 20, 20}, d3_dims3[3] = {H5S_UNLIMITED, H5S_UNLIMITED, H5S_UNLIMITED}; - hsize_t npoints[14]; /* Expected number of points in selection for each element in spaces */ - hssize_t npoints_ret; /* Number of points returned by H5Sget_select_npoints() */ - htri_t ext_equal; /* Whether two dataspace extents are equal */ - const unsigned num_spaces = sizeof(spaces) / sizeof(spaces[0]); - unsigned i, j; - herr_t ret; /* Generic error return */ - - /* Create dataspaces */ - spaces[0] = H5Screate(H5S_NULL); - CHECK(spaces[0], FAIL, "H5Screate"); - npoints[0] = (hsize_t)0; - - spaces[1] = H5Screate(H5S_SCALAR); - CHECK(spaces[1], FAIL, "H5Screate"); - npoints[1] = (hsize_t)1; - - spaces[2] = H5Screate_simple(1, d1_dims1, NULL); - CHECK(spaces[2], FAIL, "H5Screate"); - npoints[2] = d1_dims1[0]; - spaces[3] = H5Screate_simple(1, d1_dims2, NULL); - CHECK(spaces[3], FAIL, "H5Screate"); - npoints[3] = d1_dims2[0]; - spaces[4] = H5Screate_simple(1, d1_dims1, d1_dims2); - CHECK(spaces[4], FAIL, "H5Screate"); - npoints[4] = d1_dims1[0]; - spaces[5] = H5Screate_simple(1, d1_dims1, d1_dims3); - CHECK(spaces[5], FAIL, "H5Screate"); - npoints[5] = d1_dims1[0]; - - spaces[6] = H5Screate_simple(2, d2_dims1, NULL); - CHECK(spaces[6], FAIL, "H5Screate"); - npoints[6] = d2_dims1[0] * d2_dims1[1]; - spaces[7] = H5Screate_simple(2, d2_dims2, NULL); - CHECK(spaces[7], FAIL, "H5Screate"); - npoints[7] = d2_dims2[0] * d2_dims2[1]; - spaces[8] = H5Screate_simple(2, d2_dims1, d2_dims2); - CHECK(spaces[8], FAIL, "H5Screate"); - npoints[8] = d2_dims1[0] * d2_dims1[1]; - spaces[9] = H5Screate_simple(2, d2_dims1, d2_dims3); - CHECK(spaces[9], FAIL, "H5Screate"); - npoints[9] = d2_dims1[0] * d2_dims1[1]; - - spaces[10] = H5Screate_simple(3, d3_dims1, NULL); - CHECK(spaces[10], FAIL, "H5Screate"); - npoints[10] = d3_dims1[0] * d3_dims1[1] * d3_dims1[2]; - spaces[11] = H5Screate_simple(3, d3_dims2, NULL); - CHECK(spaces[11], FAIL, "H5Screate"); - npoints[11] = d3_dims2[0] * d3_dims2[1] * d3_dims2[2]; - spaces[12] = H5Screate_simple(3, d3_dims1, d3_dims2); - CHECK(spaces[12], FAIL, "H5Screate"); - npoints[12] = d3_dims1[0] * d3_dims1[1] * d3_dims1[2]; - spaces[13] = H5Screate_simple(3, d3_dims1, d3_dims3); - CHECK(spaces[13], FAIL, "H5Screate"); - npoints[13] = d3_dims1[0] * d3_dims1[1] * d3_dims1[2]; - - tmp_space = H5Screate(H5S_NULL); - CHECK(tmp_space, FAIL, "H5Screate"); - - /* Copy between all dataspace combinations. Note there are a few - * duplicates. */ - for (i = 0; i < num_spaces; i++) - for (j = i; j < num_spaces; j++) { - /* Copy from i to j, unless the inner loop just restarted, in which - * case i and j are the same, so the second call to H5Sextent_copy() - * will test copying from i/j to i/j */ - ret = H5Sextent_copy(tmp_space, spaces[j]); - CHECK(ret, FAIL, "H5Sextent_copy"); - - /* Verify that the extents are equal */ - ext_equal = H5Sextent_equal(tmp_space, spaces[j]); - VERIFY(ext_equal, true, "H5Sextent_equal"); - - /* Verify that the correct number of elements is selected */ - npoints_ret = H5Sget_select_npoints(tmp_space); - VERIFY((hsize_t)npoints_ret, npoints[j], "H5Sget_select_npoints"); - - /* Copy from j to i */ - ret = H5Sextent_copy(tmp_space, spaces[i]); - CHECK(ret, FAIL, "H5Sextent_copy"); - - /* Verify that the extents are equal */ - ext_equal = H5Sextent_equal(tmp_space, spaces[i]); - VERIFY(ext_equal, true, "H5Sextent_equal"); - - /* Verify that the correct number of elements is selected */ - npoints_ret = H5Sget_select_npoints(tmp_space); - VERIFY((hsize_t)npoints_ret, npoints[i], "H5Sget_select_npoints"); - } /* end for */ - - /* Close dataspaces */ - for (i = 0; i < num_spaces; i++) { - ret = H5Sclose(spaces[i]); - CHECK(ret, FAIL, "H5Sclose"); - spaces[i] = -1; - } /* end for */ - - ret = H5Sclose(tmp_space); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_h5s_extent_copy() */ - -/**************************************************************** -** -** test_h5s_bug1(): Test Creating dataspace with H5Screate then -* setting extent with H5Sextent_copy. -** -****************************************************************/ -static void -test_h5s_bug1(void) -{ - hid_t space1; /* Dataspace to copy extent to */ - hid_t space2; /* Scalar dataspace */ - hsize_t dims[2] = {10, 10}; /* Dimensions */ - hsize_t start[2] = {0, 0}; /* Hyperslab start */ - htri_t select_valid; /* Whether the dataspace selection is valid */ - herr_t ret; /* Generic error return */ - - /* Create dataspaces */ - space1 = H5Screate(H5S_SIMPLE); - CHECK(space1, FAIL, "H5Screate"); - space2 = H5Screate_simple(2, dims, NULL); - CHECK(space2, FAIL, "H5Screate"); - - /* Copy extent to space1 */ - ret = H5Sextent_copy(space1, space2); - CHECK(ret, FAIL, "H5Sextent_copy"); - - /* Select hyperslab in space1 containing entire extent */ - ret = H5Sselect_hyperslab(space1, H5S_SELECT_SET, start, NULL, dims, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Check that space1's selection is valid */ - select_valid = H5Sselect_valid(space1); - CHECK(select_valid, FAIL, "H5Sselect_valid"); - VERIFY(select_valid, true, "H5Sselect_valid result"); - - /* Close dataspaces */ - ret = H5Sclose(space1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(space2); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_h5s_bug1() */ - -/**************************************************************** -** -** test_h5s_bug2(): Test combining hyperslabs in a way that used -** to trip up H5S__hyper_update_diminfo() -** -****************************************************************/ -static void -test_h5s_bug2(void) -{ - hid_t space; /* Dataspace to copy extent to */ - hsize_t dims[2] = {1, 5}; /* Dimensions */ - hsize_t start[2] = {0, 0}; /* Hyperslab start */ - hsize_t count[2] = {1, 1}; /* Hyperslab start */ - htri_t select_valid; /* Whether the dataspace selection is valid */ - hssize_t elements_selected; /* Number of elements selected */ - herr_t ret; /* Generic error return */ - - /* Create dataspace */ - space = H5Screate_simple(2, dims, NULL); - CHECK(space, FAIL, "H5Screate"); - - /* Select hyperslab in space containing first element */ - ret = H5Sselect_hyperslab(space, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Add hyperslab in space containing last element */ - start[1] = 4; - ret = H5Sselect_hyperslab(space, H5S_SELECT_OR, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Add hyperslab in space containing the first 3 elements */ - start[1] = 0; - count[1] = 3; - ret = H5Sselect_hyperslab(space, H5S_SELECT_OR, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Check that space's selection is valid */ - select_valid = H5Sselect_valid(space); - CHECK(select_valid, FAIL, "H5Sselect_valid"); - VERIFY(select_valid, true, "H5Sselect_valid result"); - - /* Check that 4 elements are selected */ - elements_selected = H5Sget_select_npoints(space); - CHECK(elements_selected, FAIL, "H5Sselect_valid"); - VERIFY(elements_selected, 4, "H5Sselect_valid result"); - - /* Close dataspaces */ - ret = H5Sclose(space); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_h5s_bug2() */ - -/*------------------------------------------------------------------------- - * Function: test_versionbounds - * - * Purpose: Tests version bounds with dataspace. - * - * Description: - * This function creates a file with lower bounds then later - * reopens it with higher bounds to show that the dataspace - * version is upgraded appropriately. - * - * Return: Success: 0 - * Failure: number of errors - * - *------------------------------------------------------------------------- - */ -#define VERBFNAME "tverbounds_dspace.h5" -#define BASIC_DSET "Basic Dataset" -#define LATEST_DSET "Latest Dataset" -static void -test_versionbounds(void) -{ - hid_t file = -1; /* File ID */ - hid_t space = -1; /* Dataspace ID */ - hid_t dset = -1; /* Dataset ID */ - hid_t fapl = -1; /* File access property list ID */ - hid_t dset_space = -1; /* Retrieved dataset's dataspace ID */ - hsize_t dim[1]; /* Dataset dimensions */ - H5F_libver_t low, high; /* File format bounds */ -#if 0 - H5S_t *spacep = NULL; /* Pointer to internal dataspace */ -#endif - herr_t ret = 0; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Version Bounds\n")); - - /* Create a file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Create dataspace */ - dim[0] = 10; - space = H5Screate_simple(1, dim, NULL); - CHECK(space, FAIL, "H5Screate"); -#if 0 - /* Its version should be H5O_SDSPACE_VERSION_1 */ - spacep = (H5S_t *)H5I_object(space); - CHECK_PTR(spacep, "H5I_object"); - VERIFY(spacep->extent.version, H5O_SDSPACE_VERSION_1, "basic dataspace version bound"); -#endif - - /* Set high bound to V18 */ - low = H5F_LIBVER_EARLIEST; - high = H5F_LIBVER_V18; - ret = H5Pset_libver_bounds(fapl, low, high); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Create the file */ - file = H5Fcreate(VERBFNAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - /* Create a basic dataset */ - dset = H5Dcreate2(file, BASIC_DSET, H5T_NATIVE_INT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - if (dset > 0) /* dataset created successfully */ - { - /* Get the internal dataspace pointer */ - dset_space = H5Dget_space(dset); - CHECK(dset_space, FAIL, "H5Dget_space"); -#if 0 - spacep = (H5S_t *)H5I_object(dset_space); - CHECK_PTR(spacep, "H5I_object"); - - /* Dataspace version should remain as H5O_SDSPACE_VERSION_1 */ - VERIFY(spacep->extent.version, H5O_SDSPACE_VERSION_1, "basic dataspace version bound"); -#endif - /* Close dataspace */ - ret = H5Sclose(dset_space); - CHECK(ret, FAIL, "H5Sclose"); - } - - /* Close basic dataset and the file */ - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Set low and high bounds to latest to trigger the increment of the - dataspace version */ - low = H5F_LIBVER_LATEST; - high = H5F_LIBVER_LATEST; - ret = H5Pset_libver_bounds(fapl, low, high); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Reopen the file with new version bounds, LATEST/LATEST */ - file = H5Fopen(VERBFNAME, H5F_ACC_RDWR, fapl); - - /* Create another dataset using the same dspace as the previous dataset */ - dset = H5Dcreate2(file, LATEST_DSET, H5T_NATIVE_INT, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - - /* Dataset created successfully. Verify that dataspace version has been - upgraded per the low bound */ - - /* Get the internal dataspace pointer */ - dset_space = H5Dget_space(dset); - CHECK(dset_space, FAIL, "H5Dget_space"); -#if 0 - spacep = (H5S_t *)H5I_object(dset_space); - CHECK_PTR(spacep, "H5I_object"); - - /* Verify the dataspace version */ - VERIFY(spacep->extent.version, H5O_sdspace_ver_bounds[low], "upgraded dataspace version"); -#endif - /* Close everything */ - ret = H5Sclose(dset_space); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(space); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_versionbounds() */ - -/**************************************************************** -** -** test_h5s(): Main H5S (dataspace) testing routine. -** -****************************************************************/ -void -test_h5s(void) -{ - H5F_libver_t low, high; /* Low and high bounds */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dataspaces\n")); - - test_h5s_basic(); /* Test basic H5S code */ - test_h5s_null(); /* Test Null dataspace H5S code */ - test_h5s_zero_dim(); /* Test dataspace with zero dimension size */ -#if 0 - /* Loop through all the combinations of low/high version bounds */ - for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) { - for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) { - - /* Invalid combinations, just continue */ - if (high == H5F_LIBVER_EARLIEST || high < low) - continue; -#else - low = H5F_LIBVER_LATEST; - high = H5F_LIBVER_LATEST; -#endif - test_h5s_encode(low, high); /* Test encoding and decoding */ - test_h5s_encode_regular_hyper(low, high); /* Test encoding regular hyperslabs */ - test_h5s_encode_irregular_hyper(low, high); /* Test encoding irregular hyperslabs */ - test_h5s_encode_points(low, high); /* Test encoding points */ -#if 0 - } /* end high bound */ - } /* end low bound */ -#endif - test_h5s_encode_length(); /* Test version 2 hyperslab encoding length is correct */ -#ifndef H5_NO_DEPRECATED_SYMBOLS - test_h5s_encode1(); /* Test operations with old API routine (H5Sencode1) */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - - test_h5s_scalar_write(); /* Test scalar H5S writing code */ - test_h5s_scalar_read(); /* Test scalar H5S reading code */ - - test_h5s_compound_scalar_write(); /* Test compound datatype scalar H5S writing code */ - test_h5s_compound_scalar_read(); /* Test compound datatype scalar H5S reading code */ - - /* This test was added later to exercise a bug in chunked I/O */ - test_h5s_chunk(); /* Exercise bug fix for chunked I/O */ - - test_h5s_extent_equal(); /* Test extent comparison code */ - test_h5s_extent_copy(); /* Test extent copy code */ - test_h5s_bug1(); /* Test bug in offset initialization */ - test_h5s_bug2(); /* Test bug found in H5S__hyper_update_diminfo() */ - test_versionbounds(); /* Test version bounds with dataspace */ -} /* test_h5s() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_h5s - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_h5s(void) -{ - H5Fdelete(DATAFILE, H5P_DEFAULT); - H5Fdelete(NULLFILE, H5P_DEFAULT); - H5Fdelete(BASICFILE, H5P_DEFAULT); - H5Fdelete(ZEROFILE, H5P_DEFAULT); - H5Fdelete(VERBFNAME, H5P_DEFAULT); -} diff --git a/test/API/tid.c b/test/API/tid.c deleted file mode 100644 index 649bacb..0000000 --- a/test/API/tid.c +++ /dev/null @@ -1,1413 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* Test user-created identifiers (hid_t's) and identifier types. */ - -#include "testhdf5.h" - -#if 0 -/* Include H5Ipkg.h to calculate max number of groups */ -#define H5I_FRIEND /*suppress error about including H5Ipkg */ -#include "H5Ipkg.h" -#endif - -/* - * Number of bits to use for ID Type in each ID. Increase if more types - * are needed (though this will decrease the number of available IDs per - * type). This is the only number that must be changed since all other bit - * field sizes and masks are calculated from TYPE_BITS. - */ -#define TYPE_BITS 7 -#define TYPE_MASK (((hid_t)1 << TYPE_BITS) - 1) - -#define H5I_MAX_NUM_TYPES TYPE_MASK - -static herr_t -free_wrapper(void *p, void H5_ATTR_UNUSED **_ctx) -{ - free(p); - return SUCCEED; -} - -/* Test basic functionality of registering and deleting types and IDs */ -static int -basic_id_test(void) -{ - H5I_type_t myType = H5I_BADID; - hid_t arrayID = H5I_INVALID_HID; - void *testObj = NULL; - void *testPtr = NULL; - char nameString[10]; - hid_t testID; - ssize_t testSize = -1; - herr_t err; - int num_ref; - hsize_t num_members; - - /* Try to register an ID with fictitious types */ - H5E_BEGIN_TRY - arrayID = H5Iregister((H5I_type_t)420, testObj); - H5E_END_TRY - - VERIFY(arrayID, H5I_INVALID_HID, "H5Iregister"); - if (arrayID != H5I_INVALID_HID) - goto out; - - H5E_BEGIN_TRY - arrayID = H5Iregister((H5I_type_t)-1, testObj); - H5E_END_TRY - - VERIFY(arrayID, H5I_INVALID_HID, "H5Iregister"); - if (arrayID != H5I_INVALID_HID) - goto out; - - /* Try to access IDs with fictitious types */ - H5E_BEGIN_TRY - testPtr = H5Iobject_verify((hid_t)100, (H5I_type_t)0); - H5E_END_TRY - - CHECK_PTR_NULL(testPtr, "H5Iobject_verify"); - if (testPtr != NULL) - goto out; - - H5E_BEGIN_TRY - testPtr = H5Iobject_verify((hid_t)700, (H5I_type_t)700); - H5E_END_TRY - - CHECK_PTR_NULL(testPtr, "H5Iobject_verify"); - if (testPtr != NULL) - goto out; - - /* Register a type */ - myType = H5Iregister_type((size_t)64, 0, free_wrapper); - - CHECK(myType, H5I_BADID, "H5Iregister_type"); - if (myType == H5I_BADID) - goto out; - - /* Register an ID and retrieve the object it points to. - * Once the ID has been registered, testObj will be freed when - * its ID type is destroyed. - */ - testObj = malloc(7 * sizeof(int)); - arrayID = H5Iregister(myType, testObj); - - CHECK(arrayID, H5I_INVALID_HID, "H5Iregister"); - if (arrayID == H5I_INVALID_HID) { - free(testObj); - goto out; - } - - testPtr = (int *)H5Iobject_verify(arrayID, myType); - - CHECK_PTR_EQ(testPtr, testObj, "H5Iobject_verify"); - if (testPtr != testObj) - goto out; - - /* Ensure that H5Iget_file_id and H5Iget_name() fail, since this - * is an hid_t for the wrong kind of object - */ - H5E_BEGIN_TRY - testID = H5Iget_file_id(arrayID); - H5E_END_TRY - - VERIFY(testID, H5I_INVALID_HID, "H5Iget_file_id"); - if (testID != H5I_INVALID_HID) - goto out; - - H5E_BEGIN_TRY - testSize = H5Iget_name(arrayID, nameString, (size_t)9); - H5E_END_TRY - - VERIFY(testSize, -1, "H5Iget_name"); - if (testSize != -1) - goto out; - - /* Make sure H5Iremove_verify catches objects of the wrong type */ - H5E_BEGIN_TRY - testPtr = (int *)H5Iremove_verify(arrayID, (H5I_type_t)0); - H5E_END_TRY - - CHECK_PTR_NULL(testPtr, "H5Iremove_verify"); - if (testPtr != NULL) - goto out; - - H5E_BEGIN_TRY - testPtr = (int *)H5Iremove_verify(arrayID, (H5I_type_t)((int)myType - 1)); - H5E_END_TRY - - CHECK_PTR_NULL(testPtr, "H5Iremove_verify"); - if (testPtr != NULL) - goto out; - - /* Remove an ID and make sure we can't access it */ - testPtr = (int *)H5Iremove_verify(arrayID, myType); - - CHECK_PTR(testPtr, "H5Iremove_verify"); - if (testPtr == NULL) - goto out; - - H5E_BEGIN_TRY - testPtr = (int *)H5Iobject_verify(arrayID, myType); - H5E_END_TRY - - CHECK_PTR_NULL(testPtr, "H5Iobject_verify"); - if (testPtr != NULL) - goto out; - - /* Delete the type and make sure we can't access objects within it */ - arrayID = H5Iregister(myType, testObj); - - err = H5Idestroy_type(myType); - VERIFY(err, 0, "H5Idestroy_type"); - if (err != 0) - goto out; - VERIFY(H5Itype_exists(myType), 0, "H5Itype_exists"); - if (H5Itype_exists(myType) != 0) - goto out; - - H5E_BEGIN_TRY - VERIFY(H5Inmembers(myType, NULL), -1, "H5Inmembers"); - if (H5Inmembers(myType, NULL) != -1) - goto out; - H5E_END_TRY - - /* Register another type and another object in that type */ - myType = H5Iregister_type((size_t)64, 0, free_wrapper); - - CHECK(myType, H5I_BADID, "H5Iregister_type"); - if (myType == H5I_BADID) - goto out; - - /* The memory that testObj pointed to should already have been - * freed when the previous type was destroyed. Allocate new - * memory for it. - */ - testObj = malloc(7 * sizeof(int)); - arrayID = H5Iregister(myType, testObj); - - CHECK(arrayID, H5I_INVALID_HID, "H5Iregister"); - if (arrayID == H5I_INVALID_HID) { - free(testObj); - goto out; - } - - err = H5Inmembers(myType, &num_members); - CHECK(err, -1, "H5Inmembers"); - if (err < 0) - goto out; - VERIFY(num_members, 1, "H5Inmembers"); - if (num_members != 1) - goto out; - - /* Increment references to type and ensure that dec_type_ref - * doesn't destroy the type - */ - num_ref = H5Iinc_type_ref(myType); - VERIFY(num_ref, 2, "H5Iinc_type_ref"); - if (num_ref != 2) - goto out; - num_ref = H5Idec_type_ref(myType); - VERIFY(num_ref, 1, "H5Idec_type_ref"); - if (num_ref != 1) - goto out; - err = H5Inmembers(myType, &num_members); - CHECK(err, -1, "H5Inmembers"); - if (err < 0) - goto out; - VERIFY(num_members, 1, "H5Inmembers"); - if (num_members != 1) - goto out; - - /* This call to dec_type_ref should destroy the type */ - num_ref = H5Idec_type_ref(myType); - VERIFY(num_ref, 0, "H5Idec_type_ref"); - if (num_ref != 0) - goto out; - VERIFY(H5Itype_exists(myType), 0, "H5Itype_exists"); - if (H5Itype_exists(myType) != 0) - goto out; - - H5E_BEGIN_TRY - err = H5Inmembers(myType, &num_members); - if (err >= 0) - goto out; - H5E_END_TRY - - return 0; - -out: - /* Clean up type if it has been allocated and free memory used - * by testObj - */ - if (myType >= 0) - H5Idestroy_type(myType); - - return -1; -} - -/* A dummy search function for the next test */ -static int -test_search_func(void H5_ATTR_UNUSED *ptr1, hid_t H5_ATTR_UNUSED id, void H5_ATTR_UNUSED *ptr2) -{ - return 0; -} - -/* Ensure that public functions cannot access "predefined" ID types */ -static int -id_predefined_test(void) -{ - void *testObj; - hid_t testID; - hid_t typeID = H5I_INVALID_HID; - void *testPtr; - herr_t testErr; - - testObj = malloc(sizeof(int)); - - /* - * Attempt to perform public functions on various library types - */ - - H5E_BEGIN_TRY - testID = H5Iregister(H5I_FILE, testObj); - H5E_END_TRY - - VERIFY(testID, H5I_INVALID_HID, "H5Iregister"); - if (testID != H5I_INVALID_HID) - goto out; - - H5E_BEGIN_TRY - testPtr = H5Isearch(H5I_GENPROP_LST, test_search_func, testObj); - H5E_END_TRY - - CHECK_PTR_NULL(testPtr, "H5Isearch"); - if (testPtr != NULL) - goto out; - - H5E_BEGIN_TRY - testErr = H5Inmembers(H5I_ERROR_STACK, NULL); - H5E_END_TRY - - VERIFY(testErr, -1, "H5Inmembers"); - if (testErr != -1) - goto out; - - H5E_BEGIN_TRY - testErr = H5Iclear_type(H5I_FILE, 0); - H5E_END_TRY - - VERIFY((testErr >= 0), 0, "H5Iclear_type"); - if (testErr >= 0) - goto out; - - H5E_BEGIN_TRY - testErr = H5Idestroy_type(H5I_DATASET); - H5E_END_TRY - - VERIFY((testErr >= 0), 0, "H5Idestroy_type"); - if (testErr >= 0) - goto out; - - H5E_BEGIN_TRY - testErr = H5Itype_exists(H5I_GROUP); - H5E_END_TRY - - VERIFY(testErr, -1, "H5Itype_exists"); - if (testErr != -1) - goto out; - - H5E_BEGIN_TRY - testErr = H5Itype_exists(H5I_ATTR); - H5E_END_TRY - - VERIFY(testErr, -1, "H5Itype_exists"); - if (testErr != -1) - goto out; - - /* - * Create a datatype ID and try to perform illegal functions on it - */ - - typeID = H5Tcreate(H5T_OPAQUE, (size_t)42); - CHECK(typeID, H5I_INVALID_HID, "H5Tcreate"); - if (typeID == H5I_INVALID_HID) - goto out; - - H5E_BEGIN_TRY - testPtr = H5Iremove_verify(typeID, H5I_DATATYPE); - H5E_END_TRY - - CHECK_PTR_NULL(testPtr, "H5Iremove_verify"); - if (testPtr != NULL) - goto out; - - H5E_BEGIN_TRY - testPtr = H5Iobject_verify(typeID, H5I_DATATYPE); - H5E_END_TRY - - CHECK_PTR_NULL(testPtr, "H5Iobject_verify"); - if (testPtr != NULL) - goto out; - - H5Tclose(typeID); - - /* testObj was never registered as an atom, so it will not be - * automatically freed. */ - free(testObj); - return 0; - -out: - if (typeID != H5I_INVALID_HID) - H5Tclose(typeID); - if (testObj != NULL) - free(testObj); - - return -1; -} - -/* Test the H5Iis_valid function */ -static int -test_is_valid(void) -{ - hid_t dtype; /* datatype id */ -#if 0 - int64_t nmembs1; /* number of type memnbers */ - int64_t nmembs2; -#endif - htri_t tri_ret; /* htri_t return value */ -#if 0 - herr_t ret; /* return value */ -#endif - - /* Create a datatype id */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - if (dtype < 0) - goto out; - - /* Check that the ID is valid */ - tri_ret = H5Iis_valid(dtype); - VERIFY(tri_ret, true, "H5Iis_valid"); - if (tri_ret != true) - goto out; -#if 0 /* Cannot call internal APIs and cannot call public H5Inmembers on library types */ - /* Artificially manipulate the reference counts so app_count is 0, and dtype - * appears to be an internal id. This takes advantage of the fact that - * H5Ipkg is included. - */ - ret = H5I_inc_ref(dtype, false); - CHECK(ret, FAIL, "H5I_inc_ref"); - if (ret < 0) - goto out; - ret = H5I_dec_app_ref(dtype); - CHECK(ret, FAIL, "H5I_dec_ref"); - if (ret < 0) - goto out; - - /* Check that dtype is invalid */ - tri_ret = H5Iis_valid(dtype); - VERIFY(tri_ret, false, "H5Iis_valid"); - if (tri_ret != false) - goto out; - - /* Close dtype and verify that it has been closed */ - nmembs1 = H5I_nmembers(H5I_DATATYPE); - CHECK(nmembs1, FAIL, "H5I_nmembers"); - if (nmembs1 < 0) - goto out; - ret = H5I_dec_ref(dtype); - CHECK(ret, FAIL, "H5I_dec_ref"); - if (ret < 0) - goto out; - nmembs2 = H5I_nmembers(H5I_DATATYPE); - VERIFY(nmembs2, nmembs1 - 1, "H5I_nmembers"); - if (nmembs2 != nmembs1 - 1) - goto out; - - /* Check that dtype is invalid */ - tri_ret = H5Iis_valid(dtype); - VERIFY(tri_ret, false, "H5Iis_valid"); - if (tri_ret != false) - goto out; -#endif - /* Check that an id of -1 is invalid */ - tri_ret = H5Iis_valid((hid_t)-1); - VERIFY(tri_ret, false, "H4Iis_valid"); - if (tri_ret != false) - goto out; - - return 0; - -out: - /* Don't attempt to close dtype as we don't know the exact state of the - * reference counts. Every state in this function will be automatically - * closed at library exit anyways, as internal count is never > 1. - */ - return -1; -} - -/* Test the H5Iget_type function */ -static int -test_get_type(void) -{ - hid_t dtype; /* datatype id */ - H5I_type_t type_ret; /* return value */ - - /* Create a datatype id */ - dtype = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype, FAIL, "H5Tcopy"); - if (dtype < 0) - goto out; - - /* Check that the ID is correct */ - type_ret = H5Iget_type(dtype); - VERIFY(type_ret, H5I_DATATYPE, "H5Iget_type"); - if (type_ret == H5I_BADID) - goto out; - - /* Check that the ID is correct */ - type_ret = H5Iget_type((hid_t)H5T_STRING); - VERIFY(type_ret, H5I_BADID, "H5Iget_type"); - if (type_ret != H5I_BADID) - goto out; - - /* Check that the ID is correct */ - type_ret = H5Iget_type((hid_t)-1); - VERIFY(type_ret, H5I_BADID, "H5Iget_type"); - if (type_ret != H5I_BADID) - goto out; - - H5Tclose(dtype); - - return 0; - -out: - if (dtype != H5I_INVALID_HID) - H5Tclose(dtype); - - return -1; -} - -/* Test boundary cases with lots of types */ - -/* Type IDs range from H5I_NTYPES to H5I_MAX_NUM_TYPES. The system will assign */ -/* IDs in sequential order until H5I_MAX_NUM_TYPES IDs have been given out, at which */ -/* point it will search for type IDs that were allocated but have since been */ -/* deleted. */ -/* This test will allocate IDs up to H5I_MAX_NUM_TYPES, ensure that IDs wrap around */ -/* to low values successfully, ensure that an error is thrown when all possible */ -/* type IDs are taken, then ensure that deleting types frees up their IDs. */ -/* Note that this test depends on the implementation of IDs, so may break */ -/* if the implementation changes. */ -/* Also note that if someone else registered a user-defined type and forgot to */ -/* destroy it, this test will mysteriously fail (because it will expect there to */ -/* be one more "free" type ID than there is). */ -/* H5I_NTYPES is defined in h5public.h, H5I_MAX_NUM_TYPES is defined in h5pkg.h */ -static int -test_id_type_list(void) -{ - H5I_type_t startType; /* The first type ID we were assigned in this test */ - H5I_type_t currentType; - H5I_type_t testType; - int i; /* Just a counter variable */ - - startType = H5Iregister_type((size_t)8, 0, free_wrapper); - CHECK(startType, H5I_BADID, "H5Iregister_type"); - if (startType == H5I_BADID) - goto out; - - /* Sanity check */ - if ((int)startType >= H5I_MAX_NUM_TYPES || startType < H5I_NTYPES) { - /* Error condition, throw an error */ - ERROR("H5Iregister_type"); - goto out; - } - /* Create types up to H5I_MAX_NUM_TYPES */ - for (i = startType + 1; i < H5I_MAX_NUM_TYPES; i++) { - currentType = H5Iregister_type((size_t)8, 0, free_wrapper); - CHECK(currentType, H5I_BADID, "H5Iregister_type"); - if (currentType == H5I_BADID) - goto out; - } - - /* Wrap around to low type ID numbers */ - for (i = H5I_NTYPES; i < startType; i++) { - currentType = H5Iregister_type((size_t)8, 0, free_wrapper); - CHECK(currentType, H5I_BADID, "H5Iregister_type"); - if (currentType == H5I_BADID) - goto out; - } - - /* There should be no room at the inn for a new ID type*/ - H5E_BEGIN_TRY - testType = H5Iregister_type((size_t)8, 0, free_wrapper); - H5E_END_TRY - - VERIFY(testType, H5I_BADID, "H5Iregister_type"); - if (testType != H5I_BADID) - goto out; - - /* Now delete a type and try to insert again */ - H5Idestroy_type(H5I_NTYPES); - testType = H5Iregister_type((size_t)8, 0, free_wrapper); - - VERIFY(testType, H5I_NTYPES, "H5Iregister_type"); - if (testType != H5I_NTYPES) - goto out; - - /* Cleanup. Destroy all types. */ - for (i = H5I_NTYPES; i < H5I_MAX_NUM_TYPES; i++) - H5Idestroy_type((H5I_type_t)i); - - return 0; - -out: - /* Cleanup. For simplicity, just destroy all types and ignore errors. */ - H5E_BEGIN_TRY - for (i = H5I_NTYPES; i < H5I_MAX_NUM_TYPES; i++) - H5Idestroy_type((H5I_type_t)i); - H5E_END_TRY - return -1; -} - -/* Test removing ids in callback for H5Iclear_type */ - -/* There was a rare bug where, if an id free callback being called by - * H5I_clear_type() removed another id in that type, a segfault could occur. - * This test tests for that error (and freeing ids "out of order" within - * H5Iclear_type() in general). - * - * NB: RCT = "remove clear type" - */ - -/* Macro definitions */ -#define RCT_MAX_NOBJS 25 /* Maximum number of objects in the list */ -#define RCT_MIN_NOBJS 5 -#define RCT_NITER 50 /* Number of times we cycle through object creation and deletion */ - -/* Structure to hold the master list of objects */ -typedef struct rct_obj_list_t { - - /* Pointer to the objects */ - struct rct_obj_t *objects; - - /* The number of objects in the list */ - long count; - - /* The number of objects in the list that have not been freed */ - long remaining; -} rct_obj_list_t; - -/* Structure for an object */ -typedef struct rct_obj_t { - /* The ID for this object */ - hid_t id; - - /* The number of times this object has been freed */ - int nfrees; - - /* Whether we are currently freeing this object directly - * through H5Idec_ref(). - */ - bool freeing; - - /* Pointer to the master list of all objects */ - rct_obj_list_t *list; -} rct_obj_t; - -/* Free callback passed to H5Iclear_type() - * - * When invoked on a closing object, frees a random unfreed ID in the - * master list of objects. - */ -static herr_t -rct_free_cb(void *_obj, void H5_ATTR_UNUSED **_ctx) -{ - rct_obj_t *obj = (rct_obj_t *)_obj; - long remove_nth; - long i; - herr_t ret; - - /* Mark this object as freed */ - obj->nfrees++; - - /* Decrement the number of objects in the list that have not been freed */ - obj->list->remaining--; - - /* If this object isn't already being freed by a callback free call and - * the master object list still contains objects to free, pick another - * object and free it. - */ - if (!obj->freeing && (obj->list->remaining > 0)) { - - /* Pick a random object from the list. This is done by picking a - * random number between 0 and the # of remaining unfreed objects - * and then scanning through the list to find that nth unfreed - * object. - */ - remove_nth = HDrandom() % obj->list->remaining; - for (i = 0; i < obj->list->count; i++) - if (obj->list->objects[i].nfrees == 0) { - if (remove_nth == 0) - break; - else - remove_nth--; - } - - /* Badness if we scanned through the list and didn't manage to - * select one to delete (the list stats were probably updated - * incorrectly). - */ - if (i == obj->list->count) { - ERROR("invalid obj_list"); - goto error; - } - - /* Mark the object we're about to free so its own callback does - * not free another object. We don't want to recursively free the - * entire list when we free the first ID. - */ - obj->list->objects[i].freeing = true; - - /* Decrement the reference count on the object */ - ret = H5Idec_ref(obj->list->objects[i].id); - CHECK(ret, FAIL, "H5Idec_ref"); - if (ret == FAIL) - goto error; - - /* Unset the "freeing" flag */ - obj->list->objects[i].freeing = false; - } - - /* Verify the number of objects remaining in the master list is non-negative */ - if (obj->list->remaining < 0) { - ERROR("invalid number of objects remaining"); - goto error; - } - - return 0; - -error: - return -1; -} /* end rct_free_cb() */ - -/* Test function */ -static int -test_remove_clear_type(void) -{ - H5I_type_t obj_type; - rct_obj_list_t obj_list; - rct_obj_t *objects = NULL; /* Convenience pointer to objects stored in master list */ - size_t list_size; - long i, j; - herr_t ret; /* return value */ - - /* Register a user-defined type with our custom ID-deleting callback */ - obj_type = H5Iregister_type((size_t)8, 0, rct_free_cb); - CHECK(obj_type, H5I_BADID, "H5Iregister_type"); - if (obj_type == H5I_BADID) - goto error; - - /* Create an array to hold the objects in the master list */ - list_size = RCT_MAX_NOBJS * sizeof(rct_obj_t); - obj_list.objects = malloc(list_size); - CHECK_PTR(obj_list.objects, "calloc"); - if (NULL == obj_list.objects) - goto error; - - /* Set a convenience pointer to the object array */ - objects = obj_list.objects; - - for (i = 0; i < RCT_NITER; i++) { - - /* The number of members in the type, according to the HDF5 library */ - hsize_t nmembers = 1234567; /* (init to fake number) */ - - /* The number of objects found while scanning through the object list */ - int found; - - /********************* - * Build object list * - *********************/ - - memset(obj_list.objects, 0, list_size); - - /* The number of objects used is a random number between the min and max */ - obj_list.count = obj_list.remaining = - RCT_MIN_NOBJS + (HDrandom() % (long)(RCT_MAX_NOBJS - RCT_MIN_NOBJS + 1)); - - /* Create the actual objects */ - for (j = 0; j < obj_list.count; j++) { - - /* Object setup */ - objects[j].nfrees = 0; - objects[j].freeing = false; - objects[j].list = &obj_list; - - /* Register an ID for it */ - objects[j].id = H5Iregister(obj_type, &objects[j]); - CHECK(objects[j].id, FAIL, "H5Iregister"); - if (objects[j].id == FAIL) - goto error; - - /* Bump the reference count by 1 (to 2) 50% of the time */ - if (HDrandom() % 2) { - ret = H5Iinc_ref(objects[j].id); - CHECK(ret, FAIL, "H5Iinc_ref"); - if (ret == FAIL) - goto error; - } - } - - /****************************************** - * Clear the type with force set to false * - ******************************************/ - - /* Clear the type. Since force is false, only - * IDs with a reference count of 1 will be cleared. - */ - ret = H5Iclear_type(obj_type, false); - CHECK(ret, FAIL, "H5Iclear_type"); - if (ret == FAIL) - goto error; - - /* Verify that the object struct fields are sane and count the - * number of unfreed objects - */ - found = 0; - for (j = 0; j < obj_list.count; j++) { - - if (objects[j].nfrees == 0) { - /* Count unfreed objects */ - found++; - } - else { - /* Every freed object should have been freed exactly once */ - VERIFY(objects[j].nfrees, 1, "object freed more than once"); - if (objects[j].nfrees != 1) - goto error; - } - - /* No object should still be marked as "freeing" */ - VERIFY(objects[j].freeing, false, "object marked as freeing"); - if (objects[j].freeing != false) - goto error; - } - - /* Verify the number of unfreed objects we found during our scan - * matches the number stored in the list - */ - VERIFY(obj_list.remaining, found, "incorrect number of objects remaining"); - if (obj_list.remaining != found) - goto error; - - /* Make sure the HDF5 library confirms our count */ - ret = H5Inmembers(obj_type, &nmembers); - CHECK(ret, FAIL, "H5Inmembers"); - if (ret == FAIL) - goto error; - VERIFY(nmembers, found, "The number of members remaining in the type did not match our count"); - if (nmembers != (hsize_t)found) - goto error; - - /***************************************** - * Clear the type with force set to true * - *****************************************/ - - /* Clear the type. Since force is true, all IDs will be cleared. */ - ret = H5Iclear_type(obj_type, true); - CHECK(ret, FAIL, "H5Iclear_type"); - if (ret == FAIL) - goto error; - - /* Verify that the object struct fields are sane */ - for (j = 0; j < obj_list.count; j++) { - - /* Every object should have been freed exactly once */ - VERIFY(objects[j].nfrees, 1, "object freed more than once"); - if (objects[j].nfrees != 1) - goto error; - - /* No object should still be marked as "freeing" */ - VERIFY(objects[j].freeing, false, "object marked as freeing"); - if (objects[j].freeing != false) - goto error; - } - - /* Verify the number of objects is 0 */ - VERIFY(obj_list.remaining, 0, "objects remaining was not zero"); - if (obj_list.remaining != 0) - goto error; - - /* Make sure the HDF5 library confirms zero members in the type */ - ret = H5Inmembers(obj_type, &nmembers); - CHECK(ret, FAIL, "H5Inmembers"); - if (ret == FAIL) - goto error; - VERIFY(nmembers, 0, "The number of members remaining in the type was not zero"); - if (nmembers != 0) - goto error; - } - - /* Destroy the type */ - ret = H5Idestroy_type(obj_type); - CHECK(ret, FAIL, "H5Idestroy_type"); - if (ret == FAIL) - goto error; - - /* Free the object array */ - free(obj_list.objects); - - return 0; - -error: - /* Cleanup. For simplicity, just destroy the types and ignore errors. */ - H5E_BEGIN_TRY - { - H5Idestroy_type(obj_type); - } - H5E_END_TRY - - free(obj_list.objects); - - return -1; -} /* end test_remove_clear_type() */ - -#if defined(H5VL_VERSION) && H5VL_VERSION >= 2 -/* Typedef for future objects */ -typedef struct { - H5I_type_t obj_type; /* ID type for actual object */ -} future_obj_t; - -/* Global (static) future ID object type */ -H5I_type_t future_obj_type_g = H5I_BADID; - -/* Callback to free the actual object for future object test */ -static herr_t -free_actual_object(void *_p, void H5_ATTR_UNUSED **_ctx) -{ - int *p = (int *)_p; - - if (7 != *p) - return FAIL; - - free(p); - - return SUCCEED; -} - -/* Callback to realize a future object */ -static herr_t -realize_future_cb(void *_future_obj, hid_t *actual_id) -{ - future_obj_t *future_obj = (future_obj_t *)_future_obj; /* Future object */ - int *actual_obj; /* Pointer to the actual object */ - - /* Check for bad future object */ - if (NULL == future_obj) - return FAIL; - - /* Determine type of object to realize */ - if (H5I_DATASPACE == future_obj->obj_type) { - hsize_t dims = 13; - - if ((*actual_id = H5Screate_simple(1, &dims, NULL)) < 0) - return FAIL; - } - else if (H5I_DATATYPE == future_obj->obj_type) { - if ((*actual_id = H5Tcopy(H5T_NATIVE_INT)) < 0) - return FAIL; - } - else if (H5I_GENPROP_LST == future_obj->obj_type) { - if ((*actual_id = H5Pcreate(H5P_DATASET_XFER)) < 0) - return FAIL; - } - else { - /* Create a new object (the 'actual object') of the correct type */ - if (NULL == (actual_obj = malloc(sizeof(int)))) - return FAIL; - *actual_obj = 7; - - /* Register actual object of the user-defined type */ - *actual_id = H5Iregister(future_obj->obj_type, actual_obj); - CHECK(*actual_id, FAIL, "H5Iregister"); - if (*actual_id == FAIL) - return FAIL; - } - - return SUCCEED; -} - -/* Callback to discard a future object */ -static herr_t -discard_future_cb(void *future_obj) -{ - if (NULL == future_obj) - return FAIL; - - free(future_obj); - - return SUCCEED; -} - -/* Callback to realize a future object when future objects are NULL*/ -static herr_t -realize_future_generate_cb(void *_future_obj, hid_t *actual_id) -{ - future_obj_t *future_obj = (future_obj_t *)_future_obj; /* Future object */ - int *actual_obj; /* Pointer to the actual object */ - - if (NULL != future_obj) - return FAIL; - /* Create a new object (the 'actual object') of the correct type */ - if (NULL == (actual_obj = malloc(sizeof(int)))) - return FAIL; - *actual_obj = 7; - - /* Register actual object without using future object info */ - *actual_id = H5Iregister(future_obj_type_g, actual_obj); - CHECK(*actual_id, FAIL, "H5Iregister"); - if (*actual_id == FAIL) - return FAIL; - - return SUCCEED; -} - -/* Callback to discard a future object when future objects are NULL */ -static herr_t -discard_future_generate_cb(void *future_obj) -{ - if (NULL != future_obj) - return FAIL; - - return SUCCEED; -} - -/* Test function */ -static int -test_future_ids(void) -{ - H5I_type_t obj_type; /* New user-defined ID type */ - hid_t future_id; /* ID for future object */ - int fake_future_obj; /* "Fake" future object for tests */ - future_obj_t *future_obj; /* Future object */ - int *actual_obj; /* Actual object */ - int *actual_obj2; /* Another actual object */ - H5I_type_t id_type; /* Type of ID */ - H5T_class_t type_class; /* Datatype class */ - herr_t ret; /* Return value */ - - /* Register a user-defined type with our custom ID-deleting callback */ - obj_type = H5Iregister_type((size_t)15, 0, free_actual_object); - CHECK(obj_type, H5I_BADID, "H5Iregister_type"); - if (H5I_BADID == obj_type) - goto error; - - /* Test basic error conditions */ - fake_future_obj = 0; - H5E_BEGIN_TRY - { - future_id = H5Iregister_future(obj_type, &fake_future_obj, NULL, NULL); - } - H5E_END_TRY - VERIFY(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID != future_id) - goto error; - - H5E_BEGIN_TRY - { - future_id = H5Iregister_future(obj_type, &fake_future_obj, realize_future_cb, NULL); - } - H5E_END_TRY - VERIFY(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID != future_id) - goto error; - - H5E_BEGIN_TRY - { - future_id = H5Iregister_future(obj_type, &fake_future_obj, NULL, discard_future_cb); - } - H5E_END_TRY - VERIFY(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID != future_id) - goto error; - - H5E_BEGIN_TRY - { - future_id = H5Iregister_future(H5I_BADID, &fake_future_obj, realize_future_cb, discard_future_cb); - } - H5E_END_TRY - VERIFY(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID != future_id) - goto error; - - /* Test base use-case: create a future object and destroy type without - * realizing the future object. - */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = obj_type; - future_id = H5Iregister_future(obj_type, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* Destroy the type */ - ret = H5Idestroy_type(obj_type); - CHECK(ret, FAIL, "H5Idestroy_type"); - if (FAIL == ret) - goto error; - - /* Re-register a user-defined type with our custom ID-deleting callback */ - obj_type = H5Iregister_type((size_t)15, 0, free_actual_object); - CHECK(obj_type, H5I_BADID, "H5Iregister_type"); - if (H5I_BADID == obj_type) - goto error; - - /* Test base use-case: create a future object and realize the actual object. */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = obj_type; - future_id = H5Iregister_future(obj_type, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - actual_obj = H5Iobject_verify(future_id, obj_type); - CHECK_PTR(actual_obj, "H5Iobject_verify"); - if (NULL == actual_obj) - goto error; - VERIFY(*actual_obj, 7, "H5Iobject_verify"); - if (7 != *actual_obj) - goto error; - - /* Retrieve the object again and verify that it's the same actual object */ - actual_obj2 = H5Iobject_verify(future_id, obj_type); - CHECK_PTR(actual_obj2, "H5Iobject_verify"); - if (NULL == actual_obj2) - goto error; - VERIFY(*actual_obj2, 7, "H5Iobject_verify"); - if (7 != *actual_obj2) - goto error; - CHECK_PTR_EQ(actual_obj, actual_obj2, "H5Iobject_verify"); - if (actual_obj != actual_obj2) - goto error; - - /* Destroy the type */ - ret = H5Idestroy_type(obj_type); - CHECK(ret, FAIL, "H5Idestroy_type"); - if (FAIL == ret) - goto error; - - /* Re-register a user-defined type with our custom ID-deleting callback */ - obj_type = H5Iregister_type((size_t)15, 0, free_actual_object); - CHECK(obj_type, H5I_BADID, "H5Iregister_type"); - if (H5I_BADID == obj_type) - goto error; - - /* Set the global future object type */ - future_obj_type_g = obj_type; - - /* Test "actual object generator" use-case: create a future object with - * NULL object pointer, to create new object of predefined type when - * future object is realized. - */ - future_id = H5Iregister_future(obj_type, NULL, realize_future_generate_cb, discard_future_generate_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* Realize the actual object, with will be dynamically allocated within - * the 'realize' callback. - */ - actual_obj = H5Iobject_verify(future_id, obj_type); - CHECK_PTR(actual_obj, "H5Iobject_verify"); - if (NULL == actual_obj) - goto error; - VERIFY(*actual_obj, 7, "H5Iobject_verify"); - if (7 != *actual_obj) - goto error; - - /* Reset the global future object type */ - future_obj_type_g = H5I_BADID; - - /* Retrieve the object again and verify that it's the same actual object */ - /* (Will fail if global future object type used) */ - actual_obj2 = H5Iobject_verify(future_id, obj_type); - CHECK_PTR(actual_obj2, "H5Iobject_verify"); - if (NULL == actual_obj2) - goto error; - VERIFY(*actual_obj2, 7, "H5Iobject_verify"); - if (7 != *actual_obj2) - goto error; - CHECK_PTR_EQ(actual_obj, actual_obj2, "H5Iobject_verify"); - if (actual_obj != actual_obj2) - goto error; - - /* Destroy the type */ - ret = H5Idestroy_type(obj_type); - CHECK(ret, FAIL, "H5Idestroy_type"); - if (FAIL == ret) - goto error; - - /* Test base use-case: create a future object for a pre-defined type */ - /* (DATASPACE) */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = H5I_DATASPACE; - future_id = H5Iregister_future(H5I_DATASPACE, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* (Can't verify the type of the future ID, because the library's current - * implementation realizes the object during sanity checks on the ID) - */ - - /* Close future object for pre-defined type without realizing it */ - ret = H5Idec_ref(future_id); - CHECK(ret, FAIL, "H5Idec_ref"); - if (FAIL == ret) - goto error; - - /* Test base use-case: create a future object for a pre-defined type */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = H5I_DATASPACE; - future_id = H5Iregister_future(H5I_DATASPACE, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* Verify that the application believes the future ID is a dataspace */ - /* (Currently realizes the object "implicitly" during a sanity check) */ - id_type = H5Iget_type(future_id); - CHECK(id_type, H5I_BADID, "H5Iget_type"); - if (H5I_BADID == id_type) - goto error; - if (H5I_DATASPACE != id_type) - goto error; - - /* Close future object for pre-defined type without realizing it */ - ret = H5Idec_ref(future_id); - CHECK(ret, FAIL, "H5Idec_ref"); - if (FAIL == ret) - goto error; - - /* Test base use-case: create a future object for a pre-defined type */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = H5I_DATASPACE; - future_id = H5Iregister_future(H5I_DATASPACE, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* Realize future dataspace by requesting its rank */ - ret = H5Sget_simple_extent_ndims(future_id); - CHECK(ret, FAIL, "H5Sget_simple_extent_ndims"); - if (FAIL == ret) - goto error; - if (1 != ret) - goto error; - - /* Verify that the application believes the ID is still a dataspace */ - id_type = H5Iget_type(future_id); - CHECK(id_type, H5I_BADID, "H5Iget_type"); - if (H5I_BADID == id_type) - goto error; - if (H5I_DATASPACE != id_type) - goto error; - - /* Close future object for pre-defined type after realizing it */ - ret = H5Idec_ref(future_id); - CHECK(ret, FAIL, "H5Idec_ref"); - if (FAIL == ret) - goto error; - - /* Test base use-case: create a future object for a pre-defined type */ - /* (DATATYPE) */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = H5I_DATATYPE; - future_id = H5Iregister_future(H5I_DATATYPE, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* (Can't verify the type of the future ID, because the library's current - * implementation realizes the object during sanity checks on the ID) - */ - - /* Close future object for pre-defined type without realizing it */ - ret = H5Idec_ref(future_id); - CHECK(ret, FAIL, "H5Idec_ref"); - if (FAIL == ret) - goto error; - - /* Test base use-case: create a future object for a pre-defined type */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = H5I_DATATYPE; - future_id = H5Iregister_future(H5I_DATATYPE, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* Verify that the application believes the future ID is a datatype */ - /* (Currently realizes the object "implicitly" during a sanity check) */ - id_type = H5Iget_type(future_id); - CHECK(id_type, H5I_BADID, "H5Iget_type"); - if (H5I_BADID == id_type) - goto error; - if (H5I_DATATYPE != id_type) - goto error; - - /* Close future object for pre-defined type without realizing it */ - ret = H5Idec_ref(future_id); - CHECK(ret, FAIL, "H5Idec_ref"); - if (FAIL == ret) - goto error; - - /* Test base use-case: create a future object for a pre-defined type */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = H5I_DATATYPE; - future_id = H5Iregister_future(H5I_DATATYPE, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* Realize future datatype by requesting its class */ - type_class = H5Tget_class(future_id); - CHECK(ret, FAIL, "H5Tget_class"); - if (FAIL == ret) - goto error; - if (H5T_INTEGER != type_class) - goto error; - - /* Verify that the application believes the ID is still a datatype */ - id_type = H5Iget_type(future_id); - CHECK(id_type, H5I_BADID, "H5Iget_type"); - if (H5I_BADID == id_type) - goto error; - if (H5I_DATATYPE != id_type) - goto error; - - /* Close future object for pre-defined type after realizing it */ - ret = H5Idec_ref(future_id); - CHECK(ret, FAIL, "H5Idec_ref"); - if (FAIL == ret) - goto error; - - /* Test base use-case: create a future object for a pre-defined type */ - /* (PROPERTY LIST) */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = H5I_GENPROP_LST; - future_id = H5Iregister_future(H5I_GENPROP_LST, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* (Can't verify the type of the future ID, because the library's current - * implementation realizes the object during sanity checks on the ID) - */ - - /* Close future object for pre-defined type without realizing it */ - ret = H5Idec_ref(future_id); - CHECK(ret, FAIL, "H5Idec_ref"); - if (FAIL == ret) - goto error; - - /* Test base use-case: create a future object for a pre-defined type */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = H5I_GENPROP_LST; - future_id = H5Iregister_future(H5I_GENPROP_LST, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* Verify that the application believes the future ID is a property list */ - /* (Currently realizes the object "implicitly" during a sanity check) */ - id_type = H5Iget_type(future_id); - CHECK(id_type, H5I_BADID, "H5Iget_type"); - if (H5I_BADID == id_type) - goto error; - if (H5I_GENPROP_LST != id_type) - goto error; - - /* Close future object for pre-defined type without realizing it */ - ret = H5Idec_ref(future_id); - CHECK(ret, FAIL, "H5Idec_ref"); - if (FAIL == ret) - goto error; - - /* Test base use-case: create a future object for a pre-defined type */ - future_obj = malloc(sizeof(future_obj_t)); - future_obj->obj_type = H5I_GENPROP_LST; - future_id = H5Iregister_future(H5I_GENPROP_LST, future_obj, realize_future_cb, discard_future_cb); - CHECK(future_id, H5I_INVALID_HID, "H5Iregister_future"); - if (H5I_INVALID_HID == future_id) - goto error; - - /* Realize future property list by verifying its class */ - ret = H5Pisa_class(future_id, H5P_DATASET_XFER); - CHECK(ret, FAIL, "H5Pisa_class"); - if (FAIL == ret) - goto error; - if (true != ret) - goto error; - - /* Verify that the application believes the ID is still a property list */ - id_type = H5Iget_type(future_id); - CHECK(id_type, H5I_BADID, "H5Iget_type"); - if (H5I_BADID == id_type) - goto error; - if (H5I_GENPROP_LST != id_type) - goto error; - - /* Close future object for pre-defined type after realizing it */ - ret = H5Idec_ref(future_id); - CHECK(ret, FAIL, "H5Idec_ref"); - if (FAIL == ret) - goto error; - - return 0; - -error: - /* Cleanup. For simplicity, just destroy the types and ignore errors. */ - H5E_BEGIN_TRY - { - H5Idestroy_type(obj_type); - } - H5E_END_TRY - - return -1; -} /* end test_future_ids() */ -#endif - -void -test_ids(void) -{ - /* Set the random # seed */ - HDsrandom((unsigned)HDtime(NULL)); - - if (basic_id_test() < 0) - TestErrPrintf("Basic ID test failed\n"); - if (id_predefined_test() < 0) - TestErrPrintf("Predefined ID type test failed\n"); - if (test_is_valid() < 0) - TestErrPrintf("H5Iis_valid test failed\n"); - if (test_get_type() < 0) - TestErrPrintf("H5Iget_type test failed\n"); - if (test_id_type_list() < 0) - TestErrPrintf("ID type list test failed\n"); - if (test_remove_clear_type() < 0) - TestErrPrintf("ID remove during H5Iclear_type test failed\n"); -#if defined(H5VL_VERSION) && H5VL_VERSION >= 2 - if (test_future_ids() < 0) - TestErrPrintf("Future ID test failed\n"); -#endif -} diff --git a/test/API/titerate.c b/test/API/titerate.c deleted file mode 100644 index 5e6ce36..0000000 --- a/test/API/titerate.c +++ /dev/null @@ -1,1260 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: titerate - * - * Test the Group & Attribute functionality - * - *************************************************************/ - -#include "testhdf5.h" -/* #include "H5srcdir.h" */ - -#define DATAFILE "titerate.h5" - -/* Number of datasets for group iteration test */ -#define NDATASETS 50 - -/* Number of attributes for attribute iteration test */ -#define NATTR 50 - -/* Number of groups for second group iteration test */ -#define ITER_NGROUPS 150 - -/* General maximum length of names used */ -#define NAMELEN 80 - -/* 1-D dataset with fixed dimensions */ -#define SPACE1_RANK 1 -#define SPACE1_DIM1 4 - -typedef enum { RET_ZERO, RET_TWO, RET_CHANGE, RET_CHANGE2 } iter_enum; - -/* Custom group iteration callback data */ -typedef struct { - char name[NAMELEN]; /* The name of the object */ - H5O_type_t type; /* The type of the object */ - iter_enum command; /* The type of return value */ -} iter_info; - -/* Definition for test_corrupted_attnamelen */ -#define CORRUPTED_ATNAMELEN_FILE "memleak_H5O_dtype_decode_helper_H5Odtype.h5" -#define DSET_NAME "image" -typedef struct searched_err_t { - char message[256]; - bool found; -} searched_err_t; -#if 0 -/* Call back function for test_corrupted_attnamelen */ -static int find_err_msg_cb(unsigned n, const H5E_error2_t *err_desc, void *_client_data); -#endif -/* Local functions */ -int iter_strcmp(const void *s1, const void *s2); -int iter_strcmp2(const void *s1, const void *s2); -static herr_t liter_cb(hid_t group, const char *name, const H5L_info2_t *info, void *op_data); -static herr_t liter_cb2(hid_t group, const char *name, const H5L_info2_t *info, void *op_data); -herr_t aiter_cb(hid_t group, const char *name, const H5A_info_t *ainfo, void *op_data); - -/**************************************************************** -** -** iter_strcmp(): String comparison routine for qsort -** -****************************************************************/ -H5_ATTR_PURE int -iter_strcmp(const void *s1, const void *s2) -{ - return (strcmp(*(const char *const *)s1, *(const char *const *)s2)); -} - -/**************************************************************** -** -** liter_cb(): Custom link iteration callback routine. -** -****************************************************************/ -static herr_t -liter_cb(hid_t H5_ATTR_UNUSED group, const char *name, const H5L_info2_t H5_ATTR_UNUSED *link_info, - void *op_data) -{ - iter_info *info = (iter_info *)op_data; - static int count = 0; - static int count2 = 0; - - if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE)) { - SKIPPED(); - printf(" API functions for iterate aren't " - "supported with this connector\n"); - return 1; - } - - strcpy(info->name, name); - - switch (info->command) { - case RET_ZERO: - return (0); - - case RET_TWO: - return (2); - - case RET_CHANGE: - count++; - return (count > 10 ? 1 : 0); - - case RET_CHANGE2: - count2++; - return (count2 > 10 ? 1 : 0); - - default: - printf("invalid iteration command"); - return (-1); - } /* end switch */ -} /* end liter_cb() */ - -/**************************************************************** -** -** test_iter_group(): Test group iteration functionality -** -****************************************************************/ -static void -test_iter_group(hid_t fapl, bool new_format) -{ - hid_t file; /* File ID */ - hid_t dataset; /* Dataset ID */ - hid_t datatype; /* Common datatype ID */ - hid_t filespace; /* Common dataspace ID */ - hid_t root_group, grp; /* Root group ID */ - int i; /* counting variable */ - hsize_t idx; /* Index in the group */ - char name[NAMELEN]; /* temporary name buffer */ - char *lnames[NDATASETS + 2]; /* Names of the links created */ - char dataset_name[NAMELEN]; /* dataset name */ - iter_info info; /* Custom iteration information */ - H5G_info_t ginfo; /* Buffer for querying object's info */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Group Iteration Functionality\n")); - - if ((vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) && (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) && - (vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) && (vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) && - (vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES) && (vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_MORE) && - (vol_cap_flags_g & H5VL_CAP_FLAG_LINK_MORE)) { - /* Create the test file with the datasets */ - file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - /* Test iterating over empty group */ - info.command = RET_ZERO; - idx = 0; - ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info); - VERIFY(ret, SUCCEED, "H5Literate2"); - - datatype = H5Tcopy(H5T_NATIVE_INT); - CHECK(datatype, FAIL, "H5Tcopy"); - - filespace = H5Screate(H5S_SCALAR); - CHECK(filespace, FAIL, "H5Screate"); - - for (i = 0; i < NDATASETS; i++) { - snprintf(name, sizeof(name), "Dataset %d", i); - dataset = H5Dcreate2(file, name, datatype, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Keep a copy of the dataset names around for later */ - lnames[i] = strdup(name); - CHECK_PTR(lnames[i], "strdup"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - } /* end for */ - - /* Create a group and named datatype under root group for testing */ - grp = H5Gcreate2(file, "grp", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Gcreate2"); - - lnames[NDATASETS] = strdup("grp"); - CHECK_PTR(lnames[NDATASETS], "strdup"); - - ret = H5Tcommit2(file, "dtype", datatype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - lnames[NDATASETS + 1] = strdup("dtype"); - CHECK_PTR(lnames[NDATASETS], "strdup"); - - /* Close everything up */ - ret = H5Tclose(datatype); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Sclose(filespace); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Sort the dataset names */ - qsort(lnames, (size_t)(NDATASETS + 2), sizeof(char *), iter_strcmp); - - /* Iterate through the datasets in the root group in various ways */ - file = H5Fopen(DATAFILE, H5F_ACC_RDONLY, fapl); - CHECK(file, FAIL, "H5Fopen"); - - /* These two functions, H5Oget_info_by_idx and H5Lget_name_by_idx, actually - * iterate through B-tree for group members in internal library design. - */ - root_group = H5Gopen2(file, "/", H5P_DEFAULT); - CHECK(root_group, FAIL, "H5Gopen2"); - - ret = H5Gget_info(root_group, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - VERIFY(ginfo.nlinks, (NDATASETS + 2), "H5Gget_info"); - - for (i = 0; i < (int)ginfo.nlinks; i++) { - H5O_info2_t oinfo; /* Object info */ - - ret = (herr_t)H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, - dataset_name, (size_t)NAMELEN, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_name_by_idx"); - - //! [H5Oget_info_by_idx3_snip] - - ret = H5Oget_info_by_idx3(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &oinfo, - H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_idx"); - - //! [H5Oget_info_by_idx3_snip] - - } /* end for */ - - H5E_BEGIN_TRY - { - ret = (herr_t)H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, - (hsize_t)(NDATASETS + 3), dataset_name, (size_t)NAMELEN, - H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Lget_name_by_idx"); - - ret = H5Gclose(root_group); - CHECK(ret, FAIL, "H5Gclose"); - - /* These two functions, H5Oget_info_by_idx and H5Lget_name_by_idx, actually - * iterate through B-tree for group members in internal library design. - * (Same as test above, but with the file ID instead of opening the root group) - */ - ret = H5Gget_info(file, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - VERIFY(ginfo.nlinks, NDATASETS + 2, "H5Gget_info"); - - for (i = 0; i < (int)ginfo.nlinks; i++) { - H5O_info2_t oinfo; /* Object info */ - - ret = (herr_t)H5Lget_name_by_idx(file, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, dataset_name, - (size_t)NAMELEN, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_name_by_idx"); - - ret = H5Oget_info_by_idx3(file, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &oinfo, - H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_idx3"); - } /* end for */ - - H5E_BEGIN_TRY - { - ret = (herr_t)H5Lget_name_by_idx(file, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)(NDATASETS + 3), - dataset_name, (size_t)NAMELEN, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Lget_name_by_idx"); - - /* Test invalid indices for starting iteration */ - info.command = RET_ZERO; - idx = (hsize_t)-1; - H5E_BEGIN_TRY - { - ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Literate2"); - - /* Test skipping exactly as many entries as in the group */ - idx = NDATASETS + 2; - H5E_BEGIN_TRY - { - ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Literate2"); - - /* Test skipping more entries than are in the group */ - idx = NDATASETS + 3; - H5E_BEGIN_TRY - { - ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Literate2"); - - /* Test all objects in group, when callback always returns 0 */ - info.command = RET_ZERO; - idx = 0; - if ((ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) > 0) - TestErrPrintf("Group iteration function didn't return zero correctly!\n"); - - /* Test all objects in group, when callback always returns 1 */ - /* This also tests the "restarting" ability, because the index changes */ - info.command = RET_TWO; - i = 0; - idx = 0; - memset(info.name, 0, NAMELEN); - while ((ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) > 0) { - /* Verify return value from iterator gets propagated correctly */ - VERIFY(ret, 2, "H5Literate2"); - - /* Increment the number of times "2" is returned */ - i++; - - /* Verify that the index is the correct value */ - VERIFY(idx, (hsize_t)i, "H5Literate2"); - if (idx != (hsize_t)i) - break; - if (idx > (NDATASETS + 2)) - TestErrPrintf("Group iteration function walked too far!\n"); - - /* Verify that the correct name is retrieved */ - if (strncmp(info.name, lnames[(size_t)(idx - 1)], NAMELEN) != 0) - TestErrPrintf( - "Group iteration function didn't return name correctly for link - lnames[%u] = '%s'!\n", - (unsigned)(idx - 1), lnames[(size_t)(idx - 1)]); - } /* end while */ - VERIFY(ret, -1, "H5Literate2"); - - if (i != (NDATASETS + 2)) - TestErrPrintf("%u: Group iteration function didn't perform multiple iterations correctly!\n", - __LINE__); - - /* Test all objects in group, when callback changes return value */ - /* This also tests the "restarting" ability, because the index changes */ - info.command = new_format ? RET_CHANGE2 : RET_CHANGE; - i = 0; - idx = 0; - memset(info.name, 0, NAMELEN); - while ((ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) >= 0) { - /* Verify return value from iterator gets propagated correctly */ - VERIFY(ret, 1, "H5Literate2"); - - /* Increment the number of times "1" is returned */ - i++; - - /* Verify that the index is the correct value */ - VERIFY(idx, (hsize_t)(i + 10), "H5Literate2"); - if (idx != (hsize_t)(i + 10)) - break; - if (idx > (NDATASETS + 2)) - TestErrPrintf("Group iteration function walked too far!\n"); - - /* Verify that the correct name is retrieved */ - if (strncmp(info.name, lnames[(size_t)(idx - 1)], NAMELEN) != 0) - TestErrPrintf( - "Group iteration function didn't return name correctly for link - lnames[%u] = '%s'!\n", - (unsigned)(idx - 1), lnames[(size_t)(idx - 1)]); - } /* end while */ - VERIFY(ret, -1, "H5Literate2"); - - if (i != 42 || idx != 52) - TestErrPrintf("%u: Group iteration function didn't perform multiple iterations correctly!\n", - __LINE__); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free the dataset names */ - for (i = 0; i < (NDATASETS + 2); i++) - free(lnames[i]); - } -} /* test_iter_group() */ - -/**************************************************************** -** -** aiter_cb(): Custom group iteration callback routine. -** -****************************************************************/ -herr_t -aiter_cb(hid_t H5_ATTR_UNUSED group, const char *name, const H5A_info_t H5_ATTR_UNUSED *ainfo, void *op_data) -{ - iter_info *info = (iter_info *)op_data; - static int count = 0; - static int count2 = 0; - - strcpy(info->name, name); - - switch (info->command) { - case RET_ZERO: - return (0); - - case RET_TWO: - return (2); - - case RET_CHANGE: - count++; - return (count > 10 ? 1 : 0); - - case RET_CHANGE2: - count2++; - return (count2 > 10 ? 1 : 0); - - default: - printf("invalid iteration command"); - return (-1); - } /* end switch */ -} /* end aiter_cb() */ - -/**************************************************************** -** -** test_iter_attr(): Test attribute iteration functionality -** -****************************************************************/ -static void -test_iter_attr(hid_t fapl, bool new_format) -{ - hid_t file; /* File ID */ - hid_t dataset; /* Common Dataset ID */ - hid_t filespace; /* Common dataspace ID */ - hid_t attribute; /* Attribute ID */ - int i; /* counting variable */ - hsize_t idx; /* Index in the attribute list */ - char name[NAMELEN]; /* temporary name buffer */ - char *anames[NATTR]; /* Names of the attributes created */ - iter_info info; /* Custom iteration information */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Attribute Iteration Functionality\n")); - - if ((vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) && (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) && - (vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) && (vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC)) { - memset(&info, 0, sizeof(iter_info)); - - /* Create the test file with the datasets */ - file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - filespace = H5Screate(H5S_SCALAR); - CHECK(filespace, FAIL, "H5Screate"); - - dataset = - H5Dcreate2(file, "Dataset", H5T_NATIVE_INT, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - for (i = 0; i < NATTR; i++) { - snprintf(name, sizeof(name), "Attribute %02d", i); - attribute = H5Acreate2(dataset, name, H5T_NATIVE_INT, filespace, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attribute, FAIL, "H5Acreate2"); - - /* Keep a copy of the attribute names around for later */ - anames[i] = strdup(name); - CHECK_PTR(anames[i], "strdup"); - - ret = H5Aclose(attribute); - CHECK(ret, FAIL, "H5Aclose"); - } /* end for */ - - /* Close everything up */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(filespace); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Iterate through the attributes on the dataset in various ways */ - file = H5Fopen(DATAFILE, H5F_ACC_RDONLY, fapl); - CHECK(file, FAIL, "H5Fopen"); - - dataset = H5Dopen2(file, "Dataset", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Test invalid indices for starting iteration */ - info.command = RET_ZERO; - - /* Test skipping exactly as many attributes as there are */ - idx = NATTR; - H5E_BEGIN_TRY - { - ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate2"); - - /* Test skipping more attributes than there are */ - idx = NATTR + 1; - H5E_BEGIN_TRY - { - ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate2"); - - /* Test all attributes on dataset, when callback always returns 0 */ - info.command = RET_ZERO; - idx = 0; - if ((ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info)) > 0) - TestErrPrintf("Attribute iteration function didn't return zero correctly!\n"); - - /* Test all attributes on dataset, when callback always returns 2 */ - /* This also tests the "restarting" ability, because the index changes */ - info.command = RET_TWO; - i = 0; - idx = 0; - while ((ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info)) > 0) { - /* Verify return value from iterator gets propagated correctly */ - VERIFY(ret, 2, "H5Aiterate2"); - - /* Increment the number of times "2" is returned */ - i++; - - /* Verify that the index is the correct value */ - VERIFY(idx, (unsigned)i, "H5Aiterate2"); - - /* Don't check name when new format is used */ - if (!new_format) { - /* Verify that the correct name is retrieved */ - if (idx > 0) { - if (strcmp(info.name, anames[(size_t)idx - 1]) != 0) - TestErrPrintf( - "%u: Attribute iteration function didn't set names correctly, info.name = " - "'%s', anames[%u] = '%s'!\n", - __LINE__, info.name, (unsigned)(idx - 1), anames[(size_t)idx - 1]); - } /* end if */ - else - TestErrPrintf("%u: 'idx' was not set correctly!\n", __LINE__); - } /* end if */ - } /* end while */ - VERIFY(ret, -1, "H5Aiterate2"); - if (i != 50 || idx != 50) - TestErrPrintf("%u: Attribute iteration function didn't perform multiple iterations correctly!\n", - __LINE__); - - /* Test all attributes on dataset, when callback changes return value */ - /* This also tests the "restarting" ability, because the index changes */ - info.command = new_format ? RET_CHANGE2 : RET_CHANGE; - i = 0; - idx = 0; - while ((ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, &idx, aiter_cb, &info)) > 0) { - /* Verify return value from iterator gets propagated correctly */ - VERIFY(ret, 1, "H5Aiterate2"); - - /* Increment the number of times "1" is returned */ - i++; - - /* Verify that the index is the correct value */ - VERIFY(idx, (unsigned)i + 10, "H5Aiterate2"); - - /* Don't check name when new format is used */ - if (!new_format) { - /* Verify that the correct name is retrieved */ - if (idx > 0) { - if (strcmp(info.name, anames[(size_t)idx - 1]) != 0) - TestErrPrintf( - "%u: Attribute iteration function didn't set names correctly, info.name = " - "'%s', anames[%u] = '%s'!\n", - __LINE__, info.name, (unsigned)(idx - 1), anames[(size_t)idx - 1]); - } - else - TestErrPrintf("%u: 'idx' was not set correctly!\n", __LINE__); - } /* end if */ - } /* end while */ - VERIFY(ret, -1, "H5Aiterate2"); - if (i != 40 || idx != 50) - TestErrPrintf("%u: Attribute iteration function didn't perform multiple iterations correctly!\n", - __LINE__); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Free the attribute names */ - for (i = 0; i < NATTR; i++) - free(anames[i]); - } -} /* test_iter_attr() */ - -/**************************************************************** -** -** iter_strcmp2(): String comparison routine for qsort -** -****************************************************************/ -H5_ATTR_PURE int -iter_strcmp2(const void *s1, const void *s2) -{ - return (strcmp((const char *)s1, (const char *)s2)); -} /* end iter_strcmp2() */ - -/**************************************************************** -** -** liter_cb2(): Custom link iteration callback routine. -** -****************************************************************/ -static herr_t -liter_cb2(hid_t loc_id, const char *name, const H5L_info2_t H5_ATTR_UNUSED *link_info, void *opdata) -{ - const iter_info *test_info = (const iter_info *)opdata; - H5O_info2_t oinfo; - herr_t ret; /* Generic return value */ - - if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) || !(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_BASIC)) { - SKIPPED(); - printf(" API functions for iterate and basic links aren't " - "supported with this connector\n"); - return 1; - } - - if (strcmp(name, test_info->name) != 0) { - TestErrPrintf("name = '%s', test_info = '%s'\n", name, test_info->name); - return (H5_ITER_ERROR); - } /* end if */ - - /* - * Get type of the object and check it. - */ - ret = H5Oget_info_by_name3(loc_id, name, &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - - if (test_info->type != oinfo.type) { - TestErrPrintf("test_info->type = %d, oinfo.type = %d\n", test_info->type, (int)oinfo.type); - return (H5_ITER_ERROR); - } /* end if */ - - return (H5_ITER_STOP); -} /* liter_cb2() */ - -/**************************************************************** -** -** test_iter_group_large(): Test group iteration functionality -** for groups with large #'s of objects -** -****************************************************************/ -static void -test_iter_group_large(hid_t fapl) -{ - hid_t file; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t group; /* Group ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hsize_t dims[] = {SPACE1_DIM1}; - herr_t ret; /* Generic return value */ - char gname[20]; /* Temporary group name */ - iter_info *names; /* Names of objects in the root group */ - iter_info *curr_name; /* Pointer to the current name in the root group */ - int i; - - /* Compound datatype */ - typedef struct s1_t { - unsigned int a; - unsigned int b; - float c; - } s1_t; - - /* Allocate & initialize array */ - names = (iter_info *)calloc(sizeof(iter_info), (ITER_NGROUPS + 2)); - CHECK_PTR(names, "calloc"); - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Large Group Iteration Functionality\n")); - - if ((vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) && (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) && - (vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) && (vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) && - (vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) { - /* Create file */ - file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid = H5Screate_simple(SPACE1_RANK, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create a bunch of groups */ - for (i = 0; i < ITER_NGROUPS; i++) { - snprintf(gname, sizeof(gname), "Group_%d", i); - - /* Add the name to the list of objects in the root group */ - strcpy(names[i].name, gname); - names[i].type = H5O_TYPE_GROUP; - - /* Create a group */ - group = H5Gcreate2(file, gname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, FAIL, "H5Gcreate2"); - - /* Close a group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - } /* end for */ - - /* Create a dataset */ - dataset = H5Dcreate2(file, "Dataset1", H5T_STD_U32LE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Add the name to the list of objects in the root group */ - strcpy(names[ITER_NGROUPS].name, "Dataset1"); - names[ITER_NGROUPS].type = H5O_TYPE_DATASET; - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close Dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create a datatype */ - tid = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid, FAIL, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid, "b", HOFFSET(s1_t, b), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid, "c", HOFFSET(s1_t, c), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Save datatype for later */ - ret = H5Tcommit2(file, "Datatype1", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Add the name to the list of objects in the root group */ - strcpy(names[ITER_NGROUPS + 1].name, "Datatype1"); - names[ITER_NGROUPS + 1].type = H5O_TYPE_NAMED_DATATYPE; - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Need to sort the names in the root group, cause that's what the library does */ - qsort(names, (size_t)(ITER_NGROUPS + 2), sizeof(iter_info), iter_strcmp2); - - /* Iterate through the file to see members of the root group */ - curr_name = &names[0]; - ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, NULL, liter_cb2, curr_name); - CHECK(ret, FAIL, "H5Literate2"); - for (i = 1; i < 100; i++) { - hsize_t idx = (hsize_t)i; - - curr_name = &names[i]; - ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb2, curr_name); - CHECK(ret, FAIL, "H5Literate2"); - } /* end for */ - - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Release memory */ - free(names); - } -} /* test_iterate_group_large() */ - -/**************************************************************** -** -** test_grp_memb_funcs(): Test group member information -** functionality -** -****************************************************************/ -static void -test_grp_memb_funcs(hid_t fapl) -{ - hid_t file; /* File ID */ - hid_t dataset; /* Dataset ID */ - hid_t datatype; /* Common datatype ID */ - hid_t filespace; /* Common dataspace ID */ - hid_t root_group, grp; /* Root group ID */ - int i; /* counting variable */ - char name[NAMELEN]; /* temporary name buffer */ - char *dnames[NDATASETS + 2]; /* Names of the datasets created */ - char *obj_names[NDATASETS + 2]; /* Names of the objects in group */ - char dataset_name[NAMELEN]; /* dataset name */ - ssize_t name_len; /* Length of object's name */ - H5G_info_t ginfo; /* Buffer for querying object's info */ - herr_t ret = SUCCEED; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Group Member Information Functionality\n")); - - /* Create the test file with the datasets */ - file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - datatype = H5Tcopy(H5T_NATIVE_INT); - CHECK(datatype, FAIL, "H5Tcopy"); - - filespace = H5Screate(H5S_SCALAR); - CHECK(filespace, FAIL, "H5Screate"); - - for (i = 0; i < NDATASETS; i++) { - snprintf(name, sizeof(name), "Dataset %d", i); - dataset = H5Dcreate2(file, name, datatype, filespace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Keep a copy of the dataset names around for later */ - dnames[i] = strdup(name); - CHECK_PTR(dnames[i], "strdup"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - } /* end for */ - - /* Create a group and named datatype under root group for testing */ - grp = H5Gcreate2(file, "grp", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Gcreate2"); - - dnames[NDATASETS] = strdup("grp"); - CHECK_PTR(dnames[NDATASETS], "strdup"); - - ret = H5Tcommit2(file, "dtype", datatype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - dnames[NDATASETS + 1] = strdup("dtype"); - CHECK_PTR(dnames[NDATASETS], "strdup"); - - /* Close everything up */ - ret = H5Tclose(datatype); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Gclose(grp); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Sclose(filespace); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Sort the dataset names */ - qsort(dnames, (size_t)(NDATASETS + 2), sizeof(char *), iter_strcmp); - - /* Iterate through the datasets in the root group in various ways */ - file = H5Fopen(DATAFILE, H5F_ACC_RDONLY, fapl); - CHECK(file, FAIL, "H5Fopen"); - - /* These two functions, H5Oget_info_by_idx and H5Lget_name_by_idx, actually - * iterate through B-tree for group members in internal library design. - */ - root_group = H5Gopen2(file, "/", H5P_DEFAULT); - CHECK(root_group, FAIL, "H5Gopen2"); - - ret = H5Gget_info(root_group, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - VERIFY(ginfo.nlinks, (NDATASETS + 2), "H5Gget_info"); - - for (i = 0; i < (int)ginfo.nlinks; i++) { - H5O_info2_t oinfo; /* Object info */ - - /* Test with NULL for name, to query length */ - name_len = H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, NULL, - (size_t)NAMELEN, H5P_DEFAULT); - CHECK(name_len, FAIL, "H5Lget_name_by_idx"); - - ret = (herr_t)H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, - dataset_name, (size_t)(name_len + 1), H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_name_by_idx"); - - /* Double-check that the length is the same */ - VERIFY(ret, name_len, "H5Lget_name_by_idx"); - - /* Keep a copy of the dataset names around for later */ - obj_names[i] = strdup(dataset_name); - CHECK_PTR(obj_names[i], "strdup"); - - ret = H5Oget_info_by_idx3(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &oinfo, - H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_idx3"); - - if (!strcmp(dataset_name, "grp")) - VERIFY(oinfo.type, H5O_TYPE_GROUP, "H5Lget_name_by_idx"); - if (!strcmp(dataset_name, "dtype")) - VERIFY(oinfo.type, H5O_TYPE_NAMED_DATATYPE, "H5Lget_name_by_idx"); - if (!strncmp(dataset_name, "Dataset", (size_t)7)) - VERIFY(oinfo.type, H5O_TYPE_DATASET, "H5Lget_name_by_idx"); - } /* end for */ - - H5E_BEGIN_TRY - { - ret = - (herr_t)H5Lget_name_by_idx(root_group, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)(NDATASETS + 3), - dataset_name, (size_t)NAMELEN, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Lget_name_by_idx"); - - /* Sort the dataset names */ - qsort(obj_names, (size_t)(NDATASETS + 2), sizeof(char *), iter_strcmp); - - /* Compare object names */ - for (i = 0; i < (int)ginfo.nlinks; i++) { - ret = strcmp(dnames[i], obj_names[i]); - VERIFY(ret, 0, "strcmp"); - } /* end for */ - - ret = H5Gclose(root_group); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free the dataset names */ - for (i = 0; i < (NDATASETS + 2); i++) { - free(dnames[i]); - free(obj_names[i]); - } /* end for */ -} /* test_grp_memb_funcs() */ - -/**************************************************************** -** -** test_links(): Test soft and hard link iteration -** -****************************************************************/ -static void -test_links(hid_t fapl) -{ - hid_t file; /* File ID */ - char obj_name[NAMELEN]; /* Names of the object in group */ - ssize_t name_len; /* Length of object's name */ - hid_t gid, gid1; - H5G_info_t ginfo; /* Buffer for querying object's info */ - hsize_t i; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Soft and Hard Link Iteration Functionality\n")); - - /* Create the test file with the datasets */ - file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - /* create groups */ - gid = H5Gcreate2(file, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - gid1 = H5Gcreate2(file, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gcreate2"); - - /* create soft and hard links to the group "/g1". */ - ret = H5Lcreate_soft("something", gid, "softlink", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - - ret = H5Lcreate_hard(gid, "/g1", H5L_SAME_LOC, "hardlink", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_hard"); - - ret = H5Gget_info(gid, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - VERIFY(ginfo.nlinks, 3, "H5Gget_info"); - - /* Test these two functions, H5Oget_info_by_idx and H5Lget_name_by_idx */ - for (i = 0; i < ginfo.nlinks; i++) { - H5O_info2_t oinfo; /* Object info */ - H5L_info2_t linfo; /* Link info */ - - /* Get link name */ - name_len = H5Lget_name_by_idx(gid, ".", H5_INDEX_NAME, H5_ITER_INC, i, obj_name, (size_t)NAMELEN, - H5P_DEFAULT); - CHECK(name_len, FAIL, "H5Lget_name_by_idx"); - - /* Get link type */ - ret = H5Lget_info_by_idx2(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &linfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info_by_idx2"); - - /* Get object type */ - if (linfo.type == H5L_TYPE_HARD) { - ret = H5Oget_info_by_idx3(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &oinfo, - H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_idx3"); - } /* end if */ - - if (!strcmp(obj_name, "g1.1")) - VERIFY(oinfo.type, H5O_TYPE_GROUP, "H5Lget_name_by_idx"); - else if (!strcmp(obj_name, "hardlink")) - VERIFY(oinfo.type, H5O_TYPE_GROUP, "H5Lget_name_by_idx"); - else if (!strcmp(obj_name, "softlink")) - VERIFY(linfo.type, H5L_TYPE_SOFT, "H5Lget_name_by_idx"); - else - ERROR("unknown object name"); - } /* end for */ - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_links() */ - -/*------------------------------------------------------------------------- - * Function: find_err_msg_cb - * - * Purpose: Callback function to find the given error message. - * Helper function for test_corrupted_attnamelen(). - * - * Return: H5_ITER_STOP when the message is found - * H5_ITER_CONT, otherwise - * - *------------------------------------------------------------------------- - */ -#if 0 -static int -find_err_msg_cb(unsigned H5_ATTR_UNUSED n, const H5E_error2_t *err_desc, void *_client_data) -{ - int status = H5_ITER_CONT; - searched_err_t *searched_err = (searched_err_t *)_client_data; - - if (searched_err == NULL) - return H5_ITER_ERROR; - - /* If the searched error message is found, stop the iteration */ - if (err_desc->desc != NULL && strcmp(err_desc->desc, searched_err->message) == 0) { - searched_err->found = true; - status = H5_ITER_STOP; - } - - return status; -} /* end find_err_msg_cb() */ -#endif - -/************************************************************************** -** -** test_corrupted_attnamelen(): Test the fix for the JIRA issue HDFFV-10588, -** where corrupted attribute's name length can be -** detected and invalid read can be avoided. -** -**************************************************************************/ -#if 0 -static void -test_corrupted_attnamelen(void) -{ - hid_t fid = -1; /* File ID */ - hid_t did = -1; /* Dataset ID */ - searched_err_t err_caught; /* Data to be passed to callback func */ - int err_status; /* Status returned by H5Aiterate2 */ - herr_t ret; /* Return value */ - bool driver_is_default_compatible; - const char *testfile = H5_get_srcdir_filename(CORRUPTED_ATNAMELEN_FILE); /* Corrected test file name */ - - const char *err_message = "attribute name has different length than stored length"; - /* the error message produced when the failure occurs */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing the Handling of Corrupted Attribute's Name Length\n")); - - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); - - if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); - return; - } - - fid = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - did = H5Dopen2(fid, DSET_NAME, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Call H5Aiterate2 to trigger the failure in HDFFV-10588. Failure should - occur in the decoding stage, so some arguments are not needed. */ - err_status = H5Aiterate2(did, H5_INDEX_NAME, H5_ITER_INC, NULL, NULL, NULL); - VERIFY(err_status, FAIL, "H5Aiterate2"); - - /* Make sure the intended error was caught */ - if (err_status == -1) { - /* Initialize client data */ - strcpy(err_caught.message, err_message); - err_caught.found = false; - - /* Look for the correct error message */ - ret = H5Ewalk2(H5E_DEFAULT, H5E_WALK_UPWARD, find_err_msg_cb, &err_caught); - CHECK(ret, FAIL, "H5Ewalk2"); - - /* Fail if the indicated message is not found */ - CHECK(err_caught.found, false, "test_corrupted_attnamelen: Expected error not found"); - } - - /* Close the dataset and file */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* test_corrupted_attnamelen() */ -#endif - -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS -/**************************************************************** -** -** test_links_deprec(): Test soft and hard link iteration -** -****************************************************************/ -static void -test_links_deprec(hid_t fapl) -{ - hid_t file; /* File ID */ - char obj_name[NAMELEN]; /* Names of the object in group */ - ssize_t name_len; /* Length of object's name */ - hid_t gid, gid1; - H5G_info_t ginfo; /* Buffer for querying object's info */ - hsize_t i; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Soft and Hard Link Iteration Functionality Using Deprecated Routines\n")); - - /* Create the test file with the datasets */ - file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - /* create groups */ - gid = H5Gcreate2(file, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - gid1 = H5Gcreate2(file, "/g1/g1.1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gcreate2"); - - /* create soft and hard links to the group "/g1". */ - ret = H5Lcreate_soft("something", gid, "softlink", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - - ret = H5Lcreate_hard(gid, "/g1", H5L_SAME_LOC, "hardlink", H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_hard"); - - ret = H5Gget_info(gid, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - VERIFY(ginfo.nlinks, 3, "H5Gget_info"); - - /* Test these two functions, H5Oget_info_by_idx and H5Lget_name_by_idx */ - for (i = 0; i < ginfo.nlinks; i++) { - H5O_info2_t oinfo; /* Object info */ - H5L_info2_t linfo; /* Link info */ - - /* Get link name */ - name_len = H5Lget_name_by_idx(gid, ".", H5_INDEX_NAME, H5_ITER_INC, i, obj_name, (size_t)NAMELEN, - H5P_DEFAULT); - CHECK(name_len, FAIL, "H5Lget_name_by_idx"); - - /* Get link type */ - ret = H5Lget_info_by_idx2(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &linfo, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lget_info_by_idx1"); - - /* Get object type */ - if (linfo.type == H5L_TYPE_HARD) { - ret = H5Oget_info_by_idx3(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)i, &oinfo, - H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_idx"); - } /* end if */ - - if (!strcmp(obj_name, "g1.1")) - VERIFY(oinfo.type, H5O_TYPE_GROUP, "H5Lget_name_by_idx"); - else if (!strcmp(obj_name, "hardlink")) - VERIFY(oinfo.type, H5O_TYPE_GROUP, "H5Lget_name_by_idx"); - else if (!strcmp(obj_name, "softlink")) - VERIFY(linfo.type, H5L_TYPE_SOFT, "H5Lget_name_by_idx"); - else - ERROR("unknown object name"); - } /* end for */ - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_links_deprec() */ -#endif -#endif - -/**************************************************************** -** -** test_iterate(): Main iteration testing routine. -** -****************************************************************/ -void -test_iterate(void) -{ - hid_t fapl, fapl2; /* File access property lists */ - unsigned new_format; /* Whether to use the new format or not */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Iteration Operations\n")); - - /* Get the default FAPL */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Copy the file access property list */ - fapl2 = H5Pcopy(fapl); - CHECK(fapl2, FAIL, "H5Pcopy"); - - /* Set the "use the latest version of the format" bounds for creating objects in the file */ - ret = H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* These next tests use the same file */ - for (new_format = false; new_format <= true; new_format++) { - test_iter_group(new_format ? fapl2 : fapl, new_format); /* Test group iteration */ - test_iter_group_large(new_format ? fapl2 : fapl); /* Test group iteration for large # of objects */ - test_iter_attr(new_format ? fapl2 : fapl, new_format); /* Test attribute iteration */ - test_grp_memb_funcs(new_format ? fapl2 : fapl); /* Test group member information functions */ - test_links(new_format ? fapl2 : fapl); /* Test soft and hard link iteration */ -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - test_links_deprec(new_format ? fapl2 : fapl); /* Test soft and hard link iteration */ -#endif -#endif - } /* end for */ -#if 0 - /* Test the fix for issue HDFFV-10588 */ - test_corrupted_attnamelen(); -#endif - /* Close FAPLs */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(fapl2); - CHECK(ret, FAIL, "H5Pclose"); -} /* test_iterate() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_iterate - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_iterate(void) -{ - H5Fdelete(DATAFILE, H5P_DEFAULT); -} diff --git a/test/API/tmisc.c b/test/API/tmisc.c deleted file mode 100644 index 4c87425..0000000 --- a/test/API/tmisc.c +++ /dev/null @@ -1,6343 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tmisc - * - * Test miscellaneous features not tested elsewhere. Generally - * regression tests for bugs that are reported and don't - * have an existing test to add them to. - * - *************************************************************/ - -#define H5D_FRIEND /*suppress error about including H5Dpkg */ - -/* Define this macro to indicate that the testing APIs should be available */ -#define H5D_TESTING - -#include "testhdf5.h" -/* #include "H5srcdir.h" */ -/* #include "H5Dpkg.h" */ /* Datasets */ -/* #include "H5MMprivate.h" */ /* Memory */ - -/* Definitions for misc. test #1 */ -#define MISC1_FILE "tmisc1.h5" -#define MISC1_VAL (13417386) /* 0xccbbaa */ -#define MISC1_VAL2 (15654348) /* 0xeeddcc */ -#define MISC1_DSET_NAME "/scalar_set" - -/* Definitions for misc. test #2 */ -#define MISC2_FILE_1 "tmisc2a.h5" -#define MISC2_FILE_2 "tmisc2b.h5" -#define MISC2_ATT_NAME_1 "scalar_att_1" -#define MISC2_ATT_NAME_2 "scalar_att_2" - -typedef struct { - char *string; -} misc2_struct; - -/* Definitions for misc. test #3 */ -#define MISC3_FILE "tmisc3.h5" -#define MISC3_RANK 2 -#define MISC3_DIM1 6 -#define MISC3_DIM2 6 -#define MISC3_CHUNK_DIM1 2 -#define MISC3_CHUNK_DIM2 2 -#define MISC3_FILL_VALUE 2 -#define MISC3_DSET_NAME "/chunked" - -/* Definitions for misc. test #4 */ -#define MISC4_FILE_1 "tmisc4a.h5" -#define MISC4_FILE_2 "tmisc4b.h5" -#define MISC4_GROUP_1 "/Group1" -#define MISC4_GROUP_2 "/Group2" - -/* Definitions for misc. test #5 */ -#define MISC5_FILE "tmisc5.h5" -#define MISC5_DSETNAME "dset1" -#define MISC5_DSETRANK 1 -#define MISC5_NELMTOPLVL 1 -#define MISC5_DBGNELM1 2 -#define MISC5_DBGNELM2 1 -#define MISC5_DBGNELM3 1 -#define MISC5_DBGELVAL1 999999999 -#define MISC5_DBGELVAL2 888888888 -#define MISC5_DBGELVAL3 777777777 - -typedef struct { - int st1_el1; - hvl_t st1_el2; -} misc5_struct1; - -typedef struct { - int st2_el1; - hvl_t st2_el2; -} misc5_struct2; - -typedef struct { - int st3_el1; -} misc5_struct3; - -typedef struct { - hid_t st3h_base; - hid_t st3h_id; -} misc5_struct3_hndl; - -typedef struct { - hid_t st2h_base; - hid_t st2h_id; - misc5_struct3_hndl *st2h_st3hndl; -} misc5_struct2_hndl; - -typedef struct { - hid_t st1h_base; - hid_t st1h_id; - misc5_struct2_hndl *st1h_st2hndl; -} misc5_struct1_hndl; - -/* Definitions for misc. test #6 */ -#define MISC6_FILE "tmisc6.h5" -#define MISC6_DSETNAME1 "dset1" -#define MISC6_DSETNAME2 "dset2" -#define MISC6_NUMATTR 16 - -/* Definitions for misc. test #7 */ -#define MISC7_FILE "tmisc7.h5" -#define MISC7_DSETNAME1 "Dataset1" -#define MISC7_DSETNAME2 "Dataset2" -#define MISC7_TYPENAME1 "Datatype1" -#define MISC7_TYPENAME2 "Datatype2" - -/* Definitions for misc. test #8 */ -#define MISC8_FILE "tmisc8.h5" -#define MISC8_DSETNAME1 "Dataset1" -#define MISC8_DSETNAME4 "Dataset4" -#define MISC8_DSETNAME5 "Dataset5" -#define MISC8_DSETNAME8 "Dataset8" - -#ifndef H5_HAVE_PARALLEL -#define MISC8_DSETNAME2 "Dataset2" -#define MISC8_DSETNAME3 "Dataset3" -#define MISC8_DSETNAME6 "Dataset6" -#define MISC8_DSETNAME7 "Dataset7" -#define MISC8_DSETNAME9 "Dataset9" -#define MISC8_DSETNAME10 "Dataset10" -#endif - -#define MISC8_RANK 2 -#define MISC8_DIM0 50 -#define MISC8_DIM1 50 -#define MISC8_CHUNK_DIM0 10 -#define MISC8_CHUNK_DIM1 10 - -/* Definitions for misc. test #9 */ -#define MISC9_FILE "tmisc9.h5" - -/* Definitions for misc. test #10 */ -#define MISC10_FILE_OLD "tmtimeo.h5" -#define MISC10_FILE_NEW "tmisc10.h5" -#define MISC10_DSETNAME "Dataset1" - -/* Definitions for misc. test #11 */ -#define MISC11_FILE "tmisc11.h5" -#define MISC11_USERBLOCK 1024 -#define MISC11_SIZEOF_OFF 4 -#define MISC11_SIZEOF_LEN 4 -#define MISC11_SYM_LK 8 -#define MISC11_SYM_IK 32 -#define MISC11_ISTORE_IK 64 -#define MISC11_NINDEXES 1 - -/* Definitions for misc. test #12 */ -#define MISC12_FILE "tmisc12.h5" -#define MISC12_DSET_NAME "Dataset" -#define MISC12_SPACE1_RANK 1 -#define MISC12_SPACE1_DIM1 4 -#define MISC12_CHUNK_SIZE 2 -#define MISC12_APPEND_SIZE 5 - -/* Definitions for misc. test #13 */ -#define MISC13_FILE_1 "tmisc13a.h5" -#define MISC13_FILE_2 "tmisc13b.h5" -#define MISC13_DSET1_NAME "Dataset1" -#define MISC13_DSET2_NAME "Dataset2" -#define MISC13_DSET3_NAME "Dataset3" -#define MISC13_GROUP1_NAME "Group1" -#define MISC13_GROUP2_NAME "Group2" -#define MISC13_DTYPE_NAME "Datatype" -#define MISC13_RANK 1 -#define MISC13_DIM1 600 -#define MISC13_CHUNK_DIM1 10 -#define MISC13_USERBLOCK_SIZE 512 -#define MISC13_COPY_BUF_SIZE 4096 - -/* Definitions for misc. test #14 */ -#define MISC14_FILE "tmisc14.h5" -#define MISC14_DSET1_NAME "Dataset1" -#define MISC14_DSET2_NAME "Dataset2" -#define MISC14_DSET3_NAME "Dataset3" -#define MISC14_METADATA_SIZE 4096 - -/* Definitions for misc. test #15 */ -#define MISC15_FILE "tmisc15.h5" -#define MISC15_BUF_SIZE 1024 - -/* Definitions for misc. test #16 */ -#define MISC16_FILE "tmisc16.h5" -#define MISC16_SPACE_DIM 4 -#define MISC16_SPACE_RANK 1 -#define MISC16_STR_SIZE 8 -#define MISC16_DSET_NAME "Dataset" - -/* Definitions for misc. test #17 */ -#define MISC17_FILE "tmisc17.h5" -#define MISC17_SPACE_RANK 2 -#define MISC17_SPACE_DIM1 4 -#define MISC17_SPACE_DIM2 8 -#define MISC17_DSET_NAME "Dataset" - -/* Definitions for misc. test #18 */ -#define MISC18_FILE "tmisc18.h5" -#define MISC18_DSET1_NAME "Dataset1" -#define MISC18_DSET2_NAME "Dataset2" - -/* Definitions for misc. test #19 */ -#define MISC19_FILE "tmisc19.h5" -#define MISC19_DSET_NAME "Dataset" -#define MISC19_ATTR_NAME "Attribute" -#define MISC19_GROUP_NAME "Group" - -/* Definitions for misc. test #20 */ -#define MISC20_FILE "tmisc20.h5" -#define MISC20_FILE_OLD "tlayouto.h5" -#define MISC20_DSET_NAME "Dataset" -#define MISC20_DSET2_NAME "Dataset2" -#define MISC20_SPACE_RANK 2 -/* Make sure the product of the following 2 does not get too close to */ -/* 64 bits, risking an overflow. */ -#define MISC20_SPACE_DIM0 (8 * 1024 * 1024 * (uint64_t)1024) -#define MISC20_SPACE_DIM1 ((256 * 1024 * (uint64_t)1024) + 1) -#define MISC20_SPACE2_DIM0 8 -#define MISC20_SPACE2_DIM1 4 - -#if defined(H5_HAVE_FILTER_SZIP) && !defined(H5_API_TEST_NO_FILTERS) -/* Definitions for misc. test #21 */ -#define MISC21_FILE "tmisc21.h5" -#define MISC21_DSET_NAME "Dataset" -#define MISC21_SPACE_RANK 2 -#define MISC21_SPACE_DIM0 7639 -#define MISC21_SPACE_DIM1 6308 -#define MISC21_CHUNK_DIM0 2048 -#define MISC21_CHUNK_DIM1 2048 - -/* Definitions for misc. test #22 */ -#define MISC22_FILE "tmisc22.h5" -#define MISC22_DSET_NAME "Dataset" -#define MISC22_SPACE_RANK 2 -#define MISC22_CHUNK_DIM0 512 -#define MISC22_CHUNK_DIM1 512 -#define MISC22_SPACE_DIM0 639 -#define MISC22_SPACE_DIM1 1308 -#endif /* H5_HAVE_FILTER_SZIP */ - -/* Definitions for misc. test #23 */ -#define MISC23_FILE "tmisc23.h5" -#define MISC23_NAME_BUF_SIZE 40 - -/* Definitions for misc. test #24 */ -#define MISC24_FILE "tmisc24.h5" -#define MISC24_GROUP_NAME "group" -#define MISC24_GROUP_LINK "group_link" -#define MISC24_DATASET_NAME "dataset" -#define MISC24_DATASET_LINK "dataset_link" -#define MISC24_DATATYPE_NAME "datatype" -#define MISC24_DATATYPE_LINK "datatype_link" - -/* Definitions for misc. test #25 'a', 'b' & 'c' */ -#define MISC25A_FILE "foo.h5" -#define MISC25A_GROUP0_NAME "grp0" -#define MISC25A_GROUP1_NAME "/grp0/grp1" -#define MISC25A_GROUP2_NAME "/grp0/grp2" -#define MISC25A_GROUP3_NAME "/grp0/grp3" -#define MISC25A_ATTR1_NAME "_long attribute_" -#define MISC25A_ATTR1_LEN 11 -#define MISC25A_ATTR2_NAME "_short attr__" -#define MISC25A_ATTR2_LEN 11 -#define MISC25A_ATTR3_NAME "_short attr__" -#define MISC25A_ATTR3_LEN 1 -#define MISC25B_FILE "mergemsg.h5" -#define MISC25B_GROUP "grp1" -#define MISC25C_FILE "nc4_rename.h5" -#define MISC25C_DSETNAME "da" -#define MISC25C_DSETNAME2 "dz" -#define MISC25C_DSETGRPNAME "ga" -#define MISC25C_GRPNAME "gb" -#define MISC25C_GRPNAME2 "gc" -#define MISC25C_ATTRNAME "aa" -#define MISC25C_ATTRNAME2 "ab" - -/* Definitions for misc. test #26 */ -#define MISC26_FILE "dcpl_file" - -/* Definitions for misc. test #27 */ -/* (Note that this test file is generated by the "gen_bad_ohdr.c" code) */ -#define MISC27_FILE "tbad_msg_count.h5" -#define MISC27_GROUP "Group" - -/* Definitions for misc. test #28 */ -#define MISC28_FILE "tmisc28.h5" -#define MISC28_SIZE 10 -#define MISC28_NSLOTS 10000 - -/* Definitions for misc. test #29 */ -#define MISC29_ORIG_FILE "specmetaread.h5" -#define MISC29_COPY_FILE "tmisc29.h5" -#define MISC29_DSETNAME "dset2" - -/* Definitions for misc. test #30 */ -#define MISC30_FILE "tmisc30.h5" - -#ifndef H5_NO_DEPRECATED_SYMBOLS -/* Definitions for misc. test #31 */ -#define MISC31_FILE "tmisc31.h5" -#define MISC31_DSETNAME "dset" -#define MISC31_ATTRNAME1 "attr1" -#define MISC31_ATTRNAME2 "attr2" -#define MISC31_GROUPNAME "group" -#define MISC31_PROPNAME "misc31_prop" -#define MISC31_DTYPENAME "dtype" -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - -/* Definitions for misc. test #33 */ -/* Note that this test file is generated by "gen_bad_offset.c" */ -/* and bad offset values are written to that file for testing */ -#define MISC33_FILE "bad_offset.h5" - -/* Definitions for misc. test #35 */ -#define MISC35_SPACE_RANK 3 -#define MISC35_SPACE_DIM1 3 -#define MISC35_SPACE_DIM2 15 -#define MISC35_SPACE_DIM3 13 -#define MISC35_NPOINTS 10 - -/* Definitions for misc. test #37 */ -/* The test file is formerly named h5_nrefs_POC. - See https://nvd.nist.gov/vuln/detail/CVE-2020-10812 */ -#define CVE_2020_10812_FILENAME "cve_2020_10812.h5" - -#if defined(H5_HAVE_FILTER_SZIP) && !defined(H5_API_TEST_NO_FILTERS) -/*------------------------------------------------------------------------- - * Function: h5_szip_can_encode - * - * Purpose: Retrieve the filter config flags for szip, tell if - * encoder is available. - * - * Return: 1: decode+encode is enabled - * 0: only decode is enabled - * -1: other - *------------------------------------------------------------------------- - */ -int -h5_szip_can_encode(void) -{ - unsigned int filter_config_flags; - - H5Zget_filter_info(H5Z_FILTER_SZIP, &filter_config_flags); - if ((filter_config_flags & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == 0) { - /* filter present but neither encode nor decode is supported (???) */ - return -1; - } - else if ((filter_config_flags & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == - H5Z_FILTER_CONFIG_DECODE_ENABLED) { - /* decoder only: read but not write */ - return 0; - } - else if ((filter_config_flags & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == - H5Z_FILTER_CONFIG_ENCODE_ENABLED) { - /* encoder only: write but not read (???) */ - return -1; - } - else if ((filter_config_flags & (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) == - (H5Z_FILTER_CONFIG_ENCODE_ENABLED | H5Z_FILTER_CONFIG_DECODE_ENABLED)) { - return 1; - } - return (-1); -} -#endif /* H5_HAVE_FILTER_SZIP */ - -/**************************************************************** -** -** test_misc1(): test unlinking a dataset from a group and immediately -** re-using the dataset name -** -****************************************************************/ -static void -test_misc1(void) -{ - int i; - int i_check; - hid_t file, dataspace, dataset; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Unlinking Dataset and Re-creating It\n")); - - file = H5Fcreate(MISC1_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - dataspace = H5Screate(H5S_SCALAR); - CHECK(dataspace, FAIL, "H5Screate"); - - /* Write the dataset the first time. */ - dataset = - H5Dcreate2(file, MISC1_DSET_NAME, H5T_NATIVE_INT, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - i = MISC1_VAL; - ret = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &i); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Remove the dataset. */ - ret = H5Ldelete(file, MISC1_DSET_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Write the dataset for the second time with a different value. */ - dataset = - H5Dcreate2(file, MISC1_DSET_NAME, H5T_NATIVE_INT, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - i = MISC1_VAL2; - ret = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &i); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(dataspace); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Now, check the value written to the dataset, after it was re-created */ - file = H5Fopen(MISC1_FILE, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fopen"); - - dataspace = H5Screate(H5S_SCALAR); - CHECK(dataspace, FAIL, "H5Screate"); - - dataset = H5Dopen2(file, MISC1_DSET_NAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - ret = H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &i_check); - CHECK(ret, FAIL, "H5Dread"); - VERIFY(i_check, MISC1_VAL2, "H5Dread"); - - ret = H5Sclose(dataspace); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_misc1() */ - -static hid_t -misc2_create_type(void) -{ - hid_t type, type_tmp; - herr_t ret; - - type_tmp = H5Tcopy(H5T_C_S1); - CHECK(type_tmp, FAIL, "H5Tcopy"); - - ret = H5Tset_size(type_tmp, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - type = H5Tcreate(H5T_COMPOUND, sizeof(misc2_struct)); - CHECK(type, FAIL, "H5Tcreate"); - - ret = H5Tinsert(type, "string", offsetof(misc2_struct, string), type_tmp); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tclose(type_tmp); - CHECK(ret, FAIL, "H5Tclose"); - - return type; -} - -static void -test_misc2_write_attribute(void) -{ - hid_t file1, file2, root1, root2, dataspace, att1, att2; - hid_t type; - herr_t ret; - misc2_struct data, data_check; - char *string_att1 = strdup("string attribute in file one"); - char *string_att2 = strdup("string attribute in file two"); - - memset(&data, 0, sizeof(data)); - memset(&data_check, 0, sizeof(data_check)); - - type = misc2_create_type(); - - dataspace = H5Screate(H5S_SCALAR); - CHECK(dataspace, FAIL, "H5Screate"); - - file2 = H5Fcreate(MISC2_FILE_2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file2, FAIL, "H5Fcreate"); - - file1 = H5Fcreate(MISC2_FILE_1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file1, FAIL, "H5Fcreate"); - - root1 = H5Gopen2(file1, "/", H5P_DEFAULT); - CHECK(root1, FAIL, "H5Gopen2"); - - att1 = H5Acreate2(root1, MISC2_ATT_NAME_1, type, dataspace, H5P_DEFAULT, H5P_DEFAULT); - CHECK(att1, FAIL, "H5Acreate2"); - - data.string = string_att1; - - ret = H5Awrite(att1, type, &data); - CHECK(ret, FAIL, "H5Awrite"); - - ret = H5Aread(att1, type, &data_check); - CHECK(ret, FAIL, "H5Aread"); - - ret = H5Treclaim(type, dataspace, H5P_DEFAULT, &data_check); - CHECK(ret, FAIL, "H5Treclaim"); - - ret = H5Aclose(att1); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(root1); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(file1); - CHECK(ret, FAIL, "H5Fclose"); - - root2 = H5Gopen2(file2, "/", H5P_DEFAULT); - CHECK(root2, FAIL, "H5Gopen2"); - - att2 = H5Acreate2(root2, MISC2_ATT_NAME_2, type, dataspace, H5P_DEFAULT, H5P_DEFAULT); - CHECK(att2, FAIL, "H5Acreate2"); - - data.string = string_att2; - - ret = H5Awrite(att2, type, &data); - CHECK(ret, FAIL, "H5Awrite"); - - ret = H5Aread(att2, type, &data_check); - CHECK(ret, FAIL, "H5Aread"); - - ret = H5Treclaim(type, dataspace, H5P_DEFAULT, &data_check); - CHECK(ret, FAIL, "H5Treclaim"); - - ret = H5Aclose(att2); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Gclose(root2); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Sclose(dataspace); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file2); - CHECK(ret, FAIL, "H5Fclose"); - - free(string_att1); - free(string_att2); -} - -static void -test_misc2_read_attribute(const char *filename, const char *att_name) -{ - hid_t file, root, att; - hid_t type; - hid_t space; - herr_t ret; - misc2_struct data_check; - - type = misc2_create_type(); - - file = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fopen"); - - root = H5Gopen2(file, "/", H5P_DEFAULT); - CHECK(root, FAIL, "H5Gopen2"); - - att = H5Aopen(root, att_name, H5P_DEFAULT); - CHECK(att, FAIL, "H5Aopen"); - - space = H5Aget_space(att); - CHECK(space, FAIL, "H5Aget_space"); - - ret = H5Aread(att, type, &data_check); - CHECK(ret, FAIL, "H5Aread"); - - ret = H5Treclaim(type, space, H5P_DEFAULT, &data_check); - CHECK(ret, FAIL, "H5Treclaim"); - - ret = H5Sclose(space); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Aclose(att); - CHECK(ret, FAIL, "H5Aclose"); - - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Gclose(root); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} -/**************************************************************** -** -** test_misc2(): test using the same VL-derived datatype in two -** different files, which was causing problems with the -** datatype conversion functions -** -****************************************************************/ -static void -test_misc2(void) -{ - /* Output message about test being performed */ - MESSAGE(5, ("Testing VL datatype in two different files\n")); - - test_misc2_write_attribute(); - test_misc2_read_attribute(MISC2_FILE_1, MISC2_ATT_NAME_1); - test_misc2_read_attribute(MISC2_FILE_2, MISC2_ATT_NAME_2); -} /* end test_misc2() */ - -/**************************************************************** -** -** test_misc3(): Test reading from chunked dataset with non-zero -** fill value -** -****************************************************************/ -static void -test_misc3(void) -{ - hid_t file, dataspace, dataset, dcpl; - int rank = MISC3_RANK; - hsize_t dims[MISC3_RANK] = {MISC3_DIM1, MISC3_DIM2}; - hsize_t chunk_dims[MISC3_RANK] = {MISC3_CHUNK_DIM1, MISC3_CHUNK_DIM2}; - int fill = MISC3_FILL_VALUE; - int read_buf[MISC3_DIM1][MISC3_DIM2]; - int i, j; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing reading from chunked dataset with non-zero fill-value\n")); - - file = H5Fcreate(MISC3_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* Create a simple dataspace */ - dataspace = H5Screate_simple(rank, dims, NULL); - CHECK(dataspace, FAIL, "H5Screate_simple"); - - /* Create a dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Set the chunk information */ - ret = H5Pset_chunk(dcpl, rank, chunk_dims); - CHECK(dcpl, FAIL, "H5Pset_chunk"); - - /* Set the fill-value information */ - ret = H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill); - CHECK(dcpl, FAIL, "H5Pset_fill_value"); - - /* Create the dataset */ - dataset = H5Dcreate2(file, MISC3_DSET_NAME, H5T_NATIVE_INT, dataspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Read from the dataset (should be fill-values) */ - ret = H5Dread(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, &read_buf); - CHECK(ret, FAIL, "H5Dread"); - - for (i = 0; i < MISC3_DIM1; i++) - for (j = 0; j < MISC3_DIM2; j++) - VERIFY(read_buf[i][j], fill, "H5Dread"); - - /* Release resources */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Sclose(dataspace); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc3() */ - -/**************************************************************** -** -** test_misc4(): Test the that 'fileno' field in H5O_info_t is -** valid. -** -****************************************************************/ -static void -test_misc4(void) -{ - hid_t file1, file2, group1, group2, group3; - H5O_info2_t oinfo1, oinfo2, oinfo3; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing fileno working in H5O_info2_t\n")); - - file1 = H5Fcreate(MISC4_FILE_1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file1, FAIL, "H5Fcreate"); - - /* Create the first group */ - group1 = H5Gcreate2(file1, MISC4_GROUP_1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group1, FAIL, "H5Gcreate2"); - - /* Create the second group */ - group2 = H5Gcreate2(file1, MISC4_GROUP_2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group2, FAIL, "H5Gcreate2"); - - file2 = H5Fcreate(MISC4_FILE_2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file2, FAIL, "H5Fcreate"); - - /* Create the first group */ - group3 = H5Gcreate2(file2, MISC4_GROUP_1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group3, FAIL, "H5Gcreate2"); - - /* Get the stat information for each group */ - ret = H5Oget_info_by_name3(file1, MISC4_GROUP_1, &oinfo1, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(file1, MISC4_GROUP_2, &oinfo2, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - ret = H5Oget_info_by_name3(file2, MISC4_GROUP_1, &oinfo3, H5O_INFO_BASIC, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name3"); - - /* Verify that the fileno values are the same for groups from file1 */ - VERIFY(oinfo1.fileno, oinfo2.fileno, "H5Oget_info_by_name"); - - /* Verify that the fileno values are not the same between file1 & file2 */ - if (oinfo1.fileno == oinfo3.fileno) - TestErrPrintf("Error on line %d: oinfo1.fileno != oinfo3.fileno\n", __LINE__); - if (oinfo2.fileno == oinfo3.fileno) - TestErrPrintf("Error on line %d: oinfo2.fileno != oinfo3.fileno\n", __LINE__); - - /* Close the objects */ - ret = H5Gclose(group1); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(group2); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Gclose(group3); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(file1); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Fclose(file2); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc4() */ - -/**************************************************************** -** -** test_misc5(): Test several level deep nested compound & VL datatypes -** -****************************************************************/ - -/*********************** struct3 ***********************/ - -static misc5_struct3_hndl * -create_struct3(void) -{ - misc5_struct3_hndl *str3hndl; /* New 'struct3' created */ - herr_t ret; /* For error checking */ - - str3hndl = (misc5_struct3_hndl *)malloc(sizeof(misc5_struct3_hndl)); - CHECK_PTR(str3hndl, "malloc"); - - str3hndl->st3h_base = H5Tcreate(H5T_COMPOUND, sizeof(misc5_struct3)); - CHECK(str3hndl->st3h_base, FAIL, "H5Tcreate"); - - ret = H5Tinsert(str3hndl->st3h_base, "st3_el1", HOFFSET(misc5_struct3, st3_el1), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - str3hndl->st3h_id = H5Tvlen_create(str3hndl->st3h_base); - CHECK(str3hndl->st3h_id, FAIL, "H5Tvlen_create"); - - return str3hndl; -} - -static void -delete_struct3(misc5_struct3_hndl *str3hndl) -{ - herr_t ret; /* For error checking */ - - ret = H5Tclose(str3hndl->st3h_id); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Tclose(str3hndl->st3h_base); - CHECK(ret, FAIL, "H5Tclose"); - - free(str3hndl); -} - -static void -set_struct3(misc5_struct3 *buf) -{ - buf->st3_el1 = MISC5_DBGELVAL3; -} - -/*********************** struct2 ***********************/ - -static misc5_struct2_hndl * -create_struct2(void) -{ - misc5_struct2_hndl *str2hndl; /* New 'struct2' created */ - herr_t ret; /* For error checking */ - - str2hndl = (misc5_struct2_hndl *)malloc(sizeof(misc5_struct2_hndl)); - CHECK_PTR(str2hndl, "malloc"); - - str2hndl->st2h_base = H5Tcreate(H5T_COMPOUND, sizeof(misc5_struct2)); - CHECK(str2hndl->st2h_base, FAIL, "H5Tcreate"); - - ret = H5Tinsert(str2hndl->st2h_base, "st2_el1", HOFFSET(misc5_struct2, st2_el1), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - str2hndl->st2h_st3hndl = create_struct3(); - CHECK_PTR(str2hndl->st2h_st3hndl, "create_struct3"); - - ret = H5Tinsert(str2hndl->st2h_base, "st2_el2", HOFFSET(misc5_struct2, st2_el2), - str2hndl->st2h_st3hndl->st3h_id); - CHECK(ret, FAIL, "H5Tinsert"); - - str2hndl->st2h_id = H5Tvlen_create(str2hndl->st2h_base); - CHECK(str2hndl->st2h_id, FAIL, "H5Tvlen_create"); - - return str2hndl; -} - -static void -delete_struct2(misc5_struct2_hndl *str2hndl) -{ - herr_t ret; /* For error checking */ - - ret = H5Tclose(str2hndl->st2h_id); - CHECK(ret, FAIL, "H5Tclose"); - - delete_struct3(str2hndl->st2h_st3hndl); - - H5Tclose(str2hndl->st2h_base); - CHECK(ret, FAIL, "H5Tclose"); - - free(str2hndl); -} - -static void -set_struct2(misc5_struct2 *buf) -{ - unsigned i; /* Local index variable */ - - buf->st2_el1 = MISC5_DBGELVAL2; - buf->st2_el2.len = MISC5_DBGNELM3; - - buf->st2_el2.p = malloc((buf->st2_el2.len) * sizeof(misc5_struct3)); - CHECK_PTR(buf->st2_el2.p, "malloc"); - - for (i = 0; i < (buf->st2_el2.len); i++) - set_struct3(&(((misc5_struct3 *)(buf->st2_el2.p))[i])); -} - -static void -clear_struct2(misc5_struct2 *buf) -{ - free(buf->st2_el2.p); -} - -/*********************** struct1 ***********************/ - -static misc5_struct1_hndl * -create_struct1(void) -{ - misc5_struct1_hndl *str1hndl; /* New 'struct1' created */ - herr_t ret; /* For error checking */ - - str1hndl = (misc5_struct1_hndl *)malloc(sizeof(misc5_struct1_hndl)); - CHECK_PTR(str1hndl, "malloc"); - - str1hndl->st1h_base = H5Tcreate(H5T_COMPOUND, sizeof(misc5_struct1)); - CHECK(str1hndl->st1h_base, FAIL, "H5Tcreate"); - - ret = H5Tinsert(str1hndl->st1h_base, "st1_el1", HOFFSET(misc5_struct1, st1_el1), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - str1hndl->st1h_st2hndl = create_struct2(); - CHECK_PTR(str1hndl->st1h_st2hndl, "create_struct2"); - - ret = H5Tinsert(str1hndl->st1h_base, "st1_el2", HOFFSET(misc5_struct1, st1_el2), - str1hndl->st1h_st2hndl->st2h_id); - CHECK(ret, FAIL, "H5Tinsert"); - - str1hndl->st1h_id = H5Tvlen_create(str1hndl->st1h_base); - CHECK(str1hndl->st1h_id, FAIL, "H5Tvlen_create"); - - return str1hndl; -} - -static void -delete_struct1(misc5_struct1_hndl *str1hndl) -{ - herr_t ret; /* For error checking */ - - ret = H5Tclose(str1hndl->st1h_id); - CHECK(ret, FAIL, "H5Tclose"); - - delete_struct2(str1hndl->st1h_st2hndl); - - ret = H5Tclose(str1hndl->st1h_base); - CHECK(ret, FAIL, "H5Tclose"); - - free(str1hndl); -} - -static void -set_struct1(misc5_struct1 *buf) -{ - unsigned i; /* Local index variable */ - - buf->st1_el1 = MISC5_DBGELVAL1; - buf->st1_el2.len = MISC5_DBGNELM2; - - buf->st1_el2.p = malloc((buf->st1_el2.len) * sizeof(misc5_struct2)); - CHECK_PTR(buf->st1_el2.p, "malloc"); - - for (i = 0; i < (buf->st1_el2.len); i++) - set_struct2(&(((misc5_struct2 *)(buf->st1_el2.p))[i])); -} - -static void -clear_struct1(misc5_struct1 *buf) -{ - unsigned i; - - for (i = 0; i < buf->st1_el2.len; i++) - clear_struct2(&(((misc5_struct2 *)(buf->st1_el2.p))[i])); - free(buf->st1_el2.p); -} - -static void -test_misc5(void) -{ - hid_t loc_id, space_id, dataset_id; - hid_t mem_type_id; - misc5_struct1_hndl *str1hndl; - hsize_t dims[MISC5_DSETRANK]; - hvl_t buf; - unsigned i, j, k; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing several level deep nested compound & VL datatypes \n")); - - /* Write the dataset out */ - loc_id = H5Fcreate(MISC5_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(loc_id, FAIL, "H5Fcreate"); - - /* Create the memory structure to write */ - str1hndl = create_struct1(); - CHECK_PTR(str1hndl, "create_struct1"); - - /* Create the dataspace */ - dims[0] = MISC5_NELMTOPLVL; - space_id = H5Screate_simple(MISC5_DSETRANK, dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - - /* Create the dataset */ - dataset_id = H5Dcreate2(loc_id, MISC5_DSETNAME, str1hndl->st1h_id, space_id, H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(dataset_id, FAIL, "H5Dcreate2"); - - /* Create the variable-length buffer */ - buf.len = MISC5_DBGNELM1; - buf.p = malloc((buf.len) * sizeof(misc5_struct1)); - CHECK_PTR(buf.p, "malloc"); - - /* Create the top-level VL information */ - for (i = 0; i < MISC5_DBGNELM1; i++) - set_struct1(&(((misc5_struct1 *)(buf.p))[i])); - - /* Write the data out */ - ret = H5Dwrite(dataset_id, str1hndl->st1h_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, &buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Release the top-level VL information */ - for (j = 0; j < MISC5_DBGNELM1; j++) - clear_struct1(&(((misc5_struct1 *)(buf.p))[j])); - - /* Free the variable-length buffer */ - free(buf.p); - - /* Close dataset */ - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataspace */ - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - - /* Delete memory structures */ - delete_struct1(str1hndl); - - /* Close file */ - ret = H5Fclose(loc_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Read the dataset back in & verify it */ - loc_id = H5Fopen(MISC5_FILE, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(loc_id, FAIL, "H5Fopen"); - - /* Open dataset again */ - dataset_id = H5Dopen2(loc_id, MISC5_DSETNAME, H5P_DEFAULT); - CHECK(dataset_id, FAIL, "H5Dopen2"); - - /* Get the dataset's datatype */ - mem_type_id = H5Dget_type(dataset_id); - CHECK(mem_type_id, FAIL, "H5Dget_type"); - - /* Get the dataset's dataspace */ - space_id = H5Dget_space(dataset_id); - CHECK(space_id, FAIL, "H5Dget_space"); - - /* Read the data back in */ - ret = H5Dread(dataset_id, mem_type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, &buf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the correct information was read in */ - for (i = 0; i < (buf.len); i++) { - /* printf("[%d]=%d\n",i, ((misc5_struct1 *)(buf.p))[i].st1_el1); */ - VERIFY(((misc5_struct1 *)(buf.p))[i].st1_el1, MISC5_DBGELVAL1, "H5Dread"); - for (j = 0; j < (((misc5_struct1 *)(buf.p))[i].st1_el2.len); j++) { - /* printf(" [%d]=%d\n",j, ((misc5_struct2 *)(((misc5_struct1 *) - * (buf.p))[i].st1_el2.p))[j].st2_el1); */ - VERIFY(((misc5_struct2 *)(((misc5_struct1 *)(buf.p))[i].st1_el2.p))[j].st2_el1, MISC5_DBGELVAL2, - "H5Dread"); - for (k = 0; k < (((misc5_struct2 *)(((misc5_struct1 *)(buf.p))[i].st1_el2.p))[j].st2_el2.len); - k++) { - /* printf(" [%d]=%d\n",k, ((misc5_struct3 *)(((misc5_struct2 *) (((misc5_struct1 - * *)(buf.p))[i]. st1_el2.p))[j].st2_el2.p))[k].st3_el1); */ - VERIFY(((misc5_struct3 *)(((misc5_struct2 *)(((misc5_struct1 *)(buf.p))[i].st1_el2.p))[j] - .st2_el2.p))[k] - .st3_el1, - MISC5_DBGELVAL3, "H5Dread"); - } /* end for */ - } - } - - /* Reclaim the memory for the VL information */ - ret = H5Treclaim(mem_type_id, space_id, H5P_DEFAULT, &buf); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close dataspace */ - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset */ - ret = H5Tclose(mem_type_id); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close dataset */ - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(loc_id); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_misc5() */ - -/**************************************************************** -** -** test_misc6(): Test that object header continuation messages are -** created correctly. -** -****************************************************************/ -static void -test_misc6(void) -{ - hid_t loc_id, space_id, dataset_id; - hid_t attr_id; - char attr_name[16]; - unsigned u; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing object header continuation code \n")); - - /* Create the file */ - loc_id = H5Fcreate(MISC6_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(loc_id, FAIL, "H5Fcreate"); - - /* Create the dataspace */ - space_id = H5Screate(H5S_SCALAR); - CHECK(space_id, FAIL, "H5Screate"); - - /* Create the first dataset */ - dataset_id = - H5Dcreate2(loc_id, MISC6_DSETNAME1, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset_id, FAIL, "H5Dcreate2"); - - /* Close dataset */ - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create the second dataset */ - dataset_id = - H5Dcreate2(loc_id, MISC6_DSETNAME2, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset_id, FAIL, "H5Dcreate2"); - - /* Close dataset */ - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(loc_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Loop through adding attributes to each dataset */ - for (u = 0; u < MISC6_NUMATTR; u++) { - /* Create name for attribute */ - snprintf(attr_name, sizeof(attr_name), "Attr#%u", u); - - /* Open the file */ - loc_id = H5Fopen(MISC6_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(loc_id, FAIL, "H5Fopen"); - - /* Open first dataset */ - dataset_id = H5Dopen2(loc_id, MISC6_DSETNAME1, H5P_DEFAULT); - CHECK(dataset_id, FAIL, "H5Dopen2"); - - /* Add attribute to dataset */ - attr_id = H5Acreate2(dataset_id, attr_name, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open second dataset */ - dataset_id = H5Dopen2(loc_id, MISC6_DSETNAME2, H5P_DEFAULT); - CHECK(dataset_id, FAIL, "H5Dopen2"); - - /* Add attribute to dataset */ - attr_id = H5Acreate2(dataset_id, attr_name, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate2"); - - /* Close attribute */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dataset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(loc_id); - CHECK(ret, FAIL, "H5Fclose"); - } /* end for */ - - /* Close dataspace */ - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - -} /* end test_misc6() */ - -/**************************************************************** -** -** test_misc7(): Test that datatypes are sensible to store on -** disk. (i.e. not partially initialized) -** -****************************************************************/ -#if 0 -static void -test_misc7(void) -{ - hid_t fid, did, tid, sid; - int enum_value = 1; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing sensible datatype on disk code \n")); - - /* Attempt to commit a non-sensible datatype */ - - /* Create the file */ - fid = H5Fcreate(MISC7_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create the dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create the compound datatype to commit*/ - tid = H5Tcreate(H5T_COMPOUND, (size_t)32); - CHECK(tid, FAIL, "H5Tcreate"); - - /* Attempt to commit an empty compound datatype */ - ret = H5Tcommit2(fid, MISC7_TYPENAME1, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - VERIFY(ret, FAIL, "H5Tcommit2"); - - /* Attempt to use empty compound datatype to create dataset */ - did = H5Dcreate2(fid, MISC7_DSETNAME1, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - VERIFY(ret, FAIL, "H5Dcreate2"); - - /* Add a field to the compound datatype */ - ret = H5Tinsert(tid, "a", (size_t)0, H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Attempt to commit the compound datatype now - should work */ - ret = H5Tcommit2(fid, MISC7_TYPENAME1, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Attempt to use compound datatype to create dataset now - should work */ - did = H5Dcreate2(fid, MISC7_DSETNAME1, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Close dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close compound datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create the enum datatype to commit*/ - tid = H5Tenum_create(H5T_NATIVE_INT); - CHECK(tid, FAIL, "H5Tenum_create"); - - /* Attempt to commit an empty enum datatype */ - ret = H5Tcommit2(fid, MISC7_TYPENAME2, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - VERIFY(ret, FAIL, "H5Tcommit2"); - - /* Attempt to use empty enum datatype to create dataset */ - did = H5Dcreate2(fid, MISC7_DSETNAME2, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - VERIFY(did, FAIL, "H5Dcreate2"); - - /* Add a member to the enum datatype */ - ret = H5Tenum_insert(tid, "a", &enum_value); - CHECK(ret, FAIL, "H5Tenum_insert"); - - /* Attempt to commit the enum datatype now - should work */ - ret = H5Tcommit2(fid, MISC7_TYPENAME2, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Attempt to use enum datatype to create dataset now - should work */ - did = H5Dcreate2(fid, MISC7_DSETNAME2, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Close dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close enum datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_misc7() */ -#endif - -/**************************************************************** -** -** test_misc8(): Test storage size of various types of dataset -** storage methods. -** -****************************************************************/ -#if 0 -static void -test_misc8(void) -{ - hid_t fid, did, sid; - hid_t fapl; /* File access property list */ - hid_t dcpl; /* Dataset creation property list */ - int rank = MISC8_RANK; - hsize_t dims[MISC8_RANK] = {MISC8_DIM0, MISC8_DIM1}; - hsize_t chunk_dims[MISC8_RANK] = {MISC8_CHUNK_DIM0, MISC8_CHUNK_DIM1}; - hsize_t storage_size; /* Number of bytes of raw data storage used */ - int *wdata; /* Data to write */ - int *tdata; /* Temporary pointer to data write */ -#ifdef VERIFY_DATA - int *rdata; /* Data to read */ - int *tdata2; /* Temporary pointer to data to read */ -#endif /* VERIFY_DATA */ - unsigned u, v; /* Local index variables */ - int mdc_nelmts; /* Metadata number of elements */ - size_t rdcc_nelmts; /* Raw data number of elements */ - size_t rdcc_nbytes; /* Raw data number of bytes */ - double rdcc_w0; /* Raw data write percentage */ - hsize_t start[MISC8_RANK]; /* Hyperslab start */ - hsize_t count[MISC8_RANK]; /* Hyperslab block count */ - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing dataset storage sizes\n")); - - /* Allocate space for the data to write & read */ - wdata = (int *)malloc(sizeof(int) * MISC8_DIM0 * MISC8_DIM1); - CHECK_PTR(wdata, "malloc"); -#ifdef VERIFY_DATA - rdata = (int *)malloc(sizeof(int) * MISC8_DIM0 * MISC8_DIM1); - CHECK_PTR(rdata, "malloc"); -#endif /* VERIFY_DATA */ - - /* Initialize values */ - tdata = wdata; - for (u = 0; u < MISC8_DIM0; u++) - for (v = 0; v < MISC8_DIM1; v++) - *tdata++ = (int)(((u * MISC8_DIM1) + v) % 13); - - /* Create a file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Get the default file access properties for caching */ - ret = H5Pget_cache(fapl, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0); - CHECK(ret, FAIL, "H5Pget_cache"); - - /* Decrease the size of the raw data cache */ - rdcc_nbytes = 0; - - /* Set the file access properties for caching */ - ret = H5Pset_cache(fapl, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0); - CHECK(ret, FAIL, "H5Pset_cache"); - - /* Create the file */ - fid = H5Fcreate(MISC8_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file access property list */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Create a simple dataspace */ - sid = H5Screate_simple(rank, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Select a hyperslab which coincides with chunk boundaries */ - /* (For later use) */ - start[0] = 1; - start[1] = 1; - count[0] = (MISC8_CHUNK_DIM0 * 2) - 1; - count[1] = (MISC8_CHUNK_DIM1 * 2) - 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create a dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* I. contiguous dataset tests */ - - ret = H5Pset_layout(dcpl, H5D_CONTIGUOUS); - CHECK(ret, FAIL, "H5Pset_layout"); - - /* Set the space allocation time to early */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create a contiguous dataset, with space allocation early */ - did = H5Dcreate2(fid, MISC8_DSETNAME1, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check the storage size */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); - VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), - "H5Dget_storage_size"); - - /* Close dataset ID */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - -#ifndef H5_HAVE_PARALLEL - /* Set the space allocation time to late */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create a contiguous dataset, with space allocation late */ - did = H5Dcreate2(fid, MISC8_DSETNAME2, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check the storage size before data is written */ - storage_size = H5Dget_storage_size(did); - VERIFY(storage_size, 0, "H5Dget_storage_size"); - - /* Write data */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Check the storage size after data is written */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); - VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), - "H5Dget_storage_size"); - - /* Close dataset ID */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Set the space allocation time to incremental */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_INCR); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create a contiguous dataset, with space allocation late */ - did = H5Dcreate2(fid, MISC8_DSETNAME3, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check the storage size before data is written */ - storage_size = H5Dget_storage_size(did); - VERIFY(storage_size, 0, "H5Dget_storage_size"); - - /* Write data */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Check the storage size after data is written */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); - VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), - "H5Dget_storage_size"); - - /* Close dataset ID */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); -#endif /* H5_HAVE_PARALLEL */ - - /* II. compact dataset tests */ - ret = H5Pset_layout(dcpl, H5D_COMPACT); - CHECK(ret, FAIL, "H5Pset_layout"); - - /* Set the space allocation time to late */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create a contiguous dataset, with space allocation late */ - /* Should fail */ - H5E_BEGIN_TRY - { - did = H5Dcreate2(fid, MISC8_DSETNAME4, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(did, FAIL, "H5Dcreate2"); - - /* Set the space allocation time to incremental */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_INCR); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create a contiguous dataset, with space allocation incremental */ - /* Should fail */ - H5E_BEGIN_TRY - { - did = H5Dcreate2(fid, MISC8_DSETNAME4, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(did, FAIL, "H5Dcreate2"); - - /* Set the space allocation time to early */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Set the fill time to allocation */ - ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_ALLOC); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create a contiguous dataset, with space allocation early */ - did = H5Dcreate2(fid, MISC8_DSETNAME4, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check the storage size */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); - VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), - "H5Dget_storage_size"); - - /* Close dataset ID */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* III. chunked dataset tests */ - - ret = H5Pset_layout(dcpl, H5D_CHUNKED); - CHECK(ret, FAIL, "H5Pset_layout"); - - /* Set the space allocation time to early */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Use chunked storage for this dataset */ - ret = H5Pset_chunk(dcpl, rank, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Create a chunked dataset, with space allocation early */ - did = H5Dcreate2(fid, MISC8_DSETNAME5, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check the storage size after data is written */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); - VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), - "H5Dget_storage_size"); - - /* Close dataset ID */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - -#ifndef H5_HAVE_PARALLEL - /* Set the space allocation time to late */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Use chunked storage for this dataset */ - ret = H5Pset_chunk(dcpl, rank, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Create a chunked dataset, with space allocation late */ - did = H5Dcreate2(fid, MISC8_DSETNAME6, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check the storage size after dataset is created */ - storage_size = H5Dget_storage_size(did); - VERIFY(storage_size, 0, "H5Dget_storage_size"); - - /* Write part of the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Check the storage size after data is written */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); - VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), - "H5Dget_storage_size"); - - /* Close dataset ID */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Set the space allocation time to incremental */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_INCR); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create a chunked dataset, with space allocation incremental */ - did = H5Dcreate2(fid, MISC8_DSETNAME7, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check the storage size before data is written */ - storage_size = H5Dget_storage_size(did); - VERIFY(storage_size, 0, "H5Dget_storage_size"); - - /* Write part of the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Check the storage size after only four chunks are written */ - storage_size = H5Dget_storage_size(did); - VERIFY(storage_size, (hsize_t)(4 * MISC8_CHUNK_DIM0 * MISC8_CHUNK_DIM1 * H5Tget_size(H5T_NATIVE_INT)), - "H5Dget_storage_size"); - - /* Write entire dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - -#ifdef VERIFY_DATA - /* Read data */ - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check values written */ - tdata = wdata; - tdata2 = rdata; - for (u = 0; u < MISC8_DIM0; u++) - for (v = 0; v < MISC8_DIM1; v++, tdata++, tdata2++) - if (*tdata != *tdata2) - TestErrPrintf("Error on line %d: u=%u, v=%d, *tdata=%d, *tdata2=%d\n", __LINE__, (unsigned)u, - (unsigned)v, (int)*tdata, (int)*tdata2); -#endif /* VERIFY_DATA */ - - /* Check the storage size after data is written */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); - VERIFY(storage_size, (hsize_t)(MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT)), - "H5Dget_storage_size"); - - /* Close dataset ID */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); -#endif /* H5_HAVE_PARALLEL */ - - /* Set the space allocation time to early */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Use compression as well as chunking for these datasets */ -#ifdef H5_HAVE_FILTER_DEFLATE - ret = H5Pset_deflate(dcpl, 9); - CHECK(ret, FAIL, "H5Pset_deflate"); -#endif /* end H5_HAVE_FILTER_DEFLATE */ - - /* Create a chunked dataset, with space allocation early */ - did = H5Dcreate2(fid, MISC8_DSETNAME8, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Write part of the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Check the storage size after data is written */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); -#ifdef H5_HAVE_FILTER_DEFLATE - if (storage_size >= (MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT))) - TestErrPrintf("Error on line %d: data wasn't compressed! storage_size=%u\n", __LINE__, - (unsigned)storage_size); -#else /* Compression is not configured */ - if (storage_size != (MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT))) - TestErrPrintf("Error on line %d: wrong storage size! storage_size=%u\n", __LINE__, - (unsigned)storage_size); -#endif /* H5_HAVE_FILTER_DEFLATE */ - - /* Close dataset ID */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - -#ifndef H5_HAVE_PARALLEL - /* Set the space allocation time to late */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create a chunked dataset, with space allocation late */ - did = H5Dcreate2(fid, MISC8_DSETNAME9, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check the storage size before data is written */ - storage_size = H5Dget_storage_size(did); - VERIFY(storage_size, 0, "H5Dget_storage_size"); - - /* Write part of the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Check the storage size after only four chunks are written */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); -#ifdef H5_HAVE_FILTER_DEFLATE - if (storage_size >= (MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT))) - TestErrPrintf("Error on line %d: data wasn't compressed! storage_size=%u\n", __LINE__, - (unsigned)storage_size); -#else /* Compression is not configured */ - if (storage_size != (MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT))) - TestErrPrintf("Error on line %d: wrong storage size! storage_size=%u\n", __LINE__, - (unsigned)storage_size); -#endif /* H5_HAVE_FILTER_DEFLATE */ - - /* Write entire dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - -#ifdef VERIFY_DATA - /* Read data */ - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check values written */ - tdata = wdata; - tdata2 = rdata; - for (u = 0; u < MISC8_DIM0; u++) - for (v = 0; v < MISC8_DIM1; v++, tdata++, tdata2++) - if (*tdata != *tdata2) - TestErrPrintf("Error on line %d: u=%u, v=%d, *tdata=%d, *tdata2=%d\n", __LINE__, (unsigned)u, - (unsigned)v, (int)*tdata, (int)*tdata2); -#endif /* VERIFY_DATA */ - - /* Check the storage size after data is written */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); -#ifdef H5_HAVE_FILTER_DEFLATE - if (storage_size >= (MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT))) - TestErrPrintf("Error on line %d: data wasn't compressed! storage_size=%u\n", __LINE__, - (unsigned)storage_size); -#else - if (storage_size != (MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT))) - TestErrPrintf("Error on line %d: wrong storage size! storage_size=%u\n", __LINE__, - (unsigned)storage_size); -#endif /*H5_HAVE_FILTER_DEFLATE*/ - - /* Close dataset ID */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Set the space allocation time to incremental */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_INCR); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create a chunked dataset, with space allocation incremental */ - did = H5Dcreate2(fid, MISC8_DSETNAME10, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check the storage size before data is written */ - storage_size = H5Dget_storage_size(did); - VERIFY(storage_size, 0, "H5Dget_storage_size"); - - /* Write part of the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, sid, sid, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Check the storage size after only four chunks are written */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); -#ifdef H5_HAVE_FILTER_DEFLATE - if (storage_size >= (4 * MISC8_CHUNK_DIM0 * MISC8_CHUNK_DIM1 * H5Tget_size(H5T_NATIVE_INT))) - TestErrPrintf("Error on line %d: data wasn't compressed! storage_size=%u\n", __LINE__, - (unsigned)storage_size); -#else /* Compression is not configured */ - if (storage_size != (4 * MISC8_CHUNK_DIM0 * MISC8_CHUNK_DIM1 * H5Tget_size(H5T_NATIVE_INT))) - TestErrPrintf("Error on line %d: wrong storage size! storage_size=%u\n", __LINE__, - (unsigned)storage_size); -#endif /* H5_HAVE_FILTER_DEFLATE */ - - /* Write entire dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - -#ifdef VERIFY_DATA - /* Read data */ - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check values written */ - tdata = wdata; - tdata2 = rdata; - for (u = 0; u < MISC8_DIM0; u++) - for (v = 0; v < MISC8_DIM1; v++, tdata++, tdata2++) - if (*tdata != *tdata2) - TestErrPrintf("Error on line %d: u=%u, v=%d, *tdata=%d, *tdata2=%d\n", __LINE__, (unsigned)u, - (unsigned)v, (int)*tdata, (int)*tdata2); -#endif /* VERIFY_DATA */ - - /* Check the storage size after data is written */ - storage_size = H5Dget_storage_size(did); - CHECK(storage_size, 0, "H5Dget_storage_size"); -#ifdef H5_HAVE_FILTER_DEFLATE - if (storage_size >= (MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT))) - TestErrPrintf("Error on line %d: data wasn't compressed! storage_size=%u\n", __LINE__, - (unsigned)storage_size); -#else - if (storage_size != (MISC8_DIM0 * MISC8_DIM1 * H5Tget_size(H5T_NATIVE_INT))) - TestErrPrintf("Error on line %d: wrong storage size! storage_size=%u\n", __LINE__, - (unsigned)storage_size); -#endif /*H5_HAVE_FILTER_DEFLATE*/ - - /* Close dataset ID */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); -#endif /* H5_HAVE_PARALLEL */ - - /* Close dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free the read & write buffers */ - free(wdata); -#ifdef VERIFY_DATA - free(rdata); -#endif /* VERIFY_DATA */ -} /* end test_misc8() */ -#endif - -/**************************************************************** -** -** test_misc9(): Test that H5Fopen() does not succeed for core -** files, H5Fcreate() must be used to open them. -** -****************************************************************/ -static void -test_misc9(void) -{ - hid_t fapl, fid; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing core file opening\n")); - - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - ret = H5Pset_fapl_core(fapl, (size_t)1024, 0); - CHECK(ret, FAIL, "H5Pset_fapl_core"); - - H5E_BEGIN_TRY - { - fid = H5Fopen(MISC9_FILE, H5F_ACC_RDWR, fapl); - } - H5E_END_TRY - VERIFY(fid, FAIL, "H5Fopen"); - - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pset_fapl_core"); -} /* end test_misc9() */ - -/**************************************************************** -** -** test_misc10(): Test opening a dataset created with an older -** version of the library (shares the tmtimeo.h5 file with the mtime.c -** test - see notes in gen_old_mtime.c for notes on generating this -** data file) and using the dataset creation property list from -** that dataset to create a dataset with the current version of -** the library. Also tests using file creation property in same way. -** -****************************************************************/ -#if 0 -static void -test_misc10(void) -{ - hid_t file, file_new; /* File IDs for old & new files */ - hid_t fcpl; /* File creation property list */ - hid_t dataset, dataset_new; /* Dataset IDs for old & new datasets */ - hid_t dcpl; /* Dataset creation property list */ - hid_t space, type; /* Old dataset's dataspace & datatype */ - const char *testfile = H5_get_srcdir_filename(MISC10_FILE_OLD); /* Corrected test file name */ - bool driver_is_default_compatible; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing using old dataset creation property list\n")); - - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); - - if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); - return; - } - - /* - * Open the old file and the dataset and get old settings. - */ - file = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fopen"); - fcpl = H5Fget_create_plist(file); - CHECK(fcpl, FAIL, "H5Fget_create_plist"); - - dataset = H5Dopen2(file, MISC10_DSETNAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - dcpl = H5Dget_create_plist(dataset); - CHECK(dcpl, FAIL, "H5Dget_create_plist"); - space = H5Dget_space(dataset); - CHECK(space, FAIL, "H5Dget_space"); - type = H5Dget_type(dataset); - CHECK(type, FAIL, "H5Dget_type"); - - /* Create new file & dataset */ - file_new = H5Fcreate(MISC10_FILE_NEW, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT); - CHECK(file_new, FAIL, "H5Fcreate"); - - dataset_new = H5Dcreate2(file_new, MISC10_DSETNAME, type, space, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset_new, FAIL, "H5Dcreate2"); - - /* Close new dataset & file */ - ret = H5Dclose(dataset_new); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(file_new); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close old dataset information */ - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(space); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close old file information */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); -} /* end test_misc10() */ -#endif - -/**************************************************************** -** -** test_misc11(): Test that all properties in a file creation property -** list are stored correctly in the file and can be retrieved -** when the file is re-opened. -** -****************************************************************/ -static void -test_misc11(void) -{ - hid_t file; /* File IDs for old & new files */ - hid_t fcpl; /* File creation property list */ - hsize_t userblock; /* Userblock size retrieved from FCPL */ - size_t off_size; /* Size of offsets in the file */ - size_t len_size; /* Size of lengths in the file */ - unsigned sym_ik; /* Symbol table B-tree initial 'K' value */ - unsigned istore_ik; /* Indexed storage B-tree initial 'K' value */ - unsigned sym_lk; /* Symbol table B-tree leaf 'K' value */ - unsigned nindexes; /* Shared message number of indexes */ -#if 0 - H5F_info2_t finfo; /* global information about file */ -#endif - H5F_fspace_strategy_t strategy; /* File space strategy */ - hsize_t threshold; /* Free-space section threshold */ - bool persist; /* To persist free-space or not */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing file creation properties retrieved correctly\n")); - - /* Creating a file with the default file creation property list should - * create a version 0 superblock - */ - - /* Create file with default file creation property list */ - file = H5Fcreate(MISC11_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); -#if 0 - /* Get the file's version information */ - ret = H5Fget_info2(file, &finfo); - CHECK(ret, FAIL, "H5Fget_info2"); - VERIFY(finfo.super.version, 0, "H5Fget_info2"); - VERIFY(finfo.free.version, 0, "H5Fget_info2"); - VERIFY(finfo.sohm.version, 0, "H5Fget_info2"); -#endif - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Create a file creation property list */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); - - /* Set all the properties in the FCPL */ - ret = H5Pset_userblock(fcpl, (hsize_t)MISC11_USERBLOCK); - CHECK(ret, FAIL, "H5Pset_userblock"); - - ret = H5Pset_sizes(fcpl, (size_t)MISC11_SIZEOF_OFF, (size_t)MISC11_SIZEOF_LEN); - CHECK(ret, FAIL, "H5Pset_sizes"); - - /* This should fail as (32770*2) will exceed ^16 - 2 bytes for storing btree entries */ - H5E_BEGIN_TRY - { - ret = H5Pset_sym_k(fcpl, 32770, 0); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_sym_k"); - - ret = H5Pset_sym_k(fcpl, MISC11_SYM_IK, MISC11_SYM_LK); - CHECK(ret, FAIL, "H5Pset_sym_k"); - - /* This should fail as (32770*2) will exceed ^16 - 2 bytes for storing btree entries */ - H5E_BEGIN_TRY - { - ret = H5Pset_istore_k(fcpl, 32770); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pset_istore_k"); - - ret = H5Pset_istore_k(fcpl, MISC11_ISTORE_IK); - CHECK(ret, FAIL, "H5Pset_istore_k"); - - ret = H5Pset_shared_mesg_nindexes(fcpl, MISC11_NINDEXES); - CHECK(ret, FAIL, "H5Pset_shared_mesg"); - - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_NONE, false, (hsize_t)1); - CHECK(ret, FAIL, "H5Pset_file_space"); - - /* Creating a file with the non-default file creation property list should - * create a version 2 superblock - */ - - /* Create file with custom file creation property list */ - file = H5Fcreate(MISC11_FILE, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* Close FCPL */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); -#if 0 - /* Get the file's version information */ - ret = H5Fget_info2(file, &finfo); - CHECK(ret, FAIL, "H5Fget_info2"); - VERIFY(finfo.super.version, 2, "H5Fget_info2"); - VERIFY(finfo.free.version, 0, "H5Fget_info2"); - VERIFY(finfo.sohm.version, 0, "H5Fget_info2"); -#endif - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - file = H5Fopen(MISC11_FILE, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* Get the file's creation property list */ - fcpl = H5Fget_create_plist(file); - CHECK(fcpl, FAIL, "H5Fget_create_plist"); -#if 0 - /* Get the file's version information */ - ret = H5Fget_info2(file, &finfo); - CHECK(ret, FAIL, "H5Fget_info2"); - VERIFY(finfo.super.version, 2, "H5Fget_info2"); - VERIFY(finfo.free.version, 0, "H5Fget_info2"); - VERIFY(finfo.sohm.version, 0, "H5Fget_info2"); -#endif - /* Retrieve all the property values & check them */ - ret = H5Pget_userblock(fcpl, &userblock); - CHECK(ret, FAIL, "H5Pget_userblock"); - VERIFY(userblock, MISC11_USERBLOCK, "H5Pget_userblock"); - - ret = H5Pget_sizes(fcpl, &off_size, &len_size); - CHECK(ret, FAIL, "H5Pget_sizes"); - VERIFY(off_size, MISC11_SIZEOF_OFF, "H5Pget_sizes"); - VERIFY(len_size, MISC11_SIZEOF_LEN, "H5Pget_sizes"); - - ret = H5Pget_sym_k(fcpl, &sym_ik, &sym_lk); - CHECK(ret, FAIL, "H5Pget_sym_k"); - VERIFY(sym_ik, MISC11_SYM_IK, "H5Pget_sym_k"); - VERIFY(sym_lk, MISC11_SYM_LK, "H5Pget_sym_k"); - - ret = H5Pget_istore_k(fcpl, &istore_ik); - CHECK(ret, FAIL, "H5Pget_istore_k"); - VERIFY(istore_ik, MISC11_ISTORE_IK, "H5Pget_istore_k"); - - ret = H5Pget_shared_mesg_nindexes(fcpl, &nindexes); - CHECK(ret, FAIL, "H5Pget_shared_mesg_nindexes"); - VERIFY(nindexes, MISC11_NINDEXES, "H5Pget_shared_mesg_nindexes"); - - ret = H5Pget_file_space_strategy(fcpl, &strategy, &persist, &threshold); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - VERIFY(strategy, 3, "H5Pget_file_space_strategy"); - VERIFY(persist, false, "H5Pget_file_space_strategy"); - VERIFY(threshold, 1, "H5Pget_file_space_strategy"); - - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close FCPL */ - ret = H5Pclose(fcpl); - CHECK(ret, FAIL, "H5Pclose"); -} /* end test_misc11() */ - -/**************************************************************** -** -** test_misc12(): Test that VL-types operate correctly in chunked -** datasets that are extended. -** -****************************************************************/ -static void -test_misc12(void) -{ - const char *wdata[MISC12_SPACE1_DIM1] = { - "Four score and seven years ago our forefathers brought forth on this continent a new nation,", - "conceived in liberty and dedicated to the proposition that all men are created equal.", - "Now we are engaged in a great civil war,", - "testing whether that nation or any nation so conceived and so dedicated can long endure."}; - const char *wdata1[MISC12_APPEND_SIZE] = { - "O Gloria inmarcesible! O Jubilo inmortal! En surcos de dolores, el", - "bien germina ya! Ceso la horrible noche, La libertad sublime", - "derrama las auroras de su invencible luz.", "La humanidad entera, que entre cadenas gime, comprende", - "las palabras del que murio en la cruz."}; - char *rdata[MISC12_SPACE1_DIM1 + MISC12_APPEND_SIZE]; /* Information read in */ - hid_t fid1; - hid_t dataset; - hid_t sid1, space, memspace; - hid_t tid1, cparms; - hsize_t dims1[] = {MISC12_SPACE1_DIM1}; - hsize_t dimsn[] = {MISC12_APPEND_SIZE}; - hsize_t maxdims1[1] = {H5S_UNLIMITED}; - hsize_t chkdims1[1] = {MISC12_CHUNK_SIZE}; - hsize_t newsize[1] = {MISC12_SPACE1_DIM1 + MISC12_APPEND_SIZE}; - hsize_t offset[1] = {MISC12_SPACE1_DIM1}; - hsize_t count[1] = {MISC12_APPEND_SIZE}; - int i; /* counting variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing VL-type in chunked dataset\n")); - - /* This test requirese a relatively "fresh" library environment */ - ret = H5garbage_collect(); - CHECK(ret, FAIL, "H5garbage_collect"); - - /* Create file */ - fid1 = H5Fcreate(MISC12_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(MISC12_SPACE1_RANK, dims1, maxdims1); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - tid1 = H5Tcopy(H5T_C_S1); - CHECK(tid1, FAIL, "H5Tcopy"); - - ret = H5Tset_size(tid1, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - cparms = H5Pcreate(H5P_DATASET_CREATE); - CHECK(cparms, FAIL, "H5Pcreate"); - - ret = H5Pset_chunk(cparms, 1, chkdims1); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, MISC12_DSET_NAME, tid1, sid1, H5P_DEFAULT, cparms, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Extend dataset */ - ret = H5Dset_extent(dataset, newsize); - CHECK(ret, FAIL, "H5Dset_extent"); - - memspace = H5Screate_simple(MISC12_SPACE1_RANK, dimsn, NULL); - CHECK(memspace, FAIL, "H5Screate_simple"); - - space = H5Dget_space(dataset); - CHECK(space, FAIL, "H5Dget_space"); - - ret = H5Sselect_hyperslab(space, H5S_SELECT_SET, offset, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Write data to new portion of dataset */ - ret = H5Dwrite(dataset, tid1, memspace, space, H5P_DEFAULT, wdata1); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read all data back */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - for (i = 0; i < MISC12_SPACE1_DIM1; i++) - if (strcmp(wdata[i], rdata[i]) != 0) - TestErrPrintf("Error on line %d: wdata[%d]=%s, rdata[%d]=%s\n", __LINE__, i, wdata[i], i, - rdata[i]); - for (; i < (MISC12_SPACE1_DIM1 + MISC12_APPEND_SIZE); i++) - if (strcmp(wdata1[i - MISC12_SPACE1_DIM1], rdata[i]) != 0) - TestErrPrintf("Error on line %d: wdata1[%d]=%s, rdata[%d]=%s\n", __LINE__, i - MISC12_SPACE1_DIM1, - wdata1[i - MISC12_SPACE1_DIM1], i, rdata[i]); - - ret = H5Sselect_all(space); - CHECK(ret, FAIL, "H5Sselect_all"); - - /* Reclaim VL data memory */ - ret = H5Treclaim(tid1, space, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Everything */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(space); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(memspace); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Pclose(cparms); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc12() */ -#if 0 -/* Various routines for misc. 13 test */ -static void -misc13_init_data(unsigned *original_data) -{ - unsigned u; - - for (u = 0; u < MISC13_DIM1; u++) - original_data[u] = u; -} - -static bool -misc13_verify_data_match(const unsigned *original_data, const unsigned *read_data) -{ - unsigned u; - - for (u = 0; u < MISC13_DIM1; u++) - if (original_data[u] != read_data[u]) - return false; - - return true; -} - -static void -misc13_create_dataset(hid_t loc_id, const char *name, hid_t dcpl, const unsigned *data) -{ - hid_t dsid = -1; /* Dataset ID */ - hid_t sid = -1; /* Dataspace ID */ - hsize_t dims[MISC13_RANK]; /* Dataset dimensions */ - herr_t ret; /* Generic return value */ - - /* Create dataspace for use with dataset */ - dims[0] = MISC13_DIM1; - sid = H5Screate_simple(MISC13_RANK, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create contiguous dataset in root group */ - dsid = H5Dcreate2(loc_id, name, H5T_NATIVE_UINT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dsid, FAIL, "H5Dcreate2"); - - /* Write some data to dataset */ - ret = H5Dwrite(dsid, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close the contiguous dataset */ - ret = H5Dclose(dsid); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - -} /* end misc13_create_dataset() */ - -static void -misc13_verify_dataset(hid_t loc_id, const char *name, const unsigned *data) -{ - unsigned *read_data = NULL; /* Data to write to dataset */ - hid_t dsid = -1; /* Dataset ID */ - herr_t ret; /* Generic return value */ - - /* Create a data buffer for the dataset read */ - read_data = (unsigned *)calloc(MISC13_DIM1, sizeof(unsigned)); - CHECK_PTR(read_data, "calloc"); - - /* Open the contiguous dataset in the root group */ - dsid = H5Dopen2(loc_id, name, H5P_DEFAULT); - CHECK(dsid, FAIL, "H5Dopen2"); - - /* Read the data */ - ret = H5Dread(dsid, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, read_data); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify that the data are correct */ - ret = misc13_verify_data_match(data, read_data); - CHECK(ret, FAIL, "misc13_verify_data_match"); - - /* Close the contiguous dataset */ - ret = H5Dclose(dsid); - CHECK(ret, FAIL, "H5Dclose"); - - /* Free the dataset read buffer */ - free(read_data); - -} /* end misc13_verify_dataset() */ - -static void -misc13_create_hdf_file(const char *name, const unsigned *data) -{ - hid_t fid = -1; /* File ID */ - hid_t gid1 = -1; /* Group ID (level 1) */ - hid_t gid2 = -1; /* Group ID (level 2) */ - hid_t tid = -1; /* Datatype ID */ - hid_t dcplid = -1; /* Dataset creation property list ID */ - hsize_t chunk_dims[MISC13_RANK]; /* Chunk dimensions */ - herr_t ret; /* Generic return value */ - - /* Create file */ - fid = H5Fcreate(name, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create DCPL for use with datasets */ - dcplid = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcplid, FAIL, "H5Pcreate"); - - /* Set the DCPL to be chunked */ - ret = H5Pset_layout(dcplid, H5D_CHUNKED); - CHECK(ret, FAIL, "H5Pset_layout"); - - /* Use chunked storage for this DCPL */ - chunk_dims[0] = MISC13_CHUNK_DIM1; - ret = H5Pset_chunk(dcplid, MISC13_RANK, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Create contiguous dataset in root group */ - misc13_create_dataset(fid, MISC13_DSET1_NAME, H5P_DEFAULT, data); - - /* Create chunked dataset in root group */ - misc13_create_dataset(fid, MISC13_DSET2_NAME, dcplid, data); - - /* Create a datatype to commit to the file */ - tid = H5Tcopy(H5T_NATIVE_INT); - CHECK(tid, FAIL, "H5Tcopy"); - - /* Create a named datatype in the root group */ - ret = H5Tcommit2(fid, MISC13_DTYPE_NAME, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Close named datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Create a group in the root group */ - gid1 = H5Gcreate2(fid, MISC13_GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gcreate2"); - - /* Create another group in the new group */ - gid2 = H5Gcreate2(gid1, MISC13_GROUP2_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gcreate2"); - - /* Close the second group */ - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create contiguous dataset in new group */ - misc13_create_dataset(gid1, MISC13_DSET1_NAME, H5P_DEFAULT, data); - - /* Create chunked dataset in new group */ - misc13_create_dataset(gid1, MISC13_DSET2_NAME, dcplid, data); - - /* Create a datatype to commit to the new group */ - tid = H5Tcopy(H5T_NATIVE_INT); - CHECK(tid, FAIL, "H5Tcopy"); - - /* Create a named datatype in the new group */ - ret = H5Tcommit2(gid1, MISC13_DTYPE_NAME, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Close named datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close the first group */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close the DCPL */ - ret = H5Pclose(dcplid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end misc13_create_hdf_file() */ - -static void -misc13_insert_user_block(const char *old_name, const char *new_name, const char *str, size_t size) -{ - FILE *new_fp = NULL; /* Pointers to new & old files */ - FILE *old_fp = NULL; - void *user_block = NULL; /* Pointer to user block to write to file */ - void *copy_buf = NULL; /* Pointer to buffer for copying data */ - size_t written; /* Amount of data written to new file */ - size_t read_in; /* Amount of data read in from old file */ - int ret; /* Generic status value */ - - /* Allocate space for the user block */ - user_block = calloc(size, (size_t)1); - CHECK_PTR(user_block, "calloc"); - - /* Copy in the user block data */ - memcpy(user_block, str, strlen(str)); - - /* Open the new file */ - new_fp = fopen(new_name, "wb"); - CHECK_PTR(new_fp, "fopen"); - - /* Write the user block to the new file */ - written = fwrite(user_block, (size_t)1, size, new_fp); - VERIFY(written, size, "fwrite"); - - /* Open the old file */ - old_fp = fopen(old_name, "rb"); - CHECK_PTR(old_fp, "fopen"); - - /* Allocate space for the copy buffer */ - copy_buf = malloc((size_t)MISC13_COPY_BUF_SIZE); - CHECK_PTR(copy_buf, "malloc"); - - /* Copy data from the old file to the new file */ - while ((read_in = fread(copy_buf, (size_t)1, (size_t)MISC13_COPY_BUF_SIZE, old_fp)) > 0) { - /* Write the data to the new file */ - written = fwrite(copy_buf, (size_t)1, read_in, new_fp); - VERIFY(written, read_in, "fwrite"); - } - - /* Close the old file */ - ret = fclose(old_fp); - VERIFY(ret, 0, "fclose"); - - /* Close the new file */ - ret = fclose(new_fp); - VERIFY(ret, 0, "fclose"); - - /* Free the copy buffer */ - free(copy_buf); - - /* Free the user block */ - free(user_block); - -} /* end misc13_insert_user_block() */ - -static void -misc13_verify_file(const char *name, const unsigned *data, hsize_t userblock_size, - bool check_for_new_dataset) -{ - hid_t fid = -1; /* File ID */ - hid_t gid1 = -1; /* Group IDs */ - hid_t gid2 = -1; /* Group IDs */ - hid_t tid = -1; /* Datatype ID */ - hid_t fcplid = -1; /* File creation property list ID */ - hsize_t ub_size_out; /* Userblock size retrieved from FCPL */ - herr_t ret; /* Generic return value */ - - /* Open the file */ - fid = H5Fopen(name, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Get the file's FCPL */ - fcplid = H5Fget_create_plist(fid); - CHECK(fcplid, FAIL, "H5Fget_create_plist"); - - /* Get the user block size for the file */ - ret = H5Pget_userblock(fcplid, &ub_size_out); - CHECK(ret, FAIL, "H5Pget_userblock"); - - /* Check the userblock size */ - VERIFY(userblock_size, ub_size_out, "H5Pget_userblock"); - - /* Close the FCPL */ - ret = H5Pclose(fcplid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Verify the contiguous dataset in the root group */ - misc13_verify_dataset(fid, MISC13_DSET1_NAME, data); - - /* Verify the chunked dataset in the root group */ - misc13_verify_dataset(fid, MISC13_DSET2_NAME, data); - - /* Verify the "new" contiguous dataset in the root group, if asked */ - if (check_for_new_dataset) - misc13_verify_dataset(fid, MISC13_DSET3_NAME, data); - - /* Open the named datatype in the root group */ - tid = H5Topen2(fid, MISC13_DTYPE_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - - /* Verify the type is correct */ - VERIFY(H5Tequal(tid, H5T_NATIVE_INT), true, "H5Tequal"); - - /* Close named datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open the first group */ - gid1 = H5Gopen2(fid, MISC13_GROUP1_NAME, H5P_DEFAULT); - CHECK(gid1, FAIL, "H5Gopen2"); - - /* Verify the contiguous dataset in the first group */ - misc13_verify_dataset(gid1, MISC13_DSET1_NAME, data); - - /* Verify the chunked dataset in the first group */ - misc13_verify_dataset(gid1, MISC13_DSET2_NAME, data); - - /* Open the named datatype in the first group */ - tid = H5Topen2(gid1, MISC13_DTYPE_NAME, H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - - /* Verify the type is correct */ - VERIFY(H5Tequal(tid, H5T_NATIVE_INT), true, "H5Tequal"); - - /* Close named datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open the second group */ - gid2 = H5Gopen2(gid1, MISC13_GROUP2_NAME, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gopen2"); - - /* Close the second group */ - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close the first group */ - ret = H5Gclose(gid1); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end misc13_verify_file() */ - -static void -misc13_add_to_new_file(const char *name, const unsigned *data) -{ - hid_t fid = -1; /* File ID */ - herr_t ret; /* Generic return value */ - - /* Open the file */ - fid = H5Fopen(name, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create new contiguous dataset in root group */ - misc13_create_dataset(fid, MISC13_DSET3_NAME, H5P_DEFAULT, data); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end misc13_add_to_new_file() */ - -/**************************************************************** -** -** test_misc13(): Test that file contents can be "slid down" by -** inserting a user block in front of an existing file. -** -****************************************************************/ -static void -test_misc13(void) -{ - unsigned *data = NULL; /* Data to write to dataset */ - hsize_t userblock_size; /* Correct size of userblock */ - bool check_for_new_dataset; /* Whether to check for the post-userblock-creation dataset */ - - /* Create a data buffer for the datasets */ - data = (unsigned *)calloc(MISC13_DIM1, sizeof(unsigned)); - CHECK_PTR(data, "calloc"); - - /* Initialize data to write */ - misc13_init_data(data); - - /* Create first file, with no user block */ - misc13_create_hdf_file(MISC13_FILE_1, data); - - /* Verify file contents are correct */ - userblock_size = 0; - check_for_new_dataset = false; - misc13_verify_file(MISC13_FILE_1, data, userblock_size, check_for_new_dataset); - - /* Create a new file by inserting a user block in front of the first file */ - misc13_insert_user_block(MISC13_FILE_1, MISC13_FILE_2, "Test String", (size_t)MISC13_USERBLOCK_SIZE); - - /* Verify file contents are still correct */ - userblock_size = MISC13_USERBLOCK_SIZE; - check_for_new_dataset = false; - misc13_verify_file(MISC13_FILE_2, data, userblock_size, check_for_new_dataset); - - /* Make certain we can modify the new file */ - misc13_add_to_new_file(MISC13_FILE_2, data); - - /* Verify file contents are still correct */ - userblock_size = MISC13_USERBLOCK_SIZE; - check_for_new_dataset = true; - misc13_verify_file(MISC13_FILE_2, data, userblock_size, check_for_new_dataset); - - /* Free the dataset buffer */ - free(data); - -} /* end test_misc13() */ -#endif - -/**************************************************************** -** -** test_misc14(): Test that file contents can be "slid down" by -** inserting a user block in front of an existing file. -** -****************************************************************/ -static void -test_misc14(void) -{ - hid_t file_id; /* File ID */ - hid_t fapl; /* File access property list ID */ - hid_t DataSpace; /* Dataspace ID */ - hid_t Dataset1; /* Dataset ID #1 */ - hid_t Dataset2; /* Dataset ID #2 */ - hid_t Dataset3; /* Dataset ID #3 */ - double data1 = 5.0; /* Data to write for dataset #1 */ - double data2 = 10.0; /* Data to write for dataset #2 */ - double data3 = 15.0; /* Data to write for dataset #3 */ - double rdata; /* Data read in */ - herr_t ret; /* Generic return value */ - - /* Test creating two datasets and deleting the second */ - - /* Increase the metadata block size */ - /* (This makes certain that all the data blocks are allocated together) */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - ret = H5Pset_meta_block_size(fapl, (hsize_t)MISC14_METADATA_SIZE); - CHECK(ret, FAIL, "H5Pset_meta_block_size"); - - /* Create dataspace to use */ - DataSpace = H5Screate(H5S_SCALAR); - CHECK(DataSpace, FAIL, "H5Screate"); - - /* Open the file */ - file_id = H5Fcreate(MISC14_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Create first dataset & write data */ - Dataset1 = H5Dcreate2(file_id, MISC14_DSET1_NAME, H5T_NATIVE_DOUBLE, DataSpace, H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(Dataset1, FAIL, "H5Dcreate2"); - - ret = H5Dwrite(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data1); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Create second dataset (to be unlinked). */ - Dataset2 = H5Dcreate2(file_id, MISC14_DSET2_NAME, H5T_NATIVE_DOUBLE, DataSpace, H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(Dataset2, FAIL, "H5Dcreate2"); - - ret = H5Dwrite(Dataset2, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data2); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Check data from first dataset */ - ret = H5Dread(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); - CHECK(ret, FAIL, "H5Dread"); - if (!H5_DBL_ABS_EQUAL(rdata, data1)) - TestErrPrintf("Error on line %d: data1!=rdata\n", __LINE__); - - /* Unlink second dataset */ - ret = H5Ldelete(file_id, MISC14_DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close second dataset */ - ret = H5Dclose(Dataset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Verify the data from dataset #1 */ - ret = H5Dread(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); - CHECK(ret, FAIL, "H5Dread"); - if (!H5_DBL_ABS_EQUAL(rdata, data1)) - TestErrPrintf("Error on line %d: data1!=rdata\n", __LINE__); - - /* Close first dataset */ - ret = H5Dclose(Dataset1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Test creating two datasets and deleting the first */ - - /* Open the file */ - file_id = H5Fcreate(MISC14_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Create first dataset & write data */ - Dataset1 = H5Dcreate2(file_id, MISC14_DSET1_NAME, H5T_NATIVE_DOUBLE, DataSpace, H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(Dataset1, FAIL, "H5Dcreate2"); - - ret = H5Dwrite(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data1); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Create second dataset */ - Dataset2 = H5Dcreate2(file_id, MISC14_DSET2_NAME, H5T_NATIVE_DOUBLE, DataSpace, H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(Dataset2, FAIL, "H5Dcreate2"); - - ret = H5Dwrite(Dataset2, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data2); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Check data from second dataset */ - ret = H5Dread(Dataset2, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); - CHECK(ret, FAIL, "H5Dread"); - if (!H5_DBL_ABS_EQUAL(rdata, data2)) - TestErrPrintf("Error on line %d: data2!=rdata\n", __LINE__); - - /* Unlink first dataset */ - ret = H5Ldelete(file_id, MISC14_DSET1_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close first dataset */ - ret = H5Dclose(Dataset1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Verify the data from dataset #2 */ - ret = H5Dread(Dataset2, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); - CHECK(ret, FAIL, "H5Dread"); - if (!H5_DBL_ABS_EQUAL(rdata, data2)) - TestErrPrintf("Error on line %d: data2!=rdata\n", __LINE__); - - /* Close second dataset */ - ret = H5Dclose(Dataset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Test creating three datasets and deleting the second */ - - /* Open the file */ - file_id = H5Fcreate(MISC14_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Create first dataset & write data */ - Dataset1 = H5Dcreate2(file_id, MISC14_DSET1_NAME, H5T_NATIVE_DOUBLE, DataSpace, H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(Dataset1, FAIL, "H5Dcreate2"); - - ret = H5Dwrite(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data1); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Create second dataset */ - Dataset2 = H5Dcreate2(file_id, MISC14_DSET2_NAME, H5T_NATIVE_DOUBLE, DataSpace, H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(Dataset2, FAIL, "H5Dcreate2"); - - ret = H5Dwrite(Dataset2, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data2); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Create third dataset */ - Dataset3 = H5Dcreate2(file_id, MISC14_DSET3_NAME, H5T_NATIVE_DOUBLE, DataSpace, H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(Dataset2, FAIL, "H5Dcreate2"); - - ret = H5Dwrite(Dataset3, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &data3); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Check data from first dataset */ - ret = H5Dread(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); - CHECK(ret, FAIL, "H5Dread"); - if (!H5_DBL_ABS_EQUAL(rdata, data1)) - TestErrPrintf("Error on line %d: data1!=rdata\n", __LINE__); - - /* Check data from third dataset */ - ret = H5Dread(Dataset3, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); - CHECK(ret, FAIL, "H5Dread"); - if (!H5_DBL_ABS_EQUAL(rdata, data3)) - TestErrPrintf("Error on line %d: data3!=rdata\n", __LINE__); - - /* Unlink second dataset */ - ret = H5Ldelete(file_id, MISC14_DSET2_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close second dataset */ - ret = H5Dclose(Dataset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Verify the data from dataset #1 */ - ret = H5Dread(Dataset1, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); - CHECK(ret, FAIL, "H5Dread"); - if (!H5_DBL_ABS_EQUAL(rdata, data1)) - TestErrPrintf("Error on line %d: data1!=rdata\n", __LINE__); - - /* Verify the data from dataset #3 */ - ret = H5Dread(Dataset3, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rdata); - CHECK(ret, FAIL, "H5Dread"); - if (!H5_DBL_ABS_EQUAL(rdata, data3)) - TestErrPrintf("Error on line %d: data3!=rdata\n", __LINE__); - - /* Close first dataset */ - ret = H5Dclose(Dataset1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close third dataset */ - ret = H5Dclose(Dataset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close shared objects (dataspace & fapl) */ - ret = H5Sclose(DataSpace); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - -} /* end test_misc14() */ - -/**************************************************************** -** -** test_misc15(): Test that checking a file's access property list -** more than once correctly increments internal reference counts. -** -****************************************************************/ -static void -test_misc15(void) -{ - char filename[MISC15_BUF_SIZE]; - hid_t file; /* File ID */ - hid_t fapl; /* File access property list */ - herr_t ret; /* Generic return value */ - - fapl = h5_fileaccess(); - h5_fixname(MISC15_FILE, fapl, filename, MISC15_BUF_SIZE); - - /* Create the file & get it's FAPL */ - file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(file, FAIL, "H5Fcreate"); - - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - fapl = H5Fget_access_plist(file); - CHECK(fapl, FAIL, "H5Fget_access_plist"); - - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open the file & get it's FAPL again */ - file = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fopen"); - - fapl = H5Fget_access_plist(file); - CHECK(fapl, FAIL, "H5Fget_access_plist"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Verify that the file is still OK */ - ret = H5Fis_accessible(filename, fapl); - CHECK(ret, FAIL, "H5Fis_accessible"); - - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - file = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fopen"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc15() */ - -/**************************************************************** -** -** test_misc16(): Test array of NULL-terminated -** fixed-length string. It creates a dataset of fixed-length -** strings. Each string is MISC16_STR_SIZE long. There are -** totally MISC16_SPACE_DIM by MISC16_SPACE_RANK strings. -** -****************************************************************/ -static void -test_misc16(void) -{ - hid_t file; /* File ID */ - herr_t ret; /* Generic return value */ - char wdata[MISC16_SPACE_DIM][MISC16_STR_SIZE]; - char rdata[MISC16_SPACE_DIM][MISC16_STR_SIZE]; /* Information read in */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hsize_t dims[] = {MISC16_SPACE_DIM}; - int i; - - memset(wdata, 0, sizeof(wdata)); - memset(rdata, 0, sizeof(rdata)); - - /* Initialize the data */ - /* (Note that these are supposed to stress the code, so are a little weird) */ - memcpy(wdata[0], "1234567", MISC16_STR_SIZE); - memcpy(wdata[1], "1234567\0", MISC16_STR_SIZE); - memcpy(wdata[2], "12345678", MISC16_STR_SIZE); - memcpy(wdata[3], "\0\0\0\0\0\0\0\0", MISC16_STR_SIZE); - - /* Create the file */ - file = H5Fcreate(MISC16_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid = H5Screate_simple(MISC16_SPACE_RANK, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - tid = H5Tcopy(H5T_C_S1); - CHECK(tid, FAIL, "H5Tcopy"); - - ret = H5Tset_size(tid, (size_t)MISC16_STR_SIZE); - CHECK(ret, FAIL, "H5Tset_size"); - - /*ret = H5Tset_strpad(tid,H5T_STR_NULLPAD); - CHECK(ret, FAIL, "H5Tset_strpad");*/ - - /* Create a dataset */ - dataset = H5Dcreate2(file, MISC16_DSET_NAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < MISC16_SPACE_DIM; i++) { - if (strlen(wdata[i]) != strlen(rdata[i])) { - TestErrPrintf( - "Line %u: VL data length don't match!, strlen(wdata[%d])=%d, strlen(rdata[%d])=%d\n", - (unsigned)__LINE__, (int)i, (int)strlen(wdata[i]), (int)i, (int)strlen(rdata[i])); - continue; - } /* end if */ - if (strcmp(wdata[i], rdata[i]) != 0) { - TestErrPrintf("Line %u: VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n", - (unsigned)__LINE__, (int)i, wdata[i], (int)i, rdata[i]); - continue; - } /* end if */ - } /* end for */ - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc16() */ - -/**************************************************************** -** -** test_misc17(): Test array of characters. It creates a dataset -** of ASCII characters, with dimensionality of MISC17_SPACE_DIM1 -** by MISC17_SPACE_DIM2. -** -****************************************************************/ -static void -test_misc17(void) -{ - hid_t file; /* File ID */ - herr_t ret; /* Generic return value */ - char wdata[MISC17_SPACE_DIM1][MISC17_SPACE_DIM2]; - char rdata[MISC17_SPACE_DIM1][MISC17_SPACE_DIM2]; /* Information read in */ - hid_t dataset; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hsize_t dims[] = {MISC17_SPACE_DIM1, MISC17_SPACE_DIM2}; - int i; - - memset(wdata, 0, sizeof(wdata)); - memset(rdata, 0, sizeof(rdata)); - - /* Initialize the data */ - /* (Note that these are supposed to stress the code, so are a little weird) */ - memcpy(wdata[0], "1234567", MISC17_SPACE_DIM2); - memcpy(wdata[1], "1234567\0", MISC17_SPACE_DIM2); - memcpy(wdata[2], "12345678", MISC17_SPACE_DIM2); - memcpy(wdata[3], "\0\0\0\0\0\0\0\0", MISC17_SPACE_DIM2); - - /* Create the file */ - file = H5Fcreate(MISC17_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid = H5Screate_simple(MISC17_SPACE_RANK, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - tid = H5Tcopy(H5T_C_S1); - CHECK(tid, FAIL, "H5Tcopy"); - - ret = H5Tset_strpad(tid, H5T_STR_NULLPAD); - CHECK(ret, FAIL, "H5Tset_strpad"); - - /* Create a dataset */ - dataset = H5Dcreate2(file, MISC17_DSET_NAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data in the way of strings. */ - for (i = 0; i < MISC17_SPACE_DIM1; i++) { - if (strlen(wdata[i]) != strlen(rdata[i])) { - TestErrPrintf( - "Line %u: VL data length don't match!, strlen(wdata[%d])=%d, strlen(rdata[%d])=%d\n", - (unsigned)__LINE__, (int)i, (int)strlen(wdata[i]), (int)i, (int)strlen(rdata[i])); - continue; - } /* end if */ - if (strcmp(wdata[i], rdata[i]) != 0) { - TestErrPrintf("Line %u: VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n", - (unsigned)__LINE__, (int)i, wdata[i], (int)i, rdata[i]); - continue; - } /* end if */ - } /* end for */ - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc17() */ - -/**************************************************************** -** -** test_misc18(): Test new object header information in H5O_info_t -** struct. -** -****************************************************************/ -static void -test_misc18(void) -{ - hid_t fid; /* File ID */ - hid_t sid; /* 'Space ID */ - hid_t did1, did2; /* Dataset IDs */ - hid_t aid; /* Attribute ID */ -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - H5O_info1_t old_oinfo; /* (deprecated) information about object */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -#endif - H5O_info2_t oinfo; /* Data model information about object */ -#if 0 - H5O_native_info_t ninfo; /* Native file format information about object */ -#endif - char attr_name[32]; /* Attribute name buffer */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Create the file */ - fid = H5Fcreate(MISC18_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataspace for attributes */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create first dataset */ - did1 = H5Dcreate2(fid, MISC18_DSET1_NAME, H5T_STD_U32LE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did1, FAIL, "H5Dcreate2"); - - /* Get object information */ - ret = H5Oget_info_by_name3(fid, MISC18_DSET1_NAME, &oinfo, H5O_INFO_NUM_ATTRS, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(oinfo.num_attrs, 0, "H5Oget_info_by_name"); -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - ret = H5Oget_info_by_name2(fid, MISC18_DSET1_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nmesgs, 6, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nchunks, 1, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.total, 272, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.free, 152, "H5Oget_info_by_name"); - VERIFY(old_oinfo.num_attrs, 0, "H5Oget_info_by_name"); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - ret = H5Oget_native_info_by_name(fid, MISC18_DSET1_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nmesgs, 6, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nchunks, 1, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.total, 272, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.free, 152, "H5Oget_native_info_by_name"); -#endif - - /* Create second dataset */ - did2 = H5Dcreate2(fid, MISC18_DSET2_NAME, H5T_STD_U32LE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did2, FAIL, "H5Dcreate2"); - - /* Get object information */ - ret = H5Oget_info_by_name3(fid, MISC18_DSET2_NAME, &oinfo, H5O_INFO_NUM_ATTRS, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(oinfo.num_attrs, 0, "H5Oget_info_by_name"); -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - ret = H5Oget_info_by_name2(fid, MISC18_DSET2_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nmesgs, 6, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nchunks, 1, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.total, 272, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.free, 152, "H5Oget_info_by_name"); - VERIFY(old_oinfo.num_attrs, 0, "H5Oget_info_by_name"); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - ret = H5Oget_native_info_by_name(fid, MISC18_DSET2_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nmesgs, 6, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nchunks, 1, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.total, 272, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.free, 152, "H5Oget_native_info_by_name"); -#endif - - /* Loop creating attributes on each dataset, flushing them to the file each time */ - for (u = 0; u < 10; u++) { - /* Set up attribute name */ - snprintf(attr_name, sizeof(attr_name), "Attr %u", u); - - /* Create & close attribute on first dataset */ - aid = H5Acreate2(did1, attr_name, H5T_STD_U32LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create & close attribute on second dataset */ - aid = H5Acreate2(did2, attr_name, H5T_STD_U32LE, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Flush file, to 'fix' size of dataset object headers */ - ret = H5Fflush(fid, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - } /* end for */ - - /* Get object information for dataset #1 now */ - ret = H5Oget_info_by_name3(fid, MISC18_DSET1_NAME, &oinfo, H5O_INFO_NUM_ATTRS, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(oinfo.num_attrs, 10, "H5Oget_info_by_name"); -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - ret = H5Oget_info_by_name2(fid, MISC18_DSET1_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nmesgs, 24, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nchunks, 9, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.total, 888, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.free, 16, "H5Oget_info_by_name"); - VERIFY(old_oinfo.num_attrs, 10, "H5Oget_info_by_name"); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - ret = H5Oget_native_info_by_name(fid, MISC18_DSET1_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nmesgs, 24, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nchunks, 9, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.total, 888, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.free, 16, "H5Oget_native_info_by_name"); -#endif - - /* Get object information for dataset #2 now */ - ret = H5Oget_info_by_name3(fid, MISC18_DSET2_NAME, &oinfo, H5O_INFO_NUM_ATTRS, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(oinfo.num_attrs, 10, "H5Oget_info_by_name"); -#if 0 -#ifndef H5_NO_DEPRECATED_SYMBOLS - ret = H5Oget_info_by_name2(fid, MISC18_DSET2_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nmesgs, 24, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nchunks, 9, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.total, 888, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.free, 16, "H5Oget_info_by_name"); - VERIFY(old_oinfo.num_attrs, 10, "H5Oget_info_by_name"); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - ret = H5Oget_native_info_by_name(fid, MISC18_DSET2_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_mative_info_by_name"); - VERIFY(ninfo.hdr.nmesgs, 24, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nchunks, 9, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.total, 888, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.free, 16, "H5Oget_native_info_by_name"); -#endif - - /* Close second dataset */ - ret = H5Dclose(did2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close first dataset */ - ret = H5Dclose(did1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc18() */ - -/**************************************************************** -** -** test_misc19(): Test incrementing & decrementing ref count on IDs -** -****************************************************************/ -static void -test_misc19(void) -{ - hid_t fid = -1; /* File ID */ - hid_t sid = -1; /* Dataspace ID */ - hid_t did = -1; /* Dataset ID */ - hid_t tid = -1; /* Datatype ID */ - hid_t aid = -1; /* Attribute ID */ - hid_t plid = -1; /* Property List ID */ - hid_t pcid = -1; /* Property Class ID */ - hid_t gid = -1; /* Group ID */ - hid_t ecid = -1; /* Error Class ID */ - hid_t emid = -1; /* Error Message ID */ - hid_t esid = -1; /* Error Stack ID */ -#if 0 - hid_t vfdid = -1; /* Virtual File Driver ID */ - hid_t volid = -1; /* Virtual Object Layer ID */ - H5FD_class_t *vfd_cls = NULL; /* VFD class */ - H5VL_class_t *vol_cls = NULL; /* VOL class */ -#endif - int rc; /* Reference count */ - herr_t ret; /* Generic return value */ - - /* Check H5I operations on files */ - - /* Create the file */ - fid = H5Fcreate(MISC19_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Check the reference count */ - rc = H5Iget_ref(fid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(fid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the file normally */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Check the reference count */ - rc = H5Iget_ref(fid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the file by decrementing the reference count */ - rc = H5Idec_ref(fid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the file again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Fclose(fid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fclose"); - - /* Check H5I operations on property lists */ - - /* Create the property list */ - plid = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plid, FAIL, "H5Pcreate"); - - /* Check the reference count */ - rc = H5Iget_ref(plid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(plid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the property list normally */ - ret = H5Pclose(plid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Check the reference count */ - rc = H5Iget_ref(plid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the property list by decrementing the reference count */ - rc = H5Idec_ref(plid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the property list again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Pclose(plid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pclose"); - - /* Check H5I operations on property classes */ - - /* Create a property class */ - pcid = H5Pcreate_class(H5P_DATASET_CREATE, "foo", NULL, NULL, NULL, NULL, NULL, NULL); - CHECK(pcid, FAIL, "H5Pcreate_class"); - - /* Check the reference count */ - rc = H5Iget_ref(pcid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(pcid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the property class normally */ - ret = H5Pclose_class(pcid); - CHECK(ret, FAIL, "H5Pclose_class"); - - /* Check the reference count */ - rc = H5Iget_ref(pcid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the property class by decrementing the reference count */ - rc = H5Idec_ref(pcid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the property class again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Pclose_class(pcid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Pclose_class"); - - /* Check H5I operations on datatypes */ - - /* Create a datatype */ - tid = H5Tcreate(H5T_OPAQUE, (size_t)16); - CHECK(tid, FAIL, "H5Tcreate"); - - /* Check the reference count */ - rc = H5Iget_ref(tid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(tid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the datatype normally */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Check the reference count */ - rc = H5Iget_ref(tid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the datatype by decrementing the reference count */ - rc = H5Idec_ref(tid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the datatype again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Tclose(tid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Tclose"); - - /* Check H5I operations on dataspaces */ - - /* Create a dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Check the reference count */ - rc = H5Iget_ref(sid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(sid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the dataspace normally */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Check the reference count */ - rc = H5Iget_ref(sid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the dataspace by decrementing the reference count */ - rc = H5Idec_ref(sid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the dataspace again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Sclose(sid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sclose"); - - /* Check H5I operations on datasets */ - - /* Create a file */ - fid = H5Fcreate(MISC19_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a dataset */ - did = H5Dcreate2(fid, MISC19_DSET_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Check the reference count */ - rc = H5Iget_ref(did); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(did); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the dataset normally */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Check the reference count */ - rc = H5Iget_ref(did); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the dataset by decrementing the reference count */ - rc = H5Idec_ref(did); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the dataset again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Dclose(did); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Check H5I operations on attributes */ - - /* Create a file */ - fid = H5Fcreate(MISC19_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Open the root group */ - gid = H5Gopen2(fid, "/", H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create a dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create an attribute */ - aid = H5Acreate2(gid, MISC19_ATTR_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Check the reference count */ - rc = H5Iget_ref(aid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(aid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the dataset normally */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Check the reference count */ - rc = H5Iget_ref(aid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the attribute by decrementing the reference count */ - rc = H5Idec_ref(aid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the attribute again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Aclose(aid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aclose"); - - /* Close the root group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Check H5I operations on groups */ - - /* Create a file */ - fid = H5Fcreate(MISC19_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a group */ - gid = H5Gcreate2(fid, MISC19_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Check the reference count */ - rc = H5Iget_ref(gid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(gid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the group normally */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Check the reference count */ - rc = H5Iget_ref(gid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the group by decrementing the reference count */ - rc = H5Idec_ref(gid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the group again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Gclose(gid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Gclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Check H5I operations on error classes */ - - /* Create an error class */ - ecid = H5Eregister_class("foo", "bar", "baz"); - CHECK(ecid, FAIL, "H5Eregister_class"); - - /* Check the reference count */ - rc = H5Iget_ref(ecid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(ecid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the error class normally */ - ret = H5Eunregister_class(ecid); - CHECK(ret, FAIL, "H5Eunregister_class"); - - /* Check the reference count */ - rc = H5Iget_ref(ecid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the error class by decrementing the reference count */ - rc = H5Idec_ref(ecid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the error class again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Eunregister_class(ecid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Eunregister_class"); - - /* Check H5I operations on error messages */ - - /* Create an error class */ - ecid = H5Eregister_class("foo", "bar", "baz"); - CHECK(ecid, FAIL, "H5Eregister_class"); - - /* Create an error message */ - emid = H5Ecreate_msg(ecid, H5E_MAJOR, "mumble"); - CHECK(emid, FAIL, "H5Ecreate_msg"); - - /* Check the reference count */ - rc = H5Iget_ref(emid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(emid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the error message normally */ - ret = H5Eclose_msg(emid); - CHECK(ret, FAIL, "H5Eclose_msg"); - - /* Check the reference count */ - rc = H5Iget_ref(emid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the error message by decrementing the reference count */ - rc = H5Idec_ref(emid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the error message again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Eclose_msg(emid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Eclose_msg"); - - /* Close the error class */ - ret = H5Eunregister_class(ecid); - CHECK(ret, FAIL, "H5Eunregister_class"); - - /* Check H5I operations on error stacks */ - - /* Create an error stack */ - esid = H5Eget_current_stack(); - CHECK(esid, FAIL, "H5Eget_current_stack"); - - /* Check the reference count */ - rc = H5Iget_ref(esid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Inc the reference count */ - rc = H5Iinc_ref(esid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Close the error stack normally */ - ret = H5Eclose_stack(esid); - CHECK(ret, FAIL, "H5Eclose_stack"); - - /* Check the reference count */ - rc = H5Iget_ref(esid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Close the error stack by decrementing the reference count */ - rc = H5Idec_ref(esid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try closing the error stack again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Eclose_stack(esid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Eclose_stack"); - -#if 0 - /* Check H5I operations on virtual file drivers */ - - /* Get a VFD class to register */ - vfd_cls = h5_get_dummy_vfd_class(); - CHECK_PTR(vfd_cls, "h5_get_dummy_vfd_class"); - - /* Register a virtual file driver */ - vfdid = H5FDregister(vfd_cls); - CHECK(vfdid, FAIL, "H5FDregister"); - - /* Check the reference count */ - rc = H5Iget_ref(vfdid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Increment the reference count */ - rc = H5Iinc_ref(vfdid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Unregister the VFD normally */ - ret = H5FDunregister(vfdid); - CHECK(ret, FAIL, "H5FDunregister"); - - /* Check the reference count */ - rc = H5Iget_ref(vfdid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Unregister the VFD by decrementing the reference count */ - rc = H5Idec_ref(vfdid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try unregistering the VFD again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5FDunregister(vfdid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5FDunregister"); - - free(vfd_cls); - - /* Check H5I operations on virtual object connectors */ - - /* Get a VOL class to register */ - vol_cls = h5_get_dummy_vol_class(); - CHECK_PTR(vol_cls, "h5_get_dummy_vol_class"); - - /* Register a VOL connector */ - volid = H5VLregister_connector(vol_cls, H5P_DEFAULT); - CHECK(volid, FAIL, "H5VLregister_connector"); - - /* Check the reference count */ - rc = H5Iget_ref(volid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Increment the reference count */ - rc = H5Iinc_ref(volid); - VERIFY(rc, 2, "H5Iinc_ref"); - - /* Unregister the VOL connector normally */ - ret = H5VLunregister_connector(volid); - CHECK(ret, FAIL, "H5VLunregister_connector"); - - /* Check the reference count */ - rc = H5Iget_ref(volid); - VERIFY(rc, 1, "H5Iget_ref"); - - /* Unregister the VOL connector by decrementing the reference count */ - rc = H5Idec_ref(volid); - VERIFY(rc, 0, "H5Idec_ref"); - - /* Try unregistering the VOL connector again (should fail) */ - H5E_BEGIN_TRY - { - ret = H5VLunregister_connector(volid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5VLunregister_connector"); - - free(vol_cls); -#endif -} /* end test_misc19() */ - -/**************************************************************** -** -** test_misc20(): Test problems with version 2 of storage layout -** message truncating dimensions -** -****************************************************************/ -#if 0 -static void -test_misc20(void) -{ - hid_t fid; /* File ID */ - hid_t sid; /* 'Space ID */ - hid_t did; /* Dataset ID */ - hid_t dcpl; /* Dataset creation property list ID */ - int rank = MISC20_SPACE_RANK; /* Rank of dataspace */ - hsize_t big_dims[MISC20_SPACE_RANK] = {MISC20_SPACE_DIM0, MISC20_SPACE_DIM1}; /* Large dimensions */ - hsize_t small_dims[MISC20_SPACE_RANK] = {MISC20_SPACE2_DIM0, MISC20_SPACE2_DIM1}; /* Small dimensions */ - unsigned version; /* Version of storage layout info */ - hsize_t contig_size; /* Size of contiguous storage size from layout into */ - const char *testfile = H5_get_srcdir_filename(MISC20_FILE_OLD); /* Corrected test file name */ - bool driver_is_default_compatible; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing large dimension truncation fix\n")); - - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); - - if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); - return; - } - - /* Verify that chunks with dimensions that are too large get rejected */ - - /* Create a dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Try to use chunked storage for this dataset */ - ret = H5Pset_chunk(dcpl, rank, big_dims); - VERIFY(ret, FAIL, "H5Pset_chunk"); - - /* Verify that the storage for the dataset is the correct size and hasn't - * been truncated. - */ - - /* Create the file */ - fid = H5Fcreate(MISC20_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataspace with _really_ big dimensions */ - sid = H5Screate_simple(rank, big_dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Make certain that the dataset's storage doesn't get allocated :-) */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create dataset with big dataspace */ - did = H5Dcreate2(fid, MISC20_DSET_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Close datasset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace with small dimensions */ - sid = H5Screate_simple(rank, small_dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create dataset with big dataspace */ - did = H5Dcreate2(fid, MISC20_DSET2_NAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Close datasset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid = H5Fopen(MISC20_FILE, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open dataset with big dimensions */ - did = H5Dopen2(fid, MISC20_DSET_NAME, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Get the layout version */ - ret = H5D__layout_version_test(did, &version); - CHECK(ret, FAIL, "H5D__layout_version_test"); - VERIFY(version, 3, "H5D__layout_version_test"); - - /* Get the layout contiguous storage size */ - ret = H5D__layout_contig_size_test(did, &contig_size); - CHECK(ret, FAIL, "H5D__layout_contig_size_test"); - VERIFY(contig_size, (MISC20_SPACE_DIM0 * MISC20_SPACE_DIM1 * H5Tget_size(H5T_NATIVE_INT)), - "H5D__layout_contig_size_test"); - - /* Close datasset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open dataset with small dimensions */ - did = H5Dopen2(fid, MISC20_DSET2_NAME, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Get the layout version */ - ret = H5D__layout_version_test(did, &version); - CHECK(ret, FAIL, "H5D__layout_version_test"); - VERIFY(version, 3, "H5D__layout_version_test"); - - /* Get the layout contiguous storage size */ - ret = H5D__layout_contig_size_test(did, &contig_size); - CHECK(ret, FAIL, "H5D__layout_contig_size_test"); - VERIFY(contig_size, (MISC20_SPACE2_DIM0 * MISC20_SPACE2_DIM1 * H5Tget_size(H5T_NATIVE_INT)), - "H5D__layout_contig_size_test"); - - /* Close datasset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Verify that the storage size is computed correctly for older versions of layout info */ - - /* - * Open the old file and the dataset and get old settings. - */ - fid = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open dataset with small dimensions */ - did = H5Dopen2(fid, MISC20_DSET_NAME, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); - - /* Get the layout version */ - ret = H5D__layout_version_test(did, &version); - CHECK(ret, FAIL, "H5D__layout_version_test"); - VERIFY(version, 2, "H5D__layout_version_test"); - - /* Get the layout contiguous storage size */ - ret = H5D__layout_contig_size_test(did, &contig_size); - CHECK(ret, FAIL, "H5D__layout_contig_size_test"); - VERIFY(contig_size, (MISC20_SPACE_DIM0 * MISC20_SPACE_DIM1 * H5Tget_size(H5T_STD_I32LE)), - "H5D__layout_contig_size_test"); - - /* Close datasset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_misc20() */ -#endif - -/* - test_misc21 and test_misc22 should be executed when SZIP is present - and encoder is available. - EIP 2004/8/04 -*/ -#if defined(H5_HAVE_FILTER_SZIP) && !defined(H5_API_TEST_NO_FILTERS) - -/**************************************************************** -** -** test_misc21(): Test that late allocation time is treated the same -** as incremental allocation time, for chunked datasets -** when overwriting entire dataset where the chunks -** don't exactly match the dataspace. -** -****************************************************************/ -static void -test_misc21(void) -{ - hid_t fid, sid, dcpl, dsid; - char *buf; - hsize_t dims[2] = {MISC21_SPACE_DIM0, MISC21_SPACE_DIM1}, - chunk_size[2] = {MISC21_CHUNK_DIM0, MISC21_CHUNK_DIM1}; - herr_t ret; /* Generic return value */ - - if (h5_szip_can_encode() != 1) - return; - /* Output message about test being performed */ - MESSAGE(5, ("Testing late allocation time w/chunks & filters\n")); - - /* Allocate space for the buffer */ - buf = (char *)calloc(MISC21_SPACE_DIM0 * MISC21_SPACE_DIM1, 1); - CHECK(buf, NULL, "calloc"); - - /* Create the file */ - fid = H5Fcreate(MISC21_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create the DCPL */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Set custom DCPL properties */ - ret = H5Pset_chunk(dcpl, MISC21_SPACE_RANK, chunk_size); - CHECK(ret, FAIL, "H5Pset_chunk"); - ret = H5Pset_szip(dcpl, H5_SZIP_NN_OPTION_MASK, 8); - CHECK(ret, FAIL, "H5Pset_deflate"); - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_LATE); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - /* Create the dataspace for the dataset */ - sid = H5Screate_simple(MISC21_SPACE_RANK, dims, NULL); - CHECK(ret, FAIL, "H5Screate_simple"); - - /* Create the dataset */ - dsid = H5Dcreate2(fid, MISC21_DSET_NAME, H5T_NATIVE_UINT8, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dsid, FAIL, "H5Dcreate2"); - - /* Write out the whole dataset */ - ret = H5Dwrite(dsid, H5T_NATIVE_UINT8, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close everything */ - ret = H5Dclose(dsid); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - free(buf); -} /* end test_misc21() */ - -/**************************************************************** -** -** test_misc22(): Test SZIP bits-per-pixel parameter. -** This should be set according to the datatype. -** Tests for precision and offset combo's. -** -****************************************************************/ -static void -test_misc22(void) -{ - hid_t fid, sid, dcpl, dsid, dcpl2; - char *buf; - hsize_t dims[2] = {MISC22_SPACE_DIM0, MISC22_SPACE_DIM1}, - chunk_size[2] = {MISC22_CHUNK_DIM0, MISC22_CHUNK_DIM1}; - herr_t ret; /* Generic return value */ - hid_t dtype; - /* should extend test to signed ints */ - hid_t idts[4]; - /* do the same for floats - hid_t fdts[2]={H5T_NATIVE_FLOAT32, - H5T_NATIVE_FLOAT64} - */ - size_t prec[4] = {3, 11, 19, 27}; - size_t offsets[5] = {0, 3, 11, 19, 27}; - int i, j, k; - unsigned int flags; - size_t cd_nelmts = 32; - unsigned int cd_values[32]; - size_t correct; - - if (h5_szip_can_encode() != 1) - return; - idts[0] = H5Tcopy(H5T_NATIVE_UINT8); - idts[1] = H5Tcopy(H5T_NATIVE_UINT16); - idts[2] = H5Tcopy(H5T_NATIVE_UINT32); - idts[3] = H5Tcopy(H5T_NATIVE_UINT64); - - /* Output message about test being performed */ - MESSAGE(5, ("Testing datatypes with SZIP filter\n")); - - /* Allocate space for the buffer */ - buf = (char *)calloc(MISC22_SPACE_DIM0 * MISC22_SPACE_DIM1, 8); - CHECK(buf, NULL, "calloc"); - - /* Create the file */ - fid = H5Fcreate(MISC22_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create the dataspace for the dataset */ - sid = H5Screate_simple(MISC22_SPACE_RANK, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - for (i = 0; i < 4; i++) { - for (j = 0; j < 4; j++) { - if (prec[j] > (H5Tget_size(idts[i]) * 8)) - continue; /* skip irrelevant combination */ - for (k = 0; k < 5; k++) { - if (offsets[k] > (H5Tget_size(idts[i]) * 8)) - continue; /* skip irrelevant combinations */ - if ((prec[j] + offsets[k]) > (H5Tget_size(idts[i]) * 8)) - continue; - - MESSAGE(5, (" Testing datatypes size=%zu precision=%u offset=%d\n", H5Tget_size(idts[i]), - (unsigned)prec[j], (unsigned)offsets[k])); - - /* Create the DCPL */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Set DCPL properties */ - ret = H5Pset_chunk(dcpl, MISC22_SPACE_RANK, chunk_size); - CHECK(ret, FAIL, "H5Pset_chunk"); - /* Set custom DCPL properties */ - ret = H5Pset_szip(dcpl, H5_SZIP_NN_OPTION_MASK, 32); /* vary the PPB */ - CHECK(ret, FAIL, "H5Pset_szip"); - - /* set up the datatype according to the loop */ - dtype = H5Tcopy(idts[i]); - CHECK(dtype, FAIL, "H5Tcopy"); - ret = H5Tset_precision(dtype, prec[j]); - CHECK(ret, FAIL, "H5Tset_precision"); - ret = H5Tset_offset(dtype, offsets[k]); - CHECK(ret, FAIL, "H5Tset_precision"); - - /* compute the correct PPB that should be set by SZIP */ - if (offsets[k] == 0) - correct = prec[j]; - else - correct = H5Tget_size(idts[i]) * 8; - if (correct > 24) { - if (correct <= 32) - correct = 32; - else if (correct <= 64) - correct = 64; - } /* end if */ - - /* Create the dataset */ - dsid = H5Dcreate2(fid, MISC22_DSET_NAME, dtype, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dsid, FAIL, "H5Dcreate2"); - - /* Write out the whole dataset */ - ret = H5Dwrite(dsid, dtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close everything */ - ret = H5Dclose(dsid); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - dsid = H5Dopen2(fid, MISC22_DSET_NAME, H5P_DEFAULT); - CHECK(dsid, FAIL, "H5Dopen2"); - - dcpl2 = H5Dget_create_plist(dsid); - CHECK(dcpl2, FAIL, "H5Dget_create_plist"); - - ret = H5Pget_filter_by_id2(dcpl2, H5Z_FILTER_SZIP, &flags, &cd_nelmts, cd_values, 0, NULL, - NULL); - CHECK(ret, FAIL, "H5Pget_filter_by_id2"); - - VERIFY(cd_values[2], (unsigned)correct, "SZIP filter returned value for precision"); - - ret = H5Dclose(dsid); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Ldelete(fid, MISC22_DSET_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - ret = H5Pclose(dcpl2); - CHECK(ret, FAIL, "H5Pclose"); - } - } - } - ret = H5Tclose(idts[0]); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(idts[1]); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(idts[2]); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(idts[3]); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - free(buf); -} /* end test_misc22() */ -#endif /* H5_HAVE_FILTER_SZIP */ - -/**************************************************************** -** -** test_misc23(): Test intermediate group creation. -** -****************************************************************/ -static void -test_misc23(void) -{ - hsize_t dims[] = {10}; - hid_t file_id = 0, group_id = 0, type_id = 0, space_id = 0, tmp_id = 0, create_id = H5P_DEFAULT, - access_id = H5P_DEFAULT; - char objname[MISC23_NAME_BUF_SIZE]; /* Name of object */ - H5O_info2_t oinfo; - htri_t tri_status; - ssize_t namelen; - herr_t status; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing intermediate group creation\n")); - - /* Create a new file using default properties. */ - file_id = H5Fcreate(MISC23_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Build some infrastructure */ - group_id = H5Gcreate2(file_id, "/A", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group_id, FAIL, "H5Gcreate2"); - - space_id = H5Screate_simple(1, dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - - type_id = H5Tcopy(H5T_STD_I32BE); - CHECK(type_id, FAIL, "H5Tcopy"); - -#ifndef H5_NO_DEPRECATED_SYMBOLS - /********************************************************************** - * test the old APIs - **********************************************************************/ - - H5E_BEGIN_TRY - { - tmp_id = H5Gcreate1(file_id, "/A/B00a/grp", (size_t)0); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Gcreate1"); - - /* Make sure that size_hint values that can't fit into a 32-bit - * unsigned integer are rejected. Only necessary on systems where - * size_t is a 64-bit type. - */ - if (SIZE_MAX > UINT32_MAX) { - H5E_BEGIN_TRY - { - tmp_id = H5Gcreate1(file_id, "/size_hint_too_large", SIZE_MAX); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Gcreate1"); - } - - /* Make sure the largest size_hint value works */ - H5E_BEGIN_TRY - { - tmp_id = H5Gcreate1(file_id, "/largest_size_hint", UINT32_MAX); - } - H5E_END_TRY - CHECK(tmp_id, FAIL, "H5Gcreate1"); - status = H5Gclose(tmp_id); - CHECK(status, FAIL, "H5Gclose"); - - tmp_id = H5Gcreate1(file_id, "/A/grp", (size_t)0); - CHECK(tmp_id, FAIL, "H5Gcreate1"); - status = H5Gclose(tmp_id); - CHECK(status, FAIL, "H5Gclose"); - - H5E_BEGIN_TRY - { - tmp_id = H5Dcreate1(file_id, "/A/B00c/dset", type_id, space_id, create_id); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Dcreate1"); - - tmp_id = H5Dcreate1(file_id, "/A/dset", type_id, space_id, create_id); - CHECK(tmp_id, FAIL, "H5Dcreate1"); - status = H5Dclose(tmp_id); - CHECK(status, FAIL, "H5Dclose"); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - - /********************************************************************** - * test H5Gcreate2() - **********************************************************************/ - - /* Create link creation property list */ - create_id = H5Pcreate(H5P_LINK_CREATE); - CHECK(create_id, FAIL, "H5Pcreate"); - - /* Set flag for intermediate group creation */ - status = H5Pset_create_intermediate_group(create_id, true); - CHECK(status, FAIL, "H5Pset_create_intermediate_group"); - - tmp_id = H5Gcreate2(file_id, "/A/B01/grp", create_id, H5P_DEFAULT, access_id); - CHECK(tmp_id, FAIL, "H5Gcreate2"); - - /* Query that the name of the new group is correct */ - namelen = H5Iget_name(tmp_id, objname, (size_t)MISC23_NAME_BUF_SIZE); - CHECK(namelen, FAIL, "H5Iget_name"); - VERIFY_STR(objname, "/A/B01/grp", "H5Iget_name"); - - status = H5Gclose(tmp_id); - CHECK(status, FAIL, "H5Gclose"); - - /* Check that intermediate group is set up correctly */ - tmp_id = H5Gopen2(file_id, "/A/B01", H5P_DEFAULT); - CHECK(tmp_id, FAIL, "H5Gopen2"); - - status = H5Oget_info3(tmp_id, &oinfo, H5O_INFO_BASIC); - CHECK(status, FAIL, "H5Oget_info3"); - VERIFY(oinfo.rc, 1, "H5Oget_info3"); - - status = H5Gclose(tmp_id); - CHECK(status, FAIL, "H5Gclose"); - - tmp_id = H5Gcreate2(file_id, "/A/B02/C02/grp", create_id, H5P_DEFAULT, access_id); - CHECK(tmp_id, FAIL, "H5Gcreate2"); - - status = H5Gclose(tmp_id); - CHECK(status, FAIL, "H5Gclose"); - - tmp_id = H5Gcreate2(group_id, "B03/grp/", create_id, H5P_DEFAULT, access_id); - CHECK(tmp_id, FAIL, "H5Gcreate2"); - - status = H5Gclose(tmp_id); - CHECK(status, FAIL, "H5Gclose"); - - tmp_id = H5Gcreate2(group_id, "/A/B04/grp/", create_id, H5P_DEFAULT, access_id); - CHECK(tmp_id, FAIL, "H5Gcreate2"); - - status = H5Gclose(tmp_id); - CHECK(status, FAIL, "H5Gclose"); - - tmp_id = H5Gcreate2(file_id, "/A/B05/C05/A", create_id, H5P_DEFAULT, access_id); - CHECK(tmp_id, FAIL, "H5Gcreate2"); - - status = H5Gclose(tmp_id); - CHECK(status, FAIL, "H5Gclose"); - - status = H5Pclose(create_id); - CHECK(status, FAIL, "H5Pclose"); - - /********************************************************************** - * test H5Dcreate2() - **********************************************************************/ - - /* Create link creation property list */ - create_id = H5Pcreate(H5P_LINK_CREATE); - CHECK(create_id, FAIL, "H5Pcreate"); - - /* Set flag for intermediate group creation */ - status = H5Pset_create_intermediate_group(create_id, true); - CHECK(status, FAIL, "H5Pset_create_intermediate_group"); - - tmp_id = H5Dcreate2(file_id, "/A/B06/dset", type_id, space_id, create_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(tmp_id, FAIL, "H5Dcreate2"); - - status = H5Dclose(tmp_id); - CHECK(status, FAIL, "H5Dclose"); - - tmp_id = H5Dcreate2(file_id, "/A/B07/B07/dset", type_id, space_id, create_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(tmp_id, FAIL, "H5Dcreate2"); - - status = H5Dclose(tmp_id); - CHECK(status, FAIL, "H5Dclose"); - - tmp_id = H5Dcreate2(group_id, "B08/dset", type_id, space_id, create_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(tmp_id, FAIL, "H5Dcreate2"); - - status = H5Dclose(tmp_id); - CHECK(status, FAIL, "H5Dclose"); - - tmp_id = H5Dcreate2(group_id, "/A/B09/dset", type_id, space_id, create_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(tmp_id, FAIL, "H5Dcreate2"); - - status = H5Dclose(tmp_id); - CHECK(status, FAIL, "H5Dclose"); - - tmp_id = H5Dcreate2(file_id, "/A/B10/C10/A/dset", type_id, space_id, create_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(tmp_id, FAIL, "H5Dcreate2"); - - status = H5Dclose(tmp_id); - CHECK(status, FAIL, "H5Dclose"); - - status = H5Tclose(type_id); - CHECK(status, FAIL, "H5Tclose"); - - status = H5Sclose(space_id); - CHECK(status, FAIL, "H5Sclose"); - - status = H5Pclose(create_id); - CHECK(status, FAIL, "H5Pclose"); - - /********************************************************************** - * test H5Tcommit2() - **********************************************************************/ - - /* Create link creation property list */ - create_id = H5Pcreate(H5P_LINK_CREATE); - CHECK(create_id, FAIL, "H5Pcreate"); - - /* Set flag for intermediate group creation */ - status = H5Pset_create_intermediate_group(create_id, true); - CHECK(status, FAIL, "H5Pset_create_intermediate_group"); - - tmp_id = H5Tcopy(H5T_NATIVE_INT16); - CHECK(tmp_id, FAIL, "H5Tcopy"); - - status = H5Tcommit2(file_id, "/A/B11/dtype", tmp_id, create_id, H5P_DEFAULT, access_id); - CHECK(status, FAIL, "H5Tcommit2"); - - status = H5Tclose(tmp_id); - CHECK(status, FAIL, "H5Tclose"); - - tmp_id = H5Tcopy(H5T_NATIVE_INT32); - CHECK(tmp_id, FAIL, "H5Tcopy"); - - status = H5Tcommit2(file_id, "/A/B12/C12/dtype", tmp_id, create_id, H5P_DEFAULT, access_id); - CHECK(status, FAIL, "H5Tcommit2"); - - status = H5Tclose(tmp_id); - CHECK(status, FAIL, "H5Tclose"); - - tmp_id = H5Tcopy(H5T_NATIVE_INT64); - CHECK(tmp_id, FAIL, "H5Tcopy"); - - status = H5Tcommit2(group_id, "B13/C12/dtype", tmp_id, create_id, H5P_DEFAULT, access_id); - CHECK(status, FAIL, "H5Tcommit2"); - - status = H5Tclose(tmp_id); - CHECK(status, FAIL, "H5Tclose"); - - tmp_id = H5Tcopy(H5T_NATIVE_FLOAT); - CHECK(tmp_id, FAIL, "H5Tcopy"); - - status = H5Tcommit2(group_id, "/A/B14/dtype", tmp_id, create_id, H5P_DEFAULT, access_id); - CHECK(status, FAIL, "H5Tcommit2"); - - status = H5Tclose(tmp_id); - CHECK(status, FAIL, "H5Tclose"); - - tmp_id = H5Tcopy(H5T_NATIVE_DOUBLE); - CHECK(tmp_id, FAIL, "H5Tcopy"); - - status = H5Tcommit2(file_id, "/A/B15/C15/A/dtype", tmp_id, create_id, H5P_DEFAULT, access_id); - CHECK(status, FAIL, "H5Tcommit2"); - - status = H5Tclose(tmp_id); - CHECK(status, FAIL, "H5Tclose"); - - status = H5Pclose(create_id); - CHECK(status, FAIL, "H5Pclose"); - - /********************************************************************** - * test H5Lcopy() - **********************************************************************/ - - /* Create link creation property list */ - create_id = H5Pcreate(H5P_LINK_CREATE); - CHECK(create_id, FAIL, "H5Pcreate"); - - /* Set flag for intermediate group creation */ - status = H5Pset_create_intermediate_group(create_id, true); - CHECK(status, FAIL, "H5Pset_create_intermediate_group"); - - status = H5Lcopy(file_id, "/A/B01/grp", file_id, "/A/B16/grp", create_id, access_id); - CHECK(status, FAIL, "H5Lcopy"); - - tri_status = H5Lexists(file_id, "/A/B16/grp", access_id); - VERIFY(tri_status, true, "H5Lexists"); - - tri_status = H5Lexists(file_id, "/A/B01/grp", access_id); - VERIFY(tri_status, true, "H5Lexists"); - - /********************************************************************** - * test H5Lmove() - **********************************************************************/ - - status = H5Lmove(file_id, "/A/B16/grp", file_id, "/A/B17/grp", create_id, access_id); - CHECK(status, FAIL, "H5Lmove"); - - tri_status = H5Lexists(file_id, "/A/B17/grp", access_id); - VERIFY(tri_status, true, "H5Lexists"); - - tri_status = H5Lexists(file_id, "/A/B16/grp", access_id); - VERIFY(tri_status, false, "H5Lexists"); - - /********************************************************************** - * test H5Lcreate_hard() - **********************************************************************/ - - status = H5Lcreate_hard(file_id, "/A/B01/grp", file_id, "/A/B18/grp", create_id, access_id); - CHECK(status, FAIL, "H5Lcreate_hard"); - - tri_status = H5Lexists(file_id, "/A/B18/grp", access_id); - VERIFY(tri_status, true, "H5Lexists"); - - /********************************************************************** - * test H5Lcreate_soft() - **********************************************************************/ - - status = H5Lcreate_soft("/A/B01/grp", file_id, "/A/B19/grp", create_id, access_id); - CHECK(status, FAIL, "H5Lcreate_soft"); - - tri_status = H5Lexists(file_id, "/A/B19/grp", access_id); - VERIFY(tri_status, true, "H5Lexists"); - - /********************************************************************** - * test H5Lcreate_external() - **********************************************************************/ - - if (vol_cap_flags_g & H5VL_CAP_FLAG_EXTERNAL_LINKS) { - status = - H5Lcreate_external("fake_filename", "fake_path", file_id, "/A/B20/grp", create_id, access_id); - CHECK(status, FAIL, "H5Lcreate_external"); - - tri_status = H5Lexists(file_id, "/A/B20/grp", access_id); - VERIFY(tri_status, true, "H5Lexists"); - } - - /********************************************************************** - * test H5Lcreate_ud() - **********************************************************************/ - - if (vol_cap_flags_g & H5VL_CAP_FLAG_UD_LINKS) { - status = H5Lcreate_ud(file_id, "/A/B21/grp", H5L_TYPE_EXTERNAL, "file\0obj", (size_t)9, create_id, - access_id); - CHECK(status, FAIL, "H5Lcreate_ud"); - - tri_status = H5Lexists(file_id, "/A/B21/grp", access_id); - VERIFY(tri_status, true, "H5Lexists"); - } - - /********************************************************************** - * close - **********************************************************************/ - - status = H5Pclose(create_id); - CHECK(status, FAIL, "H5Pclose"); - - status = H5Gclose(group_id); - CHECK(status, FAIL, "H5Gclose"); - - status = H5Fclose(file_id); - CHECK(status, FAIL, "H5Fclose"); - -} /* end test_misc23() */ - -/**************************************************************** -** -** test_misc24(): Test opening objects with inappropriate APIs -** -****************************************************************/ -static void -test_misc24(void) -{ -#if 0 - hid_t file_id = 0, group_id = 0, type_id = 0, space_id = 0, dset_id = 0, tmp_id = 0; - herr_t ret; /* Generic return value */ -#endif - - /* Output message about test being performed */ - MESSAGE(5, - ("Testing opening objects with inappropriate APIs - SKIPPED due to causing problems in HDF5\n")); -#if 0 - /* Create a new file using default properties. */ - file_id = H5Fcreate(MISC24_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - space_id = H5Screate(H5S_SCALAR); - CHECK(space_id, FAIL, "H5Screate"); - - /* Create group, dataset & named datatype objects */ - group_id = H5Gcreate2(file_id, MISC24_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group_id, FAIL, "H5Gcreate2"); - - dset_id = H5Dcreate2(file_id, MISC24_DATASET_NAME, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, - H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate2"); - - type_id = H5Tcopy(H5T_NATIVE_INT); - CHECK(type_id, FAIL, "H5Tcopy"); - - ret = H5Tcommit2(file_id, MISC24_DATATYPE_NAME, type_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create soft links to the objects created */ - ret = H5Lcreate_soft(MISC24_GROUP_NAME, file_id, MISC24_GROUP_LINK, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - - ret = H5Lcreate_soft(MISC24_DATASET_NAME, file_id, MISC24_DATASET_LINK, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - - ret = H5Lcreate_soft(MISC24_DATATYPE_NAME, file_id, MISC24_DATATYPE_LINK, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_soft"); - - /* Close IDs for objects */ - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Gclose(group_id); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Tclose(type_id); - CHECK(ret, FAIL, "H5Tclose"); - - /* Attempt to open each kind of object with wrong API, including using soft links */ - H5E_BEGIN_TRY - { - tmp_id = H5Dopen2(file_id, MISC24_GROUP_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Dopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Dopen2(file_id, MISC24_GROUP_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Dopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Topen2(file_id, MISC24_GROUP_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Topen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Topen2(file_id, MISC24_GROUP_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Topen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Gopen2(file_id, MISC24_DATASET_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Gopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Gopen2(file_id, MISC24_DATASET_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Gopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Topen2(file_id, MISC24_DATASET_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Topen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Topen2(file_id, MISC24_DATASET_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Topen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Gopen2(file_id, MISC24_DATATYPE_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Gopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Gopen2(file_id, MISC24_DATATYPE_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Gopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Dopen2(file_id, MISC24_DATATYPE_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Dopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Dopen2(file_id, MISC24_DATATYPE_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Dopen2"); - - /* Try again, with the object already open through valid call */ - /* Open group */ - group_id = H5Gopen2(file_id, MISC24_GROUP_NAME, H5P_DEFAULT); - CHECK(group_id, FAIL, "H5Gopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Dopen2(file_id, MISC24_GROUP_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Dopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Dopen2(file_id, MISC24_GROUP_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Dopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Topen2(file_id, MISC24_GROUP_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Topen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Topen2(file_id, MISC24_GROUP_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Topen2"); - - ret = H5Gclose(group_id); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open dataset */ - dset_id = H5Dopen2(file_id, MISC24_DATASET_NAME, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Gopen2(file_id, MISC24_DATASET_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Gopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Gopen2(file_id, MISC24_DATASET_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Gopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Topen2(file_id, MISC24_DATASET_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Topen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Topen2(file_id, MISC24_DATASET_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Topen2"); - - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open named datatype */ - type_id = H5Topen2(file_id, MISC24_DATATYPE_NAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Topen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Gopen2(file_id, MISC24_DATATYPE_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Gopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Gopen2(file_id, MISC24_DATATYPE_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Gopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Dopen2(file_id, MISC24_DATATYPE_NAME, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Dopen2"); - - H5E_BEGIN_TRY - { - tmp_id = H5Dopen2(file_id, MISC24_DATATYPE_LINK, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(tmp_id, FAIL, "H5Dopen2"); - - ret = H5Tclose(type_id); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close file */ - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); -#endif -} /* end test_misc24() */ - -/**************************************************************** -** -** test_misc25a(): Exercise null object header message merge bug -** with new file -** -****************************************************************/ -static void -test_misc25a(void) -{ - hid_t fid; /* File ID */ - hid_t gid, gid2, gid3; /* Group IDs */ - hid_t aid; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Exercise null object header message bug\n")); - - /* Create file */ - fid = H5Fcreate(MISC25A_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create top group */ - gid = H5Gcreate2(fid, MISC25A_GROUP0_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Close top group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create first group */ - gid = H5Gcreate2(fid, MISC25A_GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Close first group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create second group */ - gid2 = H5Gcreate2(fid, MISC25A_GROUP2_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gcreate2"); - - /* Close second group */ - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(MISC25A_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open first group */ - gid = H5Gopen2(fid, MISC25A_GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create dataspace for attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create datatype for attribute */ - tid = H5Tcopy(H5T_C_S1); - CHECK(tid, FAIL, "H5Tcopy"); - ret = H5Tset_size(tid, (size_t)MISC25A_ATTR1_LEN); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Add 1st attribute on first group */ - aid = H5Acreate2(gid, MISC25A_ATTR1_NAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create dataspace for 2nd attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create datatype for attribute */ - tid = H5Tcopy(H5T_C_S1); - CHECK(tid, FAIL, "H5Tcopy"); - ret = H5Tset_size(tid, (size_t)MISC25A_ATTR2_LEN); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Add 2nd attribute on first group */ - aid = H5Acreate2(gid, MISC25A_ATTR2_NAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close 2nd attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close first group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(MISC25A_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create third group */ - gid3 = H5Gcreate2(fid, MISC25A_GROUP3_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid3, FAIL, "H5Gcreate2"); - - /* Close third group */ - ret = H5Gclose(gid3); - CHECK(ret, FAIL, "H5Gclose"); - - /* Re-open first group */ - gid = H5Gopen2(fid, MISC25A_GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Delete 2nd attribute */ - ret = H5Adelete(gid, MISC25A_ATTR2_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Close first group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(MISC25A_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open first group */ - gid = H5Gopen2(fid, MISC25A_GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create dataspace for 3rd attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create datatype for attribute */ - tid = H5Tcopy(H5T_C_S1); - CHECK(tid, FAIL, "H5Tcopy"); - ret = H5Tset_size(tid, (size_t)MISC25A_ATTR3_LEN); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Add 3rd attribute on first group (smaller than 2nd attribute) */ - aid = H5Acreate2(gid, MISC25A_ATTR3_NAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close 3rd attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close first group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(MISC25A_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open first group */ - gid = H5Gopen2(fid, MISC25A_GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Delete 3rd attribute */ - ret = H5Adelete(gid, MISC25A_ATTR3_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Create dataspace for 3rd attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create datatype for attribute */ - tid = H5Tcopy(H5T_C_S1); - CHECK(tid, FAIL, "H5Tcopy"); - ret = H5Tset_size(tid, (size_t)MISC25A_ATTR2_LEN); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Re-create 2nd attribute on first group */ - aid = H5Acreate2(gid, MISC25A_ATTR2_NAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close 2nd attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close first group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(MISC25A_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open first group */ - gid = H5Gopen2(fid, MISC25A_GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Delete 2nd attribute */ - ret = H5Adelete(gid, MISC25A_ATTR2_NAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Close first group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file */ - fid = H5Fopen(MISC25A_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open first group */ - gid = H5Gopen2(fid, MISC25A_GROUP1_NAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Create dataspace for 3rd attribute */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create datatype for attribute */ - tid = H5Tcopy(H5T_C_S1); - CHECK(tid, FAIL, "H5Tcopy"); - ret = H5Tset_size(tid, (size_t)MISC25A_ATTR2_LEN); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Re-create 2nd attribute on first group */ - aid = H5Acreate2(gid, MISC25A_ATTR2_NAME, tid, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close 2nd attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close first group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc25a() */ - -/**************************************************************** -** -** test_misc25b(): Exercise null object header message merge bug -** with existing file (This test relies on -** the file produced by test/gen_mergemsg.c) -** -****************************************************************/ -#if 0 -static void -test_misc25b(void) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - const char *testfile = H5_get_srcdir_filename(MISC25B_FILE); /* Corrected test file name */ - bool driver_is_default_compatible; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Exercise null object header message bug\n")); - - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); - - if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); - return; - } - - /* Open file */ - fid = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open group with object header messages that will merge */ - gid = H5Gopen2(fid, MISC25B_GROUP, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Close first group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc25b() */ -#endif - -/**************************************************************** -** -** test_misc25c(): Exercise another null object header message merge bug. -** -****************************************************************/ -static void -test_misc25c(void) -{ - hid_t fid; /* File ID */ - hid_t fapl; /* File access property list ID */ - hid_t gcpl; /* Group creation property list ID */ - hid_t sid; /* Dataspace ID */ - hid_t did; /* Dataset ID */ - hid_t gid; /* Group ID */ - hid_t gid2; /* Group ID */ - hid_t aid; /* Attribute ID */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Exercise another null object header message bug\n")); - - /* Compose file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Create the file */ - fid = H5Fcreate(MISC25C_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Compose group creation property list */ - gcpl = H5Pcreate(H5P_GROUP_CREATE); - CHECK(gcpl, FAIL, "H5Pcreate"); - ret = H5Pset_link_creation_order(gcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_link_creation_order"); - ret = H5Pset_attr_creation_order(gcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); - CHECK(ret, FAIL, "H5Pset_attr_creation_order"); - ret = H5Pset_est_link_info(gcpl, 1, 18); - CHECK(ret, FAIL, "H5Pset_est_link_info"); - - /* Create a group for the dataset */ - gid = H5Gcreate2(fid, MISC25C_DSETGRPNAME, H5P_DEFAULT, gcpl, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - /* Create the dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create the dataset */ - did = H5Dcreate2(gid, MISC25C_DSETNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Create an extra group */ - gid2 = H5Gcreate2(fid, MISC25C_GRPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gcreate2"); - - /* Close the extra group */ - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Add an attribute to the dataset group */ - aid = H5Acreate2(gid, MISC25C_ATTRNAME, H5T_NATIVE_CHAR, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close the attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create a second extra group */ - gid2 = H5Gcreate2(fid, MISC25C_GRPNAME2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid2, FAIL, "H5Gcreate2"); - - /* Close the second extra group */ - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Add second attribute to the dataset group */ - aid = H5Acreate2(gid, MISC25C_ATTRNAME2, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(aid, FAIL, "H5Acreate2"); - - /* Close the attribute */ - ret = H5Aclose(aid); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the dataset group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Close the property lists */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Pclose(gcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Re-open the file */ - fid = H5Fopen(MISC25C_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Re-open the dataset group */ - gid = H5Gopen2(fid, MISC25C_DSETGRPNAME, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Rename the dataset */ - ret = H5Lmove(gid, MISC25C_DSETNAME, H5L_SAME_LOC, MISC25C_DSETNAME2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lmove"); - - /* Delete the first attribute */ - ret = H5Adelete(gid, MISC25C_ATTRNAME); - CHECK(ret, FAIL, "H5Adelete"); - - /* Close the dataset group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc25c() */ - -/**************************************************************** -** -** test_misc26(): Regression test: ensure that copying filter -** pipelines works properly. -** -****************************************************************/ -static void -test_misc26(void) -{ - hid_t fid; /* File ID */ - hid_t sid; /* Dataspace ID */ - hid_t did; /* Dataset ID */ - hid_t dcpl1, dcpl2, dcpl3; /* Property List IDs */ - hsize_t dims[] = {1}; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Copying filter pipelines\n")); - - /* Create the property list. It needs chunking so we can add filters */ - dcpl1 = H5Pcreate(H5P_DATASET_CREATE); - CHECK_I(dcpl1, "H5Pcreate"); - ret = H5Pset_chunk(dcpl1, 1, dims); - CHECK_I(ret, "H5Pset_chunk"); - - /* Add a filter with a data value to the property list */ - ret = H5Pset_deflate(dcpl1, 1); - CHECK_I(ret, "H5Pset_deflate"); - - /* Copy the property list */ - dcpl2 = H5Pcopy(dcpl1); - CHECK_I(dcpl2, "H5Pcopy"); - - /* Add a filter with no data values to the copy */ - ret = H5Pset_shuffle(dcpl2); - CHECK_I(ret, "H5Pset_shuffle"); - - /* Copy the copy */ - dcpl3 = H5Pcopy(dcpl2); - CHECK_I(dcpl3, "H5Pcopy"); - - /* Add another filter */ - ret = H5Pset_deflate(dcpl3, 2); - CHECK_I(ret, "H5Pset_deflate"); - - /* Create a new file and datasets within that file that use these - * property lists - */ - fid = H5Fcreate(MISC26_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - sid = H5Screate_simple(1, dims, dims); - CHECK(sid, FAIL, "H5Screate_simple"); - - did = H5Dcreate2(fid, "dataset1", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, dcpl1, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - ret = H5Dclose(did); - CHECK_I(ret, "H5Dclose"); - - did = H5Dcreate2(fid, "dataset2", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, dcpl2, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - ret = H5Dclose(did); - CHECK_I(ret, "H5Dclose"); - - did = H5Dcreate2(fid, "dataset3", H5T_NATIVE_FLOAT, sid, H5P_DEFAULT, dcpl3, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - ret = H5Dclose(did); - CHECK_I(ret, "H5Dclose"); - - /* Close the dataspace and file */ - ret = H5Sclose(sid); - CHECK_I(ret, "H5Sclose"); - ret = H5Fclose(fid); - CHECK_I(ret, "H5Fclose"); - - /* Close the property lists. */ - ret = H5Pclose(dcpl1); - CHECK_I(ret, "H5Pclose"); - ret = H5Pclose(dcpl2); - CHECK_I(ret, "H5Pclose"); - ret = H5Pclose(dcpl3); - CHECK_I(ret, "H5Pclose"); -} - -/**************************************************************** -** -** test_misc27(): Ensure that objects with incorrect # of object -** header messages are handled appropriately. -** -** (Note that this test file is generated by the "gen_bad_ohdr.c" code) -** -****************************************************************/ -#if 0 -static void -test_misc27(void) -{ - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - const char *testfile = H5_get_srcdir_filename(MISC27_FILE); /* Corrected test file name */ - bool driver_is_default_compatible; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Corrupt object header handling\n")); - - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); - - if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); - return; - } - - /* Open the file */ - fid = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - -#ifdef H5_STRICT_FORMAT_CHECKS - /* Open group with incorrect # of object header messages (should fail) */ - H5E_BEGIN_TRY - { - gid = H5Gopen2(fid, MISC27_GROUP, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(gid, FAIL, "H5Gopen2"); -#else /* H5_STRICT_FORMAT_CHECKS */ - /* Open group with incorrect # of object header messages */ - gid = H5Gopen2(fid, MISC27_GROUP, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gopen2"); - - /* Close group */ - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); -#endif /* H5_STRICT_FORMAT_CHECKS */ - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc27() */ -#endif - -/**************************************************************** -** -** test_misc28(): Ensure that the dataset chunk cache will hold -** the correct number of chunks in cache without -** evicting them. -** -****************************************************************/ -static void -test_misc28(void) -{ - hid_t fid; /* File ID */ - hid_t sidf; /* File Dataspace ID */ - hid_t sidm; /* Memory Dataspace ID */ - hid_t did; /* Dataset ID */ - hid_t dcpl, fapl; /* Property List IDs */ - hsize_t dims[] = {MISC28_SIZE, MISC28_SIZE}; - hsize_t mdims[] = {MISC28_SIZE}; - hsize_t cdims[] = {1, 1}; - hsize_t start[] = {0, 0}; - hsize_t count[] = {MISC28_SIZE, 1}; -#if 0 - size_t nbytes_used; - int nused; -#endif - char buf[MISC28_SIZE]; - int i; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Dataset chunk cache\n")); - - /* Create the fapl and set the cache size. Set nelmts to larger than the - * file size so we can be guaranteed that no chunks will be evicted due to - * a hash collision. Set nbytes to fit exactly 1 column of chunks (10 - * bytes). */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - ret = H5Pset_cache(fapl, MISC28_NSLOTS, MISC28_NSLOTS, MISC28_SIZE, 0.75); - CHECK(ret, FAIL, "H5Pset_cache"); - - /* Create the dcpl and set the chunk size */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - ret = H5Pset_chunk(dcpl, 2, cdims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Create a new file and datasets within that file that use these - * property lists - */ - fid = H5Fcreate(MISC28_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - sidf = H5Screate_simple(2, dims, NULL); - CHECK(sidf, FAIL, "H5Screate_simple"); - - did = H5Dcreate2(fid, "dataset", H5T_NATIVE_CHAR, sidf, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); -#if 0 - /* Verify that the chunk cache is empty */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)0, "H5D__current_cache_size_test"); - VERIFY(nused, 0, "H5D__current_cache_size_test"); -#endif - /* Initialize write buffer */ - for (i = 0; i < MISC28_SIZE; i++) - buf[i] = (char)i; - - /* Create memory dataspace and selection in file dataspace */ - sidm = H5Screate_simple(1, mdims, NULL); - CHECK(sidm, FAIL, "H5Screate_simple"); - - ret = H5Sselect_hyperslab(sidf, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Write hypserslab */ - ret = H5Dwrite(did, H5T_NATIVE_CHAR, sidm, sidf, H5P_DEFAULT, buf); - CHECK(ret, FAIL, "H5Dwrite"); -#if 0 - /* Verify that all 10 chunks written have been cached */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); - VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); -#endif - /* Initialize write buffer */ - for (i = 0; i < MISC28_SIZE; i++) - buf[i] = (char)(MISC28_SIZE - 1 - i); - - /* Select new hyperslab */ - start[1] = 1; - ret = H5Sselect_hyperslab(sidf, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Write hyperslab */ - ret = H5Dwrite(did, H5T_NATIVE_CHAR, sidm, sidf, H5P_DEFAULT, buf); - CHECK(ret, FAIL, "H5Dwrite"); -#if 0 - /* Verify that the size of the cache remains at 10 */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); - VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); -#endif - /* Close dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Re open dataset */ - did = H5Dopen2(fid, "dataset", H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); -#if 0 - /* Verify that the chunk cache is empty */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)0, "H5D__current_cache_size_test"); - VERIFY(nused, 0, "H5D__current_cache_size_test"); -#endif - /* Select hyperslabe for reading */ - start[1] = 0; - ret = H5Sselect_hyperslab(sidf, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read hypserslab */ - ret = H5Dread(did, H5T_NATIVE_CHAR, sidm, sidf, H5P_DEFAULT, buf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the data read */ - for (i = 0; i < MISC28_SIZE; i++) - VERIFY(buf[i], i, "H5Dread"); -#if 0 - /* Verify that all 10 chunks read have been cached */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); - VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); -#endif - /* Select new hyperslab */ - start[1] = 1; - ret = H5Sselect_hyperslab(sidf, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read hyperslab */ - ret = H5Dread(did, H5T_NATIVE_CHAR, sidm, sidf, H5P_DEFAULT, buf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the data read */ - for (i = 0; i < MISC28_SIZE; i++) - VERIFY(buf[i], MISC28_SIZE - 1 - i, "H5Dread"); -#if 0 - /* Verify that the size of the cache remains at 10 */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); - VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); -#endif - /* Close dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the dataspaces and file */ - ret = H5Sclose(sidf); - CHECK_I(ret, "H5Sclose"); - ret = H5Sclose(sidm); - CHECK_I(ret, "H5Sclose"); - ret = H5Fclose(fid); - CHECK_I(ret, "H5Fclose"); - - /* Close the property lists. */ - ret = H5Pclose(dcpl); - CHECK_I(ret, "H5Pclose"); - ret = H5Pclose(fapl); - CHECK_I(ret, "H5Pclose"); -} /* end test_misc28() */ - -/**************************************************************** -** -** test_misc29(): Ensure that speculative metadata reads don't -** get raw data into the metadata accumulator. -** -****************************************************************/ -#if 0 -static void -test_misc29(void) -{ - bool driver_is_default_compatible; - hid_t fid; /* File ID */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Speculative metadata reads\n")); - - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); - - if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); - return; - } - - /* Make a copy of the data file from svn. */ - ret = h5_make_local_copy(MISC29_ORIG_FILE, MISC29_COPY_FILE); - CHECK(ret, -1, "h5_make_local_copy"); - - /* Open the copied file */ - fid = H5Fopen(MISC29_COPY_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Delete the last dataset */ - ret = H5Ldelete(fid, MISC29_DSETNAME, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_misc29() */ -#endif - -#if 0 -static int -test_misc30_get_info_cb(hid_t loc_id, const char *name, const H5L_info2_t H5_ATTR_UNUSED *info, - void H5_ATTR_UNUSED *op_data) -{ - H5O_info2_t object_info; - - return H5Oget_info_by_name3(loc_id, name, &object_info, H5O_INFO_BASIC, H5P_DEFAULT); -} - -static int -test_misc30_get_info(hid_t loc_id) -{ - return H5Literate2(loc_id, H5_INDEX_NAME, H5_ITER_INC, NULL, test_misc30_get_info_cb, NULL); -} -#endif - -/**************************************************************** -** -** test_misc30(): Exercise local heap code that loads prefix -** separately from data block, causing the free -** block information to get lost. -** -****************************************************************/ -#if 0 -static void -test_misc30(void) -{ - hsize_t file_size[] = {0, 0}; /* Sizes of file created */ - unsigned get_info; /* Whether to perform the get info call */ - - /* Output message about test being performed */ - MESSAGE(5, ("Local heap dropping free block info\n")); - - for (get_info = false; get_info <= true; get_info++) { - hid_t fid; /* File ID */ - hid_t gid; /* Group ID */ - int i; /* Local index counter */ - herr_t ret; /* Generic return value */ - - fid = H5Fcreate(MISC30_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - gid = H5Gcreate2(fid, "/g0", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - for (i = 0; i < 20; i++) { - char gname[32]; - - fid = H5Fopen(MISC30_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - if (get_info) { - ret = test_misc30_get_info(fid); - CHECK(ret, FAIL, "test_misc30_get_info"); - } - - snprintf(gname, sizeof(gname), "/g0/group%d", i); - gid = H5Gcreate2(fid, gname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, FAIL, "H5Gcreate2"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } - - fid = H5Fopen(MISC30_FILE, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - ret = H5Fget_filesize(fid, &file_size[get_info]); - CHECK(fid, FAIL, "H5Fget_filesize"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - } - - VERIFY(file_size[0], file_size[1], "test_misc30"); -} /* end test_misc30() */ -#endif - -/**************************************************************** -** -** test_misc31(): Test reentering library through deprecated -* routines that register an id after calling -* H5close(). -** -****************************************************************/ -#if 0 -static void -test_misc31(void) -{ -#ifndef H5_NO_DEPRECATED_SYMBOLS - hid_t file_id; /* File id */ - hid_t space_id; /* Dataspace id */ - hid_t dset_id; /* Dataset id */ - hid_t attr_id; /* Attribute id */ - hid_t group_id; /* Group id */ - hid_t dtype_id; /* Datatype id */ - herr_t ret; /* Generic return value */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ - - /* Output message about test being performed */ - MESSAGE(5, ("Deprecated routines initialize after H5close()\n")); - -#ifndef H5_NO_DEPRECATED_SYMBOLS - file_id = H5Fcreate(MISC31_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Test dataset package */ - space_id = H5Screate(H5S_SCALAR); - CHECK(space_id, FAIL, "H5Screate"); - dset_id = H5Dcreate1(file_id, MISC31_DSETNAME, H5T_NATIVE_INT, space_id, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate1"); - ret = H5close(); - CHECK(ret, FAIL, "H5close"); - file_id = H5Fopen(MISC31_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fopen"); - dset_id = H5Dopen1(file_id, MISC31_DSETNAME); - CHECK(dset_id, FAIL, "H5Dopen1"); - - /* Test attribute package */ - space_id = H5Screate(H5S_SCALAR); - CHECK(space_id, FAIL, "H5Screate"); - attr_id = H5Acreate1(dset_id, MISC31_ATTRNAME1, H5T_NATIVE_INT, space_id, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate1"); - ret = H5close(); - CHECK(ret, FAIL, "H5close"); - file_id = H5Fopen(MISC31_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fopen"); - dset_id = H5Dopen1(file_id, MISC31_DSETNAME); - CHECK(dset_id, FAIL, "H5Dopen1"); - space_id = H5Screate(H5S_SCALAR); - CHECK(space_id, FAIL, "H5Screate"); - attr_id = H5Acreate1(dset_id, MISC31_ATTRNAME2, H5T_NATIVE_INT, space_id, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate1"); - - /* Test group package */ - group_id = H5Gcreate1(file_id, MISC31_GROUPNAME, 0); - CHECK(group_id, FAIL, "H5Gcreate1"); - ret = H5close(); - CHECK(ret, FAIL, "H5close"); - file_id = H5Fopen(MISC31_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fopen"); - group_id = H5Gopen1(file_id, MISC31_GROUPNAME); - CHECK(group_id, FAIL, "H5Gopen1"); - - /* Test property list package */ - ret = H5Pregister1(H5P_OBJECT_CREATE, MISC31_PROPNAME, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK(ret, FAIL, "H5Pregister1"); - ret = H5close(); - CHECK(ret, FAIL, "H5close"); - ret = H5Pregister1(H5P_OBJECT_CREATE, MISC31_PROPNAME, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL); - CHECK(ret, FAIL, "H5Pregister1"); - ret = H5close(); - CHECK(ret, FAIL, "H5close"); - - /* Test datatype package */ - file_id = H5Fopen(MISC31_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fopen"); - dtype_id = H5Tcopy(H5T_NATIVE_INT); - CHECK(dtype_id, FAIL, "H5Tcopy"); - ret = H5Tcommit1(file_id, MISC31_DTYPENAME, dtype_id); - CHECK(ret, FAIL, "H5Tcommit1"); - ret = H5close(); - CHECK(ret, FAIL, "H5close"); - file_id = H5Fopen(MISC31_FILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fopen"); - dtype_id = H5Topen1(file_id, MISC31_DTYPENAME); - CHECK(ret, FAIL, "H5Topen1"); - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Tclose(dtype_id); - CHECK(ret, FAIL, "H5Tclose"); - -#else /* H5_NO_DEPRECATED_SYMBOLS */ - /* Output message about test being skipped */ - MESSAGE(5, (" ...Skipped")); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -} /* end test_misc31() */ -#endif - -/**************************************************************** - * - * test_misc32(): Simple test of filter memory allocation - * functions. - * - ***************************************************************/ -static void -test_misc32(void) -{ - void *buffer; - void *resized; - size_t size; - - /* Output message about test being performed */ - MESSAGE(5, ("Edge case test of filter memory allocation functions\n")); - - /* Test that the filter memory allocation functions behave correctly - * at edge cases. - */ - - /* FREE */ - - /* Test freeing a NULL pointer. - * No real confirmation check here, but Valgrind will confirm no - * shenanigans. - */ - buffer = NULL; - H5free_memory(buffer); - - /* ALLOCATE */ - - /* Size zero returns NULL. - * Also checks that a size of zero and setting the buffer clear flag - * to true can be used together. - * - * Note that we have asserts in the code, so only check when NDEBUG - * is defined. - */ -#ifdef NDEBUG - buffer = H5allocate_memory(0, false); - CHECK_PTR_NULL(buffer, "H5allocate_memory"); /*BAD*/ - buffer = H5allocate_memory(0, true); - CHECK_PTR_NULL(buffer, "H5allocate_memory"); /*BAD*/ -#endif /* NDEBUG */ - - /* RESIZE */ - - /* Size zero returns NULL. Valgrind will confirm buffer is freed. */ - size = 1024; - buffer = H5allocate_memory(size, true); - resized = H5resize_memory(buffer, 0); - CHECK_PTR_NULL(resized, "H5resize_memory"); - - /* NULL input pointer returns new buffer */ - resized = H5resize_memory(NULL, 1024); - CHECK_PTR(resized, "H5resize_memory"); - H5free_memory(resized); - - /* NULL input pointer and size zero returns NULL */ -#ifdef NDEBUG - resized = H5resize_memory(NULL, 0); - CHECK_PTR_NULL(resized, "H5resize_memory"); /*BAD*/ -#endif /* NDEBUG */ - -} /* end test_misc32() */ - -/**************************************************************** -** -** test_misc33(): Test for H5FFV-10216 -** --verify that H5HL_offset_into() returns error if the -** input parameter "offset" exceeds heap data block size. -** --case (1), (2), (3) are scenarios that will traverse to the -** the 3 locations in the file having bad offset values to -** the heap. (See description in gen_bad_offset.c) -** -****************************************************************/ -#if 0 -static void -test_misc33(void) -{ - hid_t fid = -1; /* File ID */ - const char *testfile = H5_get_srcdir_filename(MISC33_FILE); /* Corrected test file name */ - H5O_info2_t oinfo; /* Structure for object metadata information */ - bool driver_is_default_compatible; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing that bad offset into the heap returns error")); - - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); - - if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); - return; - } - - /* Open the test file */ - fid = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Case (1) */ - H5E_BEGIN_TRY - { - ret = H5Oget_info_by_name3(fid, "/soft_two", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Oget_info_by_name3"); - - /* Case (2) */ - H5E_BEGIN_TRY - { - ret = H5Oget_info_by_name3(fid, "/dsetA", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Oget_info_by_name3"); - - /* Case (3) */ - H5E_BEGIN_TRY - { - ret = H5Oget_info_by_name3(fid, "/soft_one", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Oget_info_by_name3"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(fid, FAIL, "H5Fclose"); - -} /* end test_misc33() */ -#endif - -/**************************************************************** -** -** test_misc34(): Ensure zero-size memory allocations work -** -****************************************************************/ -#if 0 -static void -test_misc34(void) -{ - void *mem = NULL; /* allocated buffer */ - char *dup = NULL; /* 'duplicated' string */ - size_t sz = 0; /* buffer size */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing O and NULL behavior in H5MM API calls")); - - /* H5MM_xfree(): Ensure that passing NULL is allowed and returns NULL */ - mem = H5MM_xfree(mem); - CHECK_PTR_NULL(mem, "H5MM_xfree"); - - /* H5MM_realloc(): Check behavior: - * - * H5MM_realloc(NULL, size) <==> H5MM_malloc(size) - * H5MM_realloc(ptr, 0) <==> H5MM_xfree(ptr) - * H5MM_realloc(NULL, 0) <==> NULL - */ - mem = H5MM_xfree(mem); - - sz = 1024; - mem = H5MM_realloc(mem, sz); - CHECK_PTR(mem, "H5MM_realloc (case 1)"); - /* Don't free mem here! */ - - sz = 0; - mem = H5MM_realloc(mem, sz); - CHECK_PTR_NULL(mem, "H5MM_realloc (case 2)"); - mem = H5MM_xfree(mem); - - mem = H5MM_realloc(mem, sz); - CHECK_PTR_NULL(mem, "H5MM_realloc (case 3)"); - mem = H5MM_xfree(mem); - - /* H5MM_xstrdup(): Ensure NULL returns NULL */ - dup = H5MM_xstrdup((const char *)mem); - CHECK_PTR_NULL(dup, "H5MM_xstrdup"); - dup = (char *)H5MM_xfree((void *)dup); - -} /* end test_misc34() */ - -/**************************************************************** -** -** test_misc35(): Check operation of free-list routines -** -****************************************************************/ -static void -test_misc35(void) -{ - hid_t sid = H5I_INVALID_HID; /* Dataspace ID */ - hsize_t dims[] = {MISC35_SPACE_DIM1, MISC35_SPACE_DIM2, MISC35_SPACE_DIM3}; /* Dataspace dims */ - hsize_t coord[MISC35_NPOINTS][MISC35_SPACE_RANK] = /* Coordinates for point selection */ - {{0, 10, 5}, {1, 2, 7}, {2, 4, 9}, {0, 6, 11}, {1, 8, 13}, - {2, 12, 0}, {0, 14, 2}, {1, 0, 4}, {2, 1, 6}, {0, 3, 8}}; - size_t reg_size_start; /* Initial amount of regular memory allocated */ - size_t arr_size_start; /* Initial amount of array memory allocated */ - size_t blk_size_start; /* Initial amount of block memory allocated */ - size_t fac_size_start; /* Initial amount of factory memory allocated */ - size_t reg_size_final; /* Final amount of regular memory allocated */ - size_t arr_size_final; /* Final amount of array memory allocated */ - size_t blk_size_final; /* Final amount of block memory allocated */ - size_t fac_size_final; /* Final amount of factory memory allocated */ - herr_t ret; /* Return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Free-list API calls")); - - /* Create dataspace */ - /* (Allocates array free-list nodes) */ - sid = H5Screate_simple(MISC35_SPACE_RANK, dims, NULL); - CHECK(sid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Select sequence of ten points */ - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)MISC35_NPOINTS, (const hsize_t *)coord); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Retrieve initial free list values */ - ret = H5get_free_list_sizes(®_size_start, &arr_size_start, &blk_size_start, &fac_size_start); - CHECK(ret, FAIL, "H5get_free_list_sizes"); - -#if !defined H5_NO_FREE_LISTS && !defined H5_USING_MEMCHECKER - /* All the free list values should be >0 */ - CHECK(reg_size_start, 0, "H5get_free_list_sizes"); - CHECK(arr_size_start, 0, "H5get_free_list_sizes"); - CHECK(blk_size_start, 0, "H5get_free_list_sizes"); - CHECK(fac_size_start, 0, "H5get_free_list_sizes"); -#else - /* All the values should be == 0 */ - VERIFY(reg_size_start, 0, "H5get_free_list_sizes"); - VERIFY(arr_size_start, 0, "H5get_free_list_sizes"); - VERIFY(blk_size_start, 0, "H5get_free_list_sizes"); - VERIFY(fac_size_start, 0, "H5get_free_list_sizes"); -#endif - - /* Garbage collect the free lists */ - ret = H5garbage_collect(); - CHECK(ret, FAIL, "H5garbage_collect"); - - /* Retrieve free list values again */ - ret = H5get_free_list_sizes(®_size_final, &arr_size_final, &blk_size_final, &fac_size_final); - CHECK(ret, FAIL, "H5get_free_list_sizes"); - - /* All the free list values should be <= previous values */ - if (reg_size_final > reg_size_start) - ERROR("reg_size_final > reg_size_start"); - if (arr_size_final > arr_size_start) - ERROR("arr_size_final > arr_size_start"); - if (blk_size_final > blk_size_start) - ERROR("blk_size_final > blk_size_start"); - if (fac_size_final > fac_size_start) - ERROR("fac_size_final > fac_size_start"); - -} /* end test_misc35() */ -#endif - -/* Context to pass to 'atclose' callbacks */ -static int test_misc36_context; - -/* 'atclose' callbacks for test_misc36 */ -static void -test_misc36_cb1(void *_ctx) -{ - int *ctx = (int *)_ctx; /* Set up context pointer */ - bool is_terminating; /* Flag indicating the library is terminating */ - herr_t ret; /* Return value */ - - /* Check whether the library thinks it's terminating */ - is_terminating = false; - ret = H5is_library_terminating(&is_terminating); - CHECK(ret, FAIL, "H5is_library_terminating"); - VERIFY(is_terminating, true, "H5is_library_terminating"); - - /* Verify correct ordering for 'atclose' callbacks */ - if (0 != *ctx) - HDabort(); - - /* Update context value */ - *ctx = 1; -} - -static void -test_misc36_cb2(void *_ctx) -{ - int *ctx = (int *)_ctx; /* Set up context pointer */ - bool is_terminating; /* Flag indicating the library is terminating */ - herr_t ret; /* Return value */ - - /* Check whether the library thinks it's terminating */ - is_terminating = false; - ret = H5is_library_terminating(&is_terminating); - CHECK(ret, FAIL, "H5is_library_terminating"); - VERIFY(is_terminating, true, "H5is_library_terminating"); - - /* Verify correct ordering for 'atclose' callbacks */ - if (1 != *ctx) - HDabort(); - - /* Update context value */ - *ctx = 2; -} - -/**************************************************************** -** -** test_misc36(): Exercise H5atclose and H5is_library_terminating -** -****************************************************************/ -static void -test_misc36(void) -{ - bool is_terminating; /* Flag indicating the library is terminating */ - herr_t ret; /* Return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("H5atclose and H5is_library_terminating API calls")); - - /* Check whether the library thinks it's terminating */ - is_terminating = true; - ret = H5is_library_terminating(&is_terminating); - CHECK(ret, FAIL, "H5is_library_terminating"); - VERIFY(is_terminating, false, "H5is_library_terminating"); - - /* Shut the library down */ - test_misc36_context = 0; - H5close(); - - /* Check whether the library thinks it's terminating */ - is_terminating = true; - ret = H5is_library_terminating(&is_terminating); - CHECK(ret, FAIL, "H5is_library_terminating"); - VERIFY(is_terminating, false, "H5is_library_terminating"); - - /* Check the close context was not changed */ - VERIFY(test_misc36_context, 0, "H5atclose"); - - /* Restart the library */ - H5open(); - - /* Check whether the library thinks it's terminating */ - is_terminating = true; - ret = H5is_library_terminating(&is_terminating); - CHECK(ret, FAIL, "H5is_library_terminating"); - VERIFY(is_terminating, false, "H5is_library_terminating"); - - /* Register the 'atclose' callbacks */ - /* (Note that these will be called in reverse order, which is checked) */ - ret = H5atclose(&test_misc36_cb2, &test_misc36_context); - CHECK(ret, FAIL, "H5atclose"); - ret = H5atclose(&test_misc36_cb1, &test_misc36_context); - CHECK(ret, FAIL, "H5atclose"); - - /* Shut the library down */ - test_misc36_context = 0; - H5close(); - - /* Check the close context was changed correctly */ - VERIFY(test_misc36_context, 2, "H5atclose"); - - /* Restart the library */ - H5open(); - - /* Close the library again */ - test_misc36_context = 0; - H5close(); - - /* Check the close context was not changed */ - VERIFY(test_misc36_context, 0, "H5atclose"); -} /* end test_misc36() */ - -#if 0 -/**************************************************************** -** -** test_misc37(): -** Test for seg fault issue when closing the provided test file -** which has an illegal file size in its cache image. -** See HDFFV-11052/CVE-2020-10812 for details. -** -****************************************************************/ -static void -test_misc37(void) -{ - const char *testfile = H5_get_srcdir_filename(CVE_2020_10812_FILENAME); - bool driver_is_default_compatible; - hid_t fid; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Fix for HDFFV-11052/CVE-2020-10812")); - - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); - - if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); - return; - } - - fid = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* This should fail due to the illegal file size. - It should fail gracefully and not seg fault */ - H5E_BEGIN_TRY - { - ret = H5Fclose(fid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fclose"); - -} /* end test_misc37() */ -#endif - -/**************************************************************** -** -** test_misc(): Main misc. test routine. -** -****************************************************************/ -void -test_misc(void) -{ - bool default_driver = h5_using_default_driver(NULL); - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Miscellaneous Routines\n")); - - test_misc1(); /* Test unlinking a dataset & immediately re-using name */ - test_misc2(); /* Test storing a VL-derived datatype in two different files */ - test_misc3(); /* Test reading from chunked dataset with non-zero fill value */ - test_misc4(); /* Test retrieving the fileno for various objects with H5Oget_info() */ - test_misc5(); /* Test several level deep nested compound & VL datatypes */ - test_misc6(); /* Test object header continuation code */ -#if 0 - test_misc7(); /* Test for sensible datatypes stored on disk */ - test_misc8(); /* Test storage sizes of various types of dataset storage */ -#endif - test_misc9(); /* Test for opening (not creating) core files */ -#if 0 - test_misc10(); /* Test for using dataset creation property lists from old files */ -#endif - - if (default_driver) { - test_misc11(); /* Test for all properties of a file creation property list being stored */ - } - - test_misc12(); /* Test VL-strings in chunked datasets operating correctly */ -#if 0 - if (default_driver) { - test_misc13(); /* Test that a user block can be insert in front of file contents */ - } -#endif - test_misc14(); /* Test that deleted dataset's data is removed from sieve buffer correctly */ - test_misc15(); /* Test that checking a file's access property list more than once works */ - test_misc16(); /* Test array of fixed-length string */ - test_misc17(); /* Test array of ASCII character */ - test_misc18(); /* Test new object header information in H5O_info2_t struct */ - test_misc19(); /* Test incrementing & decrementing ref count on IDs */ -#if 0 - test_misc20(); /* Test problems with truncated dimensions in version 2 of storage layout message */ -#endif -#if defined(H5_HAVE_FILTER_SZIP) && !defined(H5_API_TEST_NO_FILTERS) - test_misc21(); /* Test that "late" allocation time is treated the same as "incremental", for chunked - datasets w/a filters */ - test_misc22(); /* check szip bits per pixel */ -#endif /* H5_HAVE_FILTER_SZIP */ - test_misc23(); /* Test intermediate group creation */ - test_misc24(); /* Test inappropriate API opens of objects */ - test_misc25a(); /* Exercise null object header message merge bug */ -#if 0 - test_misc25b(); /* Exercise null object header message merge bug on existing file */ -#endif - test_misc25c(); /* Exercise another null object header message merge bug */ - test_misc26(); /* Test closing property lists with long filter pipelines */ -#if 0 - test_misc27(); /* Test opening file with object that has bad # of object header messages */ -#endif - test_misc28(); /* Test that chunks are cached appropriately */ -#if 0 - test_misc29(); /* Test that speculative metadata reads are handled correctly */ - test_misc30(); /* Exercise local heap loading bug where free lists were getting dropped */ - - if (default_driver) { - test_misc31(); /* Test Reentering library through deprecated routines after H5close() */ - } -#endif - test_misc32(); /* Test filter memory allocation functions */ -#if 0 - test_misc33(); /* Test to verify that H5HL_offset_into() returns error if offset exceeds heap block */ - test_misc34(); /* Test behavior of 0 and NULL in H5MM API calls */ - test_misc35(); /* Test behavior of free-list & allocation statistics API calls */ -#endif - test_misc36(); /* Exercise H5atclose and H5is_library_terminating */ -#if 0 - test_misc37(); /* Test for seg fault failure at file close */ -#endif -} /* test_misc() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_misc - * - * Purpose: Cleanup temporary test files - * - * Return: none - * - *------------------------------------------------------------------------- - */ -void -cleanup_misc(void) -{ - H5Fdelete(MISC1_FILE, H5P_DEFAULT); - H5Fdelete(MISC2_FILE_1, H5P_DEFAULT); - H5Fdelete(MISC2_FILE_2, H5P_DEFAULT); - H5Fdelete(MISC3_FILE, H5P_DEFAULT); - H5Fdelete(MISC4_FILE_1, H5P_DEFAULT); - H5Fdelete(MISC4_FILE_2, H5P_DEFAULT); - H5Fdelete(MISC5_FILE, H5P_DEFAULT); - H5Fdelete(MISC6_FILE, H5P_DEFAULT); - H5Fdelete(MISC7_FILE, H5P_DEFAULT); - H5Fdelete(MISC8_FILE, H5P_DEFAULT); - H5Fdelete(MISC9_FILE, H5P_DEFAULT); - H5Fdelete(MISC10_FILE_NEW, H5P_DEFAULT); - H5Fdelete(MISC11_FILE, H5P_DEFAULT); - H5Fdelete(MISC12_FILE, H5P_DEFAULT); - H5Fdelete(MISC13_FILE_1, H5P_DEFAULT); - H5Fdelete(MISC13_FILE_2, H5P_DEFAULT); - H5Fdelete(MISC14_FILE, H5P_DEFAULT); - H5Fdelete(MISC15_FILE, H5P_DEFAULT); - H5Fdelete(MISC16_FILE, H5P_DEFAULT); - H5Fdelete(MISC17_FILE, H5P_DEFAULT); - H5Fdelete(MISC18_FILE, H5P_DEFAULT); - H5Fdelete(MISC19_FILE, H5P_DEFAULT); - H5Fdelete(MISC20_FILE, H5P_DEFAULT); -#if defined(H5_HAVE_FILTER_SZIP) && !defined(H5_API_TEST_NO_FILTERS) - H5Fdelete(MISC21_FILE, H5P_DEFAULT); - H5Fdelete(MISC22_FILE, H5P_DEFAULT); -#endif /* H5_HAVE_FILTER_SZIP */ - H5Fdelete(MISC23_FILE, H5P_DEFAULT); - H5Fdelete(MISC24_FILE, H5P_DEFAULT); - H5Fdelete(MISC25A_FILE, H5P_DEFAULT); - H5Fdelete(MISC25C_FILE, H5P_DEFAULT); - H5Fdelete(MISC26_FILE, H5P_DEFAULT); - H5Fdelete(MISC28_FILE, H5P_DEFAULT); - H5Fdelete(MISC29_COPY_FILE, H5P_DEFAULT); - H5Fdelete(MISC30_FILE, H5P_DEFAULT); -#ifndef H5_NO_DEPRECATED_SYMBOLS - H5Fdelete(MISC31_FILE, H5P_DEFAULT); -#endif /* H5_NO_DEPRECATED_SYMBOLS */ -} /* end cleanup_misc() */ diff --git a/test/API/trefer.c b/test/API/trefer.c deleted file mode 100644 index e8abe16..0000000 --- a/test/API/trefer.c +++ /dev/null @@ -1,3636 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: trefer - * - * Test the Reference functionality - * - *************************************************************/ - -#include "testhdf5.h" - -#define FILE_REF_PARAM "trefer_param.h5" -#define FILE_REF_OBJ "trefer_obj.h5" -#define FILE_REF_VL_OBJ "trefer_vl_obj.h5" -#define FILE_REF_CMPND_OBJ "trefer_cmpnd_obj.h5" -#define FILE_REF_REG "trefer_reg.h5" -#define FILE_REF_REG_1D "trefer_reg_1d.h5" -#define FILE_REF_OBJ_DEL "trefer_obj_del.h5" -#define FILE_REF_GRP "trefer_grp.h5" -#define FILE_REF_ATTR "trefer_attr.h5" -#define FILE_REF_EXT1 "trefer_ext1.h5" -#define FILE_REF_EXT2 "trefer_ext2.h5" -#define FILE_REF_COMPAT "trefer_compat.h5" - -/* 1-D dataset with fixed dimensions */ -#define SPACE1_RANK 1 -#define SPACE1_DIM1 4 - -/* 2-D dataset with fixed dimensions */ -#define SPACE2_RANK 2 -#define SPACE2_DIM1 10 -#define SPACE2_DIM2 10 - -/* Larger 1-D dataset with fixed dimensions */ -#define SPACE3_RANK 1 -#define SPACE3_DIM1 100 - -/* Element selection information */ -#define POINT1_NPOINTS 10 - -/* Compound datatype */ -typedef struct s1_t { - unsigned int a; - unsigned int b; - float c; -} s1_t; - -/* Compound datatype with reference */ -typedef struct s2_t { - H5R_ref_t ref0; /* reference */ - H5R_ref_t ref1; /* reference */ - H5R_ref_t ref2; /* reference */ - H5R_ref_t ref3; /* reference */ - unsigned int dim_idx; /* dimension index of the dataset */ -} s2_t; - -#define GROUPNAME "/group" -#define GROUPNAME2 "group2" -#define GROUPNAME3 "group3" -#define DSETNAME "/dset" -#define DSETNAME2 "dset2" -#define NAME_SIZE 16 - -#define MAX_ITER_CREATE 1000 -#define MAX_ITER_WRITE MAX_ITER_CREATE -#define MAX_ITER_READ MAX_ITER_CREATE - -/**************************************************************** -** -** test_reference_params(): Test basic H5R (reference) parameters -** for correct processing -** -****************************************************************/ -static void -test_reference_params(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset, /* Dataset ID */ - dset2; /* Dereferenced dataset ID */ - hid_t group; /* Group ID */ - hid_t attr; /* Attribute ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - hid_t aapl_id; /* Attribute access property list */ - hid_t dapl_id; /* Dataset access property list */ - hsize_t dims1[] = {SPACE1_DIM1}; - H5R_ref_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf; /* temp. buffer read from disk */ - unsigned *obuf; - H5R_type_t type; /* Reference type */ - unsigned int i; /* Counters */ -#if 0 - const char *write_comment = "Foo!"; /* Comments for group */ -#endif - hid_t ret_id; /* Generic hid_t return value */ - ssize_t name_size; /* Size of reference name */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Reference Parameters\n")); - - /* Allocate write & read buffers */ - wbuf = (H5R_ref_t *)calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - rbuf = (H5R_ref_t *)calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - tbuf = (H5R_ref_t *)calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - obuf = calloc(sizeof(unsigned), SPACE1_DIM1); - - for (i = 0; i < SPACE1_DIM1; i++) - obuf[i] = i * 3; - - /* Create file */ - fid1 = H5Fcreate(FILE_REF_PARAM, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create attribute access property list */ - aapl_id = H5Pcreate(H5P_ATTRIBUTE_ACCESS); - CHECK(aapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create dataset access property list */ - dapl_id = H5Pcreate(H5P_DATASET_ACCESS); - CHECK(dapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create a group */ - group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Gcreate2"); -#if 0 - /* Set group's comment */ - ret = H5Oset_comment(group, write_comment); - CHECK(ret, FAIL, "H5Oset_comment"); -#endif - /* Create a dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset1", H5T_NATIVE_UINT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create another dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset2", H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create an attribute for the dataset */ - attr = H5Acreate2(dataset, "Attr", H5T_NATIVE_UINT, sid1, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Acreate2"); - - /* Write attribute to disk */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, obuf); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a datatype to refer to */ - tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid1, H5I_INVALID_HID, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "c", HOFFSET(s1_t, c), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Save datatype for later */ - ret = H5Tcommit2(group, "Datatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset3", H5T_STD_REF, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, H5I_INVALID_HID, "H5Dcreate2"); - - /* Test parameters to H5Rcreate_object */ - H5E_BEGIN_TRY - { - ret = H5Rcreate_object(fid1, "/Group1/Dataset1", H5P_DEFAULT, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_object ref"); - H5E_BEGIN_TRY - { - ret = H5Rcreate_object(H5I_INVALID_HID, "/Group1/Dataset1", H5P_DEFAULT, &wbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_object loc_id"); - H5E_BEGIN_TRY - { - ret = H5Rcreate_object(fid1, NULL, H5P_DEFAULT, &wbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_object name"); - H5E_BEGIN_TRY - { - ret = H5Rcreate_object(fid1, "", H5P_DEFAULT, &wbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_object null name"); - - /* Test parameters to H5Rcreate_region */ - H5E_BEGIN_TRY - { - ret = H5Rcreate_region(fid1, "/Group1/Dataset1", sid1, H5P_DEFAULT, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_region ref"); - H5E_BEGIN_TRY - { - ret = H5Rcreate_region(H5I_INVALID_HID, "/Group1/Dataset1", sid1, H5P_DEFAULT, &wbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_region loc_id"); - H5E_BEGIN_TRY - { - ret = H5Rcreate_region(fid1, NULL, sid1, H5P_DEFAULT, &wbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_region name"); - H5E_BEGIN_TRY - { - ret = H5Rcreate_region(fid1, "/Group1/Dataset1", H5I_INVALID_HID, H5P_DEFAULT, &wbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_region dataspace"); - - /* Test parameters to H5Rcreate_attr */ - H5E_BEGIN_TRY - { - ret = H5Rcreate_attr(fid1, "/Group1/Dataset2", "Attr", H5P_DEFAULT, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_attr ref"); - H5E_BEGIN_TRY - { - ret = H5Rcreate_attr(H5I_INVALID_HID, "/Group1/Dataset2", "Attr", H5P_DEFAULT, &wbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_attr loc_id"); - H5E_BEGIN_TRY - { - ret = H5Rcreate_attr(fid1, NULL, "Attr", H5P_DEFAULT, &wbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_attr name"); - H5E_BEGIN_TRY - { - ret = H5Rcreate_attr(fid1, "/Group1/Dataset2", NULL, H5P_DEFAULT, &wbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcreate_attr attr_name"); - - /* Test parameters to H5Rdestroy */ - H5E_BEGIN_TRY - { - ret = H5Rdestroy(NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rdestroy"); - - /* Test parameters to H5Rget_type */ - H5E_BEGIN_TRY - { - type = H5Rget_type(NULL); - } - H5E_END_TRY - VERIFY(type, H5R_BADTYPE, "H5Rget_type ref"); - - /* Test parameters to H5Requal */ - H5E_BEGIN_TRY - { - ret = H5Requal(NULL, &rbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Requal ref1"); - H5E_BEGIN_TRY - { - ret = H5Requal(&rbuf[0], NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Requal ref2"); - - /* Test parameters to H5Rcopy */ - H5E_BEGIN_TRY - { - ret = H5Rcopy(NULL, &wbuf[0]); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcopy src_ref"); - H5E_BEGIN_TRY - { - ret = H5Rcopy(&rbuf[0], NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rcopy dest_ref"); - - /* Test parameters to H5Ropen_object */ - H5E_BEGIN_TRY - { - dset2 = H5Ropen_object(&rbuf[0], H5I_INVALID_HID, H5I_INVALID_HID); - } - H5E_END_TRY - VERIFY(dset2, H5I_INVALID_HID, "H5Ropen_object oapl_id"); - H5E_BEGIN_TRY - { - dset2 = H5Ropen_object(NULL, H5P_DEFAULT, dapl_id); - } - H5E_END_TRY - VERIFY(dset2, H5I_INVALID_HID, "H5Ropen_object ref"); - - /* Test parameters to H5Ropen_region */ - H5E_BEGIN_TRY - { - ret_id = H5Ropen_region(NULL, H5I_INVALID_HID, H5I_INVALID_HID); - } - H5E_END_TRY - VERIFY(ret_id, H5I_INVALID_HID, "H5Ropen_region ref"); - - /* Test parameters to H5Ropen_attr */ - H5E_BEGIN_TRY - { - ret_id = H5Ropen_attr(NULL, H5P_DEFAULT, aapl_id); - } - H5E_END_TRY - VERIFY(ret_id, H5I_INVALID_HID, "H5Ropen_attr ref"); - - /* Test parameters to H5Rget_obj_type3 */ - H5E_BEGIN_TRY - { - ret = H5Rget_obj_type3(NULL, H5P_DEFAULT, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rget_obj_type3 ref"); - - /* Test parameters to H5Rget_file_name */ - H5E_BEGIN_TRY - { - name_size = H5Rget_file_name(NULL, NULL, 0); - } - H5E_END_TRY - VERIFY(name_size, (-1), "H5Rget_file_name ref"); - - /* Test parameters to H5Rget_obj_name */ - H5E_BEGIN_TRY - { - name_size = H5Rget_obj_name(NULL, H5P_DEFAULT, NULL, 0); - } - H5E_END_TRY - VERIFY(name_size, (-1), "H5Rget_obj_name ref"); - - /* Test parameters to H5Rget_attr_name */ - H5E_BEGIN_TRY - { - name_size = H5Rget_attr_name(NULL, NULL, 0); - } - H5E_END_TRY - VERIFY(name_size, (-1), "H5Rget_attr_name ref"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset access property list */ - ret = H5Pclose(dapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close attribute access property list */ - ret = H5Pclose(aapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); - free(tbuf); - free(obuf); -} /* test_reference_params() */ - -/**************************************************************** -** -** test_reference_obj(): Test basic H5R (reference) object reference code. -** Tests references to various kinds of objects -** -****************************************************************/ -static void -test_reference_obj(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset, /* Dataset ID */ - dset2; /* Dereferenced dataset ID */ - hid_t group; /* Group ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - hsize_t dims1[] = {SPACE1_DIM1}; - hid_t dapl_id; /* Dataset access property list */ - H5R_ref_t *wbuf, /* buffer to write to disk */ - *rbuf; /* buffer read from disk */ - unsigned *ibuf, *obuf; - unsigned i, j; /* Counters */ - H5O_type_t obj_type; /* Object type */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Object Reference Functions\n")); - - /* Allocate write & read buffers */ - wbuf = calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - rbuf = calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - ibuf = calloc(sizeof(unsigned), SPACE1_DIM1); - obuf = calloc(sizeof(unsigned), SPACE1_DIM1); - - for (i = 0; i < SPACE1_DIM1; i++) - obuf[i] = i * 3; - - /* Create file */ - fid1 = H5Fcreate(FILE_REF_OBJ, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create dataset access property list */ - dapl_id = H5Pcreate(H5P_DATASET_ACCESS); - CHECK(dapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create a group */ - group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Gcreate2"); - - /* Create a dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset1", H5T_NATIVE_UINT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create another dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset2", H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a datatype to refer to */ - tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid1, H5I_INVALID_HID, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "c", HOFFSET(s1_t, c), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Save datatype for later */ - ret = H5Tcommit2(group, "Datatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset3", H5T_STD_REF, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create reference to dataset */ - ret = H5Rcreate_object(fid1, "/Group1/Dataset1", H5P_DEFAULT, &wbuf[0]); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&wbuf[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Create reference to dataset */ - ret = H5Rcreate_object(fid1, "/Group1/Dataset2", H5P_DEFAULT, &wbuf[1]); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&wbuf[1], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Create reference to group */ - ret = H5Rcreate_object(fid1, "/Group1", H5P_DEFAULT, &wbuf[2]); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&wbuf[2], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_GROUP, "H5Rget_obj_type3"); - - /* Create reference to named datatype */ - ret = H5Rcreate_object(fid1, "/Group1/Datatype1", H5P_DEFAULT, &wbuf[3]); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&wbuf[3], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_NAMED_DATATYPE, "H5Rget_obj_type3"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid1 = H5Fopen(FILE_REF_OBJ, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "/Dataset3", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Open dataset object */ - dset2 = H5Ropen_object(&rbuf[0], H5P_DEFAULT, dapl_id); - CHECK(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - /* Check information in referenced dataset */ - sid1 = H5Dget_space(dset2); - CHECK(sid1, H5I_INVALID_HID, "H5Dget_space"); - - ret = (int)H5Sget_simple_extent_npoints(sid1); - VERIFY(ret, SPACE1_DIM1, "H5Sget_simple_extent_npoints"); - - /* Read from disk */ - ret = H5Dread(dset2, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf); - CHECK(ret, FAIL, "H5Dread"); - - for (i = 0; i < SPACE1_DIM1; i++) - VERIFY(ibuf[i], i * 3, "Data"); - - /* Close dereferenced Dataset */ - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open group object. GAPL isn't supported yet. But it's harmless to pass in */ - group = H5Ropen_object(&rbuf[2], H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Ropen_object"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open datatype object. TAPL isn't supported yet. But it's harmless to pass in */ - tid1 = H5Ropen_object(&rbuf[3], H5P_DEFAULT, H5P_DEFAULT); - CHECK(tid1, H5I_INVALID_HID, "H5Ropen_object"); - - /* Verify correct datatype */ - { - H5T_class_t tclass; - - tclass = H5Tget_class(tid1); - VERIFY(tclass, H5T_COMPOUND, "H5Tget_class"); - - ret = H5Tget_nmembers(tid1); - VERIFY(ret, 3, "H5Tget_nmembers"); - } - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataset access property list */ - ret = H5Pclose(dapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy references */ - for (j = 0; j < SPACE1_DIM1; j++) { - ret = H5Rdestroy(&wbuf[j]); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&rbuf[j]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - - /* Free memory buffers */ - free(wbuf); - free(rbuf); - free(ibuf); - free(obuf); -} /* test_reference_obj() */ - -/**************************************************************** -** -** test_reference_vlen_obj(): Test basic H5R (reference) object reference -** within a vlen type. -** Tests references to various kinds of objects -** -****************************************************************/ -static void -test_reference_vlen_obj(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset, /* Dataset ID */ - dset2; /* Dereferenced dataset ID */ - hid_t group; /* Group ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - hsize_t dims1[] = {SPACE1_DIM1}; - hsize_t vl_dims[] = {1}; - hid_t dapl_id; /* Dataset access property list */ - H5R_ref_t *wbuf, /* buffer to write to disk */ - *rbuf = NULL; /* buffer read from disk */ - unsigned *ibuf, *obuf; - unsigned i, j; /* Counters */ - H5O_type_t obj_type; /* Object type */ - herr_t ret; /* Generic return value */ - hvl_t vl_wbuf = {0, NULL}, vl_rbuf = {0, NULL}; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Object Reference Functions within VLEN type\n")); - - /* Allocate write & read buffers */ - wbuf = calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - ibuf = calloc(sizeof(unsigned), SPACE1_DIM1); - obuf = calloc(sizeof(unsigned), SPACE1_DIM1); - - for (i = 0; i < SPACE1_DIM1; i++) - obuf[i] = i * 3; - - /* Create file */ - fid1 = H5Fcreate(FILE_REF_VL_OBJ, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create dataset access property list */ - dapl_id = H5Pcreate(H5P_DATASET_ACCESS); - CHECK(dapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create a group */ - group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Gcreate2"); - - /* Create a dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset1", H5T_NATIVE_UINT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create another dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset2", H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create a datatype to refer to */ - tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid1, H5I_INVALID_HID, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "c", HOFFSET(s1_t, c), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Save datatype for later */ - ret = H5Tcommit2(group, "Datatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create vlen type */ - tid1 = H5Tvlen_create(H5T_STD_REF); - CHECK(tid1, H5I_INVALID_HID, "H5Tvlen_create"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, vl_dims, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset3", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create reference to dataset */ - ret = H5Rcreate_object(fid1, "/Group1/Dataset1", H5P_DEFAULT, &wbuf[0]); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&wbuf[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Create reference to dataset */ - ret = H5Rcreate_object(fid1, "/Group1/Dataset2", H5P_DEFAULT, &wbuf[1]); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&wbuf[1], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Create reference to group */ - ret = H5Rcreate_object(fid1, "/Group1", H5P_DEFAULT, &wbuf[2]); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&wbuf[2], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_GROUP, "H5Rget_obj_type3"); - - /* Create reference to named datatype */ - ret = H5Rcreate_object(fid1, "/Group1/Datatype1", H5P_DEFAULT, &wbuf[3]); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&wbuf[3], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_NAMED_DATATYPE, "H5Rget_obj_type3"); - - /* Store references into vlen */ - vl_wbuf.len = SPACE1_DIM1; - vl_wbuf.p = wbuf; - - /* Write selection to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, &vl_wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid1 = H5Fopen(FILE_REF_VL_OBJ, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "/Dataset3", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - tid1 = H5Dget_type(dataset); - CHECK(tid1, H5I_INVALID_HID, "H5Dget_type"); - - /* Read selection from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, &vl_rbuf); - CHECK(ret, FAIL, "H5Dread"); - - VERIFY(vl_rbuf.len, SPACE1_DIM1, "H5Dread"); - rbuf = vl_rbuf.p; - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open dataset object */ - dset2 = H5Ropen_object(&rbuf[0], H5P_DEFAULT, dapl_id); - CHECK(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - /* Check information in referenced dataset */ - sid1 = H5Dget_space(dset2); - CHECK(sid1, H5I_INVALID_HID, "H5Dget_space"); - - ret = (int)H5Sget_simple_extent_npoints(sid1); - VERIFY(ret, SPACE1_DIM1, "H5Sget_simple_extent_npoints"); - - /* Read from disk */ - ret = H5Dread(dset2, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf); - CHECK(ret, FAIL, "H5Dread"); - - for (i = 0; i < SPACE1_DIM1; i++) - VERIFY(ibuf[i], i * 3, "Data"); - - /* Close dereferenced Dataset */ - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open group object. GAPL isn't supported yet. But it's harmless to pass in */ - group = H5Ropen_object(&rbuf[2], H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Ropen_object"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open datatype object. TAPL isn't supported yet. But it's harmless to pass in */ - tid1 = H5Ropen_object(&rbuf[3], H5P_DEFAULT, H5P_DEFAULT); - CHECK(tid1, H5I_INVALID_HID, "H5Ropen_object"); - - /* Verify correct datatype */ - { - H5T_class_t tclass; - - tclass = H5Tget_class(tid1); - VERIFY(tclass, H5T_COMPOUND, "H5Tget_class"); - - ret = H5Tget_nmembers(tid1); - VERIFY(ret, 3, "H5Tget_nmembers"); - } - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataset access property list */ - ret = H5Pclose(dapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy references */ - for (j = 0; j < SPACE1_DIM1; j++) { - ret = H5Rdestroy(&wbuf[j]); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&rbuf[j]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - - /* Free memory buffers */ - free(wbuf); - free(rbuf); - free(ibuf); - free(obuf); -} /* test_reference_vlen_obj() */ - -/**************************************************************** -** -** test_reference_cmpnd_obj(): Test basic H5R (reference) object reference -** within a compound type. -** Tests references to various kinds of objects -** -****************************************************************/ -static void -test_reference_cmpnd_obj(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset, /* Dataset ID */ - dset2; /* Dereferenced dataset ID */ - hid_t group; /* Group ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - hsize_t dims1[] = {SPACE1_DIM1}; - hsize_t cmpnd_dims[] = {1}; - hid_t dapl_id; /* Dataset access property list */ - unsigned *ibuf, *obuf; - unsigned i; /* Counter */ - H5O_type_t obj_type; /* Object type */ - herr_t ret; /* Generic return value */ - s2_t cmpnd_wbuf, cmpnd_rbuf; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Object Reference Functions within compound type\n")); - - /* Allocate write & read buffers */ - ibuf = calloc(sizeof(unsigned), SPACE1_DIM1); - obuf = calloc(sizeof(unsigned), SPACE1_DIM1); - - for (i = 0; i < SPACE1_DIM1; i++) - obuf[i] = i * 3; - - /* Create file */ - fid1 = H5Fcreate(FILE_REF_CMPND_OBJ, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create dataset access property list */ - dapl_id = H5Pcreate(H5P_DATASET_ACCESS); - CHECK(dapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create a group */ - group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Gcreate2"); - - /* Create a dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset1", H5T_NATIVE_UINT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create another dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset2", H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create a datatype to refer to */ - tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid1, H5I_INVALID_HID, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "c", HOFFSET(s1_t, c), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Save datatype for later */ - ret = H5Tcommit2(group, "Datatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create compound type */ - tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s2_t)); - CHECK(tid1, H5I_INVALID_HID, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid1, "ref0", HOFFSET(s2_t, ref0), H5T_STD_REF); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "ref1", HOFFSET(s2_t, ref1), H5T_STD_REF); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "ref2", HOFFSET(s2_t, ref2), H5T_STD_REF); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "ref3", HOFFSET(s2_t, ref3), H5T_STD_REF); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "dim_idx", HOFFSET(s2_t, dim_idx), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, cmpnd_dims, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset3", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Reset buffer for writing */ - memset(&cmpnd_wbuf, 0, sizeof(cmpnd_wbuf)); - - /* Create reference to dataset */ - ret = H5Rcreate_object(fid1, "/Group1/Dataset1", H5P_DEFAULT, &cmpnd_wbuf.ref0); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&cmpnd_wbuf.ref0, H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Create reference to dataset */ - ret = H5Rcreate_object(fid1, "/Group1/Dataset2", H5P_DEFAULT, &cmpnd_wbuf.ref1); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&cmpnd_wbuf.ref1, H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Create reference to group */ - ret = H5Rcreate_object(fid1, "/Group1", H5P_DEFAULT, &cmpnd_wbuf.ref2); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&cmpnd_wbuf.ref2, H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_GROUP, "H5Rget_obj_type3"); - - /* Create reference to named datatype */ - ret = H5Rcreate_object(fid1, "/Group1/Datatype1", H5P_DEFAULT, &cmpnd_wbuf.ref3); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&cmpnd_wbuf.ref3, H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_NAMED_DATATYPE, "H5Rget_obj_type3"); - - /* Store dimensions */ - cmpnd_wbuf.dim_idx = SPACE1_DIM1; - - /* Write selection to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, &cmpnd_wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid1 = H5Fopen(FILE_REF_CMPND_OBJ, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "/Dataset3", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - tid1 = H5Dget_type(dataset); - CHECK(tid1, H5I_INVALID_HID, "H5Dget_type"); - - /* Read selection from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, &cmpnd_rbuf); - CHECK(ret, FAIL, "H5Dread"); - - VERIFY(cmpnd_rbuf.dim_idx, SPACE1_DIM1, "H5Dread"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Open dataset object */ - dset2 = H5Ropen_object(&cmpnd_rbuf.ref0, H5P_DEFAULT, dapl_id); - CHECK(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - /* Check information in referenced dataset */ - sid1 = H5Dget_space(dset2); - CHECK(sid1, H5I_INVALID_HID, "H5Dget_space"); - - ret = (int)H5Sget_simple_extent_npoints(sid1); - VERIFY(ret, SPACE1_DIM1, "H5Sget_simple_extent_npoints"); - - /* Read from disk */ - ret = H5Dread(dset2, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf); - CHECK(ret, FAIL, "H5Dread"); - - for (i = 0; i < SPACE1_DIM1; i++) - VERIFY(ibuf[i], i * 3, "Data"); - - /* Close dereferenced Dataset */ - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open group object. GAPL isn't supported yet. But it's harmless to pass in */ - group = H5Ropen_object(&cmpnd_rbuf.ref2, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Ropen_object"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Open datatype object. TAPL isn't supported yet. But it's harmless to pass in */ - tid1 = H5Ropen_object(&cmpnd_rbuf.ref3, H5P_DEFAULT, H5P_DEFAULT); - CHECK(tid1, H5I_INVALID_HID, "H5Ropen_object"); - - /* Verify correct datatype */ - { - H5T_class_t tclass; - - tclass = H5Tget_class(tid1); - VERIFY(tclass, H5T_COMPOUND, "H5Tget_class"); - - ret = H5Tget_nmembers(tid1); - VERIFY(ret, 3, "H5Tget_nmembers"); - } - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataset access property list */ - ret = H5Pclose(dapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy references */ - ret = H5Rdestroy(&cmpnd_wbuf.ref0); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&cmpnd_wbuf.ref1); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&cmpnd_wbuf.ref2); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&cmpnd_wbuf.ref3); - CHECK(ret, FAIL, "H5Rdestroy"); - - ret = H5Rdestroy(&cmpnd_rbuf.ref0); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&cmpnd_rbuf.ref1); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&cmpnd_rbuf.ref2); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&cmpnd_rbuf.ref3); - CHECK(ret, FAIL, "H5Rdestroy"); - - /* Free memory buffers */ - free(ibuf); - free(obuf); -} /* test_reference_cmpnd_obj() */ - -/**************************************************************** -** -** test_reference_region(): Test basic H5R (reference) object reference code. -** Tests references to various kinds of objects -** -** Note: The libver_low/libver_high parameters are added to create the file -** with the low and high bounds setting in fapl. -** Please see the RFC for "H5Sencode/H5Sdecode Format Change". -** -****************************************************************/ -static void -test_reference_region(H5F_libver_t libver_low, H5F_libver_t libver_high) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t fapl; /* File access property list */ - hid_t dset1, /* Dataset ID */ - dset2; /* Dereferenced dataset ID */ - hid_t sid1, /* Dataspace ID #1 */ - sid2; /* Dataspace ID #2 */ - hid_t dapl_id; /* Dataset access property list */ - hsize_t dims1[] = {SPACE1_DIM1}, dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t start[SPACE2_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE2_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE2_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE2_RANK]; /* Block size of hyperslab */ - hsize_t coord1[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */ - hsize_t *coords; /* Coordinate buffer */ - hsize_t low[SPACE2_RANK]; /* Selection bounds */ - hsize_t high[SPACE2_RANK]; /* Selection bounds */ - H5R_ref_t *wbuf = NULL, /* buffer to write to disk */ - *rbuf = NULL; /* buffer read from disk */ - H5R_ref_t nvrbuf[3] = {{{{0}}}, {{{101}}}, {{{255}}}}; /* buffer with non-valid refs */ - uint8_t *dwbuf = NULL, /* Buffer for writing numeric data to disk */ - *drbuf = NULL; /* Buffer for reading numeric data from disk */ - uint8_t *tu8; /* Temporary pointer to uint8 data */ - H5O_type_t obj_type; /* Type of object */ - int i, j; /* Counters */ - hssize_t hssize_ret; /* hssize_t return value */ - htri_t tri_ret; /* htri_t return value */ - herr_t ret; /* Generic return value */ - hid_t dset_NA; /* Dataset id for undefined reference */ - hid_t space_NA; /* Dataspace id for undefined reference */ - hsize_t dims_NA[1] = {1}; /* Dims array for undefined reference */ - H5R_ref_t rdata_NA[1]; /* Read buffer */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dataset Region Reference Functions\n")); - - /* Allocate write & read buffers */ - wbuf = calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - rbuf = calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - dwbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE2_DIM1 * SPACE2_DIM2)); - drbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE2_DIM1 * SPACE2_DIM2)); - - for (tu8 = dwbuf, i = 0; i < (SPACE2_DIM1 * SPACE2_DIM2); i++) - *tu8++ = (uint8_t)(i * 3); - - /* Create file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, H5I_INVALID_HID, "H5Pcreate"); - - /* Set the low/high version bounds in fapl */ - ret = H5Pset_libver_bounds(fapl, libver_low, libver_high); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Create file with the fapl */ - fid1 = H5Fcreate(FILE_REF_REG, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create dataset access property list */ - dapl_id = H5Pcreate(H5P_DATASET_ACCESS); - CHECK(dapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create a dataset */ - dset2 = H5Dcreate2(fid1, "Dataset2", H5T_STD_U8LE, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset2, H5I_INVALID_HID, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dset2, H5T_STD_U8LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create dataspace for the reference dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create a dataset */ - H5E_BEGIN_TRY - { - dset1 = H5Dcreate2(fid1, "Dataset1", H5T_STD_REF, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - - if (dset1 < 0) { - VERIFY(libver_high <= H5F_LIBVER_V110, true, "H5Dcreate2"); - - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - } - else { - - CHECK(dset1, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create references */ - - /* Select 6x6 hyperslab for first reference */ - start[0] = 2; - start[1] = 2; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 6; - block[1] = 6; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - ret = (int)H5Sget_select_npoints(sid2); - VERIFY(ret, 36, "H5Sget_select_npoints"); - - /* Store first dataset region */ - ret = H5Rcreate_region(fid1, "/Dataset2", sid2, H5P_DEFAULT, &wbuf[0]); - CHECK(ret, FAIL, "H5Rcreate_region"); - ret = H5Rget_obj_type3(&wbuf[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Select sequence of ten points for second reference */ - coord1[0][0] = 6; - coord1[0][1] = 9; - coord1[1][0] = 2; - coord1[1][1] = 2; - coord1[2][0] = 8; - coord1[2][1] = 4; - coord1[3][0] = 1; - coord1[3][1] = 6; - coord1[4][0] = 2; - coord1[4][1] = 8; - coord1[5][0] = 3; - coord1[5][1] = 2; - coord1[6][0] = 0; - coord1[6][1] = 4; - coord1[7][0] = 9; - coord1[7][1] = 0; - coord1[8][0] = 7; - coord1[8][1] = 1; - coord1[9][0] = 3; - coord1[9][1] = 3; - ret = H5Sselect_elements(sid2, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - ret = (int)H5Sget_select_npoints(sid2); - VERIFY(ret, SPACE2_DIM2, "H5Sget_select_npoints"); - - /* Store second dataset region */ - ret = H5Rcreate_region(fid1, "/Dataset2", sid2, H5P_DEFAULT, &wbuf[1]); - CHECK(ret, FAIL, "H5Rcreate_region"); - - /* Select unlimited hyperslab for third reference */ - start[0] = 1; - start[1] = 8; - stride[0] = 4; - stride[1] = 1; - count[0] = H5S_UNLIMITED; - count[1] = 1; - block[0] = 2; - block[1] = 2; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - hssize_ret = H5Sget_select_npoints(sid2); - VERIFY(hssize_ret, (hssize_t)H5S_UNLIMITED, "H5Sget_select_npoints"); - - /* Store third dataset region */ - ret = H5Rcreate_region(fid1, "/Dataset2", sid2, H5P_DEFAULT, &wbuf[2]); - CHECK(ret, FAIL, "H5Rcreate_region"); - - ret = H5Rget_obj_type3(&wbuf[2], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Store fourth dataset region */ - ret = H5Rcreate_region(fid1, "/Dataset2", sid2, H5P_DEFAULT, &wbuf[3]); - CHECK(ret, FAIL, "H5Rcreate_region"); - - /* Write selection to disk */ - ret = H5Dwrite(dset1, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - - /* - * Store a dataset region reference which will not get written to disk - */ - - /* Create the dataspace of the region references */ - space_NA = H5Screate_simple(1, dims_NA, NULL); - CHECK(space_NA, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create the dataset and write the region references to it */ - dset_NA = H5Dcreate2(fid1, "DS_NA", H5T_STD_REF, space_NA, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset_NA, H5I_INVALID_HID, "H5Dcreate"); - - /* Close and release resources for undefined region reference tests */ - ret = H5Dclose(dset_NA); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(space_NA); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close uint8 dataset dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid1 = H5Fopen(FILE_REF_REG, H5F_ACC_RDWR, fapl); - CHECK(fid1, H5I_INVALID_HID, "H5Fopen"); - - /* - * Start the test of an undefined reference - */ - - /* Open the dataset of the undefined references */ - dset_NA = H5Dopen2(fid1, "DS_NA", H5P_DEFAULT); - CHECK(dset_NA, H5I_INVALID_HID, "H5Dopen2"); - - /* Read the data */ - ret = H5Dread(dset_NA, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata_NA); - CHECK(ret, FAIL, "H5Dread"); - - /* - * Dereference an undefined reference (should fail) - */ - H5E_BEGIN_TRY - { - dset2 = H5Ropen_object(&rdata_NA[0], H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - /* Close and release resources. */ - ret = H5Dclose(dset_NA); - CHECK(ret, FAIL, "H5Dclose"); - - /* This close should fail since H5Ropen_object never created - * the id of the referenced object. */ - H5E_BEGIN_TRY - { - ret = H5Dclose(dset2); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dclose"); - - /* - * End the test of an undefined reference - */ - - /* Open the dataset */ - dset1 = H5Dopen2(fid1, "/Dataset1", H5P_DEFAULT); - CHECK(dset1, H5I_INVALID_HID, "H5Dopen2"); - - /* Read selection from disk */ - ret = H5Dread(dset1, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Try to open objects */ - dset2 = H5Ropen_object(&rbuf[0], H5P_DEFAULT, dapl_id); - CHECK(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - /* Check what H5Rget_obj_type3 function returns */ - ret = H5Rget_obj_type3(&rbuf[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Check information in referenced dataset */ - sid1 = H5Dget_space(dset2); - CHECK(sid1, H5I_INVALID_HID, "H5Dget_space"); - - ret = (int)H5Sget_simple_extent_npoints(sid1); - VERIFY(ret, (SPACE2_DIM1 * SPACE2_DIM2), "H5Sget_simple_extent_npoints"); - - /* Read from disk */ - ret = H5Dread(dset2, H5T_STD_U8LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, drbuf); - CHECK(ret, FAIL, "H5Dread"); - - for (tu8 = (uint8_t *)drbuf, i = 0; i < (SPACE2_DIM1 * SPACE2_DIM2); i++, tu8++) - VERIFY(*tu8, (uint8_t)(i * 3), "Data"); - - /* Get the hyperslab selection */ - sid2 = H5Ropen_region(&rbuf[0], H5P_DEFAULT, H5P_DEFAULT); - CHECK(sid2, H5I_INVALID_HID, "H5Ropen_region"); - - /* Verify correct hyperslab selected */ - ret = (int)H5Sget_select_npoints(sid2); - VERIFY(ret, 36, "H5Sget_select_npoints"); - ret = (int)H5Sget_select_hyper_nblocks(sid2); - VERIFY(ret, 1, "H5Sget_select_hyper_nblocks"); - - /* allocate space for the hyperslab blocks */ - coords = (hsize_t *)malloc((size_t)ret * SPACE2_RANK * sizeof(hsize_t) * 2); - - ret = H5Sget_select_hyper_blocklist(sid2, (hsize_t)0, (hsize_t)ret, coords); - CHECK(ret, FAIL, "H5Sget_select_hyper_blocklist"); - VERIFY(coords[0], 2, "Hyperslab Coordinates"); - VERIFY(coords[1], 2, "Hyperslab Coordinates"); - VERIFY(coords[2], 7, "Hyperslab Coordinates"); - VERIFY(coords[3], 7, "Hyperslab Coordinates"); - free(coords); - ret = H5Sget_select_bounds(sid2, low, high); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low[0], 2, "Selection Bounds"); - VERIFY(low[1], 2, "Selection Bounds"); - VERIFY(high[0], 7, "Selection Bounds"); - VERIFY(high[1], 7, "Selection Bounds"); - - /* Close region space */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Get the element selection */ - sid2 = H5Ropen_region(&rbuf[1], H5P_DEFAULT, H5P_DEFAULT); - CHECK(sid2, H5I_INVALID_HID, "H5Ropen_region"); - - /* Verify correct elements selected */ - ret = (int)H5Sget_select_npoints(sid2); - VERIFY(ret, SPACE2_DIM2, "H5Sget_select_npoints"); - ret = (int)H5Sget_select_elem_npoints(sid2); - VERIFY(ret, SPACE2_DIM2, "H5Sget_select_elem_npoints"); - - /* allocate space for the element points */ - coords = (hsize_t *)malloc((size_t)ret * SPACE2_RANK * sizeof(hsize_t)); - - ret = H5Sget_select_elem_pointlist(sid2, (hsize_t)0, (hsize_t)ret, coords); - CHECK(ret, FAIL, "H5Sget_select_elem_pointlist"); - VERIFY(coords[0], coord1[0][0], "Element Coordinates"); - VERIFY(coords[1], coord1[0][1], "Element Coordinates"); - VERIFY(coords[2], coord1[1][0], "Element Coordinates"); - VERIFY(coords[3], coord1[1][1], "Element Coordinates"); - VERIFY(coords[4], coord1[2][0], "Element Coordinates"); - VERIFY(coords[5], coord1[2][1], "Element Coordinates"); - VERIFY(coords[6], coord1[3][0], "Element Coordinates"); - VERIFY(coords[7], coord1[3][1], "Element Coordinates"); - VERIFY(coords[8], coord1[4][0], "Element Coordinates"); - VERIFY(coords[9], coord1[4][1], "Element Coordinates"); - VERIFY(coords[10], coord1[5][0], "Element Coordinates"); - VERIFY(coords[11], coord1[5][1], "Element Coordinates"); - VERIFY(coords[12], coord1[6][0], "Element Coordinates"); - VERIFY(coords[13], coord1[6][1], "Element Coordinates"); - VERIFY(coords[14], coord1[7][0], "Element Coordinates"); - VERIFY(coords[15], coord1[7][1], "Element Coordinates"); - VERIFY(coords[16], coord1[8][0], "Element Coordinates"); - VERIFY(coords[17], coord1[8][1], "Element Coordinates"); - VERIFY(coords[18], coord1[9][0], "Element Coordinates"); - VERIFY(coords[19], coord1[9][1], "Element Coordinates"); - free(coords); - ret = H5Sget_select_bounds(sid2, low, high); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low[0], 0, "Selection Bounds"); - VERIFY(low[1], 0, "Selection Bounds"); - VERIFY(high[0], 9, "Selection Bounds"); - VERIFY(high[1], 9, "Selection Bounds"); - - /* Close region space */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Get the unlimited selection */ - sid2 = H5Ropen_region(&rbuf[2], H5P_DEFAULT, H5P_DEFAULT); - CHECK(sid2, H5I_INVALID_HID, "H5Ropen_region"); - - /* Verify correct hyperslab selected */ - hssize_ret = H5Sget_select_npoints(sid2); - VERIFY(hssize_ret, (hssize_t)H5S_UNLIMITED, "H5Sget_select_npoints"); - tri_ret = H5Sis_regular_hyperslab(sid2); - CHECK(tri_ret, FAIL, "H5Sis_regular_hyperslab"); - VERIFY(tri_ret, true, "H5Sis_regular_hyperslab Result"); - ret = H5Sget_regular_hyperslab(sid2, start, stride, count, block); - CHECK(ret, FAIL, "H5Sget_regular_hyperslab"); - VERIFY(start[0], (hsize_t)1, "Hyperslab Coordinates"); - VERIFY(start[1], (hsize_t)8, "Hyperslab Coordinates"); - VERIFY(stride[0], (hsize_t)4, "Hyperslab Coordinates"); - VERIFY(stride[1], (hsize_t)1, "Hyperslab Coordinates"); - VERIFY(count[0], H5S_UNLIMITED, "Hyperslab Coordinates"); - VERIFY(count[1], (hsize_t)1, "Hyperslab Coordinates"); - VERIFY(block[0], (hsize_t)2, "Hyperslab Coordinates"); - VERIFY(block[1], (hsize_t)2, "Hyperslab Coordinates"); - - /* Close region space */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close first space */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dereferenced Dataset */ - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Attempting to retrieve type of object using non-valid refs */ - for (j = 0; j < 3; j++) { - H5E_BEGIN_TRY - { - ret = H5Rget_obj_type3(&nvrbuf[j], H5P_DEFAULT, &obj_type); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Rget_obj_type3"); - } /* end for */ - - /* Close Dataset */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataset access property list */ - ret = H5Pclose(dapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy references */ - for (j = 0; j < SPACE1_DIM1; j++) { - ret = H5Rdestroy(&wbuf[j]); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&rbuf[j]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - } - - /* Free memory buffers */ - free(wbuf); - free(rbuf); - free(dwbuf); - free(drbuf); - -} /* test_reference_region() */ - -/**************************************************************** -** -** test_reference_region_1D(): Test H5R (reference) object reference code. -** Tests 1-D references to various kinds of objects -** -** Note: The libver_low/libver_high parameters are added to create the file -** with the low and high bounds setting in fapl. -** Please see the RFC for "H5Sencode/H5Sdecode Format Change". -** -****************************************************************/ -static void -test_reference_region_1D(H5F_libver_t libver_low, H5F_libver_t libver_high) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t fapl; /* File access property list */ - hid_t dset1, /* Dataset ID */ - dset3; /* Dereferenced dataset ID */ - hid_t sid1, /* Dataspace ID #1 */ - sid3; /* Dataspace ID #3 */ - hid_t dapl_id; /* Dataset access property list */ - hsize_t dims1[] = {2}, /* Must be 2 */ - dims3[] = {SPACE3_DIM1}; - hsize_t start[SPACE3_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE3_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE3_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE3_RANK]; /* Block size of hyperslab */ - hsize_t coord1[POINT1_NPOINTS][SPACE3_RANK]; /* Coordinates for point selection */ - hsize_t *coords; /* Coordinate buffer */ - hsize_t low[SPACE3_RANK]; /* Selection bounds */ - hsize_t high[SPACE3_RANK]; /* Selection bounds */ - H5R_ref_t *wbuf = NULL, /* buffer to write to disk */ - *rbuf = NULL; /* buffer read from disk */ - uint8_t *dwbuf = NULL, /* Buffer for writing numeric data to disk */ - *drbuf = NULL; /* Buffer for reading numeric data from disk */ - uint8_t *tu8; /* Temporary pointer to uint8 data */ - H5O_type_t obj_type; /* Object type */ - int i; /* Counter */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 1-D Dataset Region Reference Functions\n")); - - /* Allocate write & read buffers */ - wbuf = calloc(sizeof(H5R_ref_t), (size_t)SPACE1_DIM1); - rbuf = calloc(sizeof(H5R_ref_t), (size_t)SPACE1_DIM1); - dwbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)SPACE3_DIM1); - drbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)SPACE3_DIM1); - - for (tu8 = dwbuf, i = 0; i < SPACE3_DIM1; i++) - *tu8++ = (uint8_t)(i * 3); - - /* Create the file access property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, H5I_INVALID_HID, "H5Pcreate"); - - /* Set the low/high version bounds in fapl */ - ret = H5Pset_libver_bounds(fapl, libver_low, libver_high); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); - - /* Create file with the fapl */ - fid1 = H5Fcreate(FILE_REF_REG_1D, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid3 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid3, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create dataset access property list */ - dapl_id = H5Pcreate(H5P_DATASET_ACCESS); - CHECK(dapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create a dataset */ - dset3 = H5Dcreate2(fid1, "Dataset2", H5T_STD_U8LE, sid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset3, H5I_INVALID_HID, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dset3, H5T_STD_U8LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, dwbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create dataspace for the reference dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create a dataset */ - H5E_BEGIN_TRY - { - dset1 = H5Dcreate2(fid1, "Dataset1", H5T_STD_REF, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - } - H5E_END_TRY - - if (dset1 < 0) { - - VERIFY(libver_high <= H5F_LIBVER_V110, true, "H5Dcreate2"); - - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - } - else { - - CHECK(ret, FAIL, "H5Dcreate2"); - - /* Create references */ - - /* Select 15 2x1 hyperslabs for first reference */ - start[0] = 2; - stride[0] = 5; - count[0] = 15; - block[0] = 2; - ret = H5Sselect_hyperslab(sid3, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - ret = (int)H5Sget_select_npoints(sid3); - VERIFY(ret, (block[0] * count[0]), "H5Sget_select_npoints"); - - /* Store first dataset region */ - ret = H5Rcreate_region(fid1, "/Dataset2", sid3, H5P_DEFAULT, &wbuf[0]); - CHECK(ret, FAIL, "H5Rcreate_region"); - ret = H5Rget_obj_type3(&wbuf[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Select sequence of ten points for second reference */ - coord1[0][0] = 16; - coord1[1][0] = 22; - coord1[2][0] = 38; - coord1[3][0] = 41; - coord1[4][0] = 52; - coord1[5][0] = 63; - coord1[6][0] = 70; - coord1[7][0] = 89; - coord1[8][0] = 97; - coord1[9][0] = 03; - ret = H5Sselect_elements(sid3, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - ret = (int)H5Sget_select_npoints(sid3); - VERIFY(ret, POINT1_NPOINTS, "H5Sget_select_npoints"); - - /* Store second dataset region */ - ret = H5Rcreate_region(fid1, "/Dataset2", sid3, H5P_DEFAULT, &wbuf[1]); - CHECK(ret, FAIL, "H5Rcreate_region"); - - /* Write selection to disk */ - ret = H5Dwrite(dset1, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close uint8 dataset dataspace */ - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid1 = H5Fopen(FILE_REF_REG_1D, H5F_ACC_RDWR, fapl); - CHECK(fid1, H5I_INVALID_HID, "H5Fopen"); - - /* Open the dataset */ - dset1 = H5Dopen2(fid1, "/Dataset1", H5P_DEFAULT); - CHECK(dset1, H5I_INVALID_HID, "H5Dopen2"); - - /* Read selection from disk */ - ret = H5Dread(dset1, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Try to open objects */ - dset3 = H5Ropen_object(&rbuf[0], H5P_DEFAULT, dapl_id); - CHECK(dset3, H5I_INVALID_HID, "H5Ropen_object"); - - /* Check what H5Rget_obj_type3 function returns */ - ret = H5Rget_obj_type3(&rbuf[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Check information in referenced dataset */ - sid1 = H5Dget_space(dset3); - CHECK(sid1, H5I_INVALID_HID, "H5Dget_space"); - - ret = (int)H5Sget_simple_extent_npoints(sid1); - VERIFY(ret, SPACE3_DIM1, "H5Sget_simple_extent_npoints"); - - /* Read from disk */ - ret = H5Dread(dset3, H5T_STD_U8LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, drbuf); - CHECK(ret, FAIL, "H5Dread"); - - for (tu8 = (uint8_t *)drbuf, i = 0; i < SPACE3_DIM1; i++, tu8++) - VERIFY(*tu8, (uint8_t)(i * 3), "Data"); - - /* Get the hyperslab selection */ - sid3 = H5Ropen_region(&rbuf[0], H5P_DEFAULT, H5P_DEFAULT); - CHECK(sid3, H5I_INVALID_HID, "H5Ropen_region"); - - /* Verify correct hyperslab selected */ - ret = (int)H5Sget_select_npoints(sid3); - VERIFY(ret, 30, "H5Sget_select_npoints"); - ret = (int)H5Sget_select_hyper_nblocks(sid3); - VERIFY(ret, 15, "H5Sget_select_hyper_nblocks"); - - /* allocate space for the hyperslab blocks */ - coords = (hsize_t *)malloc((size_t)ret * SPACE3_RANK * sizeof(hsize_t) * 2); - - ret = H5Sget_select_hyper_blocklist(sid3, (hsize_t)0, (hsize_t)ret, coords); - CHECK(ret, FAIL, "H5Sget_select_hyper_blocklist"); - VERIFY(coords[0], 2, "Hyperslab Coordinates"); - VERIFY(coords[1], 3, "Hyperslab Coordinates"); - VERIFY(coords[2], 7, "Hyperslab Coordinates"); - VERIFY(coords[3], 8, "Hyperslab Coordinates"); - VERIFY(coords[4], 12, "Hyperslab Coordinates"); - VERIFY(coords[5], 13, "Hyperslab Coordinates"); - VERIFY(coords[6], 17, "Hyperslab Coordinates"); - VERIFY(coords[7], 18, "Hyperslab Coordinates"); - VERIFY(coords[8], 22, "Hyperslab Coordinates"); - VERIFY(coords[9], 23, "Hyperslab Coordinates"); - VERIFY(coords[10], 27, "Hyperslab Coordinates"); - VERIFY(coords[11], 28, "Hyperslab Coordinates"); - VERIFY(coords[12], 32, "Hyperslab Coordinates"); - VERIFY(coords[13], 33, "Hyperslab Coordinates"); - VERIFY(coords[14], 37, "Hyperslab Coordinates"); - VERIFY(coords[15], 38, "Hyperslab Coordinates"); - VERIFY(coords[16], 42, "Hyperslab Coordinates"); - VERIFY(coords[17], 43, "Hyperslab Coordinates"); - VERIFY(coords[18], 47, "Hyperslab Coordinates"); - VERIFY(coords[19], 48, "Hyperslab Coordinates"); - VERIFY(coords[20], 52, "Hyperslab Coordinates"); - VERIFY(coords[21], 53, "Hyperslab Coordinates"); - VERIFY(coords[22], 57, "Hyperslab Coordinates"); - VERIFY(coords[23], 58, "Hyperslab Coordinates"); - VERIFY(coords[24], 62, "Hyperslab Coordinates"); - VERIFY(coords[25], 63, "Hyperslab Coordinates"); - VERIFY(coords[26], 67, "Hyperslab Coordinates"); - VERIFY(coords[27], 68, "Hyperslab Coordinates"); - VERIFY(coords[28], 72, "Hyperslab Coordinates"); - VERIFY(coords[29], 73, "Hyperslab Coordinates"); - free(coords); - ret = H5Sget_select_bounds(sid3, low, high); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low[0], 2, "Selection Bounds"); - VERIFY(high[0], 73, "Selection Bounds"); - - /* Close region space */ - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - /* Get the element selection */ - sid3 = H5Ropen_region(&rbuf[1], H5P_DEFAULT, H5P_DEFAULT); - CHECK(sid3, H5I_INVALID_HID, "H5Ropen_region"); - - /* Verify correct elements selected */ - ret = (int)H5Sget_select_npoints(sid3); - VERIFY(ret, 10, "H5Sget_select_npoints"); - ret = (int)H5Sget_select_elem_npoints(sid3); - VERIFY(ret, 10, "H5Sget_select_elem_npoints"); - - /* allocate space for the element points */ - coords = (hsize_t *)malloc((size_t)ret * SPACE3_RANK * sizeof(hsize_t)); - - ret = H5Sget_select_elem_pointlist(sid3, (hsize_t)0, (hsize_t)ret, coords); - CHECK(ret, FAIL, "H5Sget_select_elem_pointlist"); - VERIFY(coords[0], coord1[0][0], "Element Coordinates"); - VERIFY(coords[1], coord1[1][0], "Element Coordinates"); - VERIFY(coords[2], coord1[2][0], "Element Coordinates"); - VERIFY(coords[3], coord1[3][0], "Element Coordinates"); - VERIFY(coords[4], coord1[4][0], "Element Coordinates"); - VERIFY(coords[5], coord1[5][0], "Element Coordinates"); - VERIFY(coords[6], coord1[6][0], "Element Coordinates"); - VERIFY(coords[7], coord1[7][0], "Element Coordinates"); - VERIFY(coords[8], coord1[8][0], "Element Coordinates"); - VERIFY(coords[9], coord1[9][0], "Element Coordinates"); - free(coords); - ret = H5Sget_select_bounds(sid3, low, high); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low[0], 3, "Selection Bounds"); - VERIFY(high[0], 97, "Selection Bounds"); - - /* Close region space */ - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close first space */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dereferenced Dataset */ - ret = H5Dclose(dset3); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close Dataset */ - ret = H5Dclose(dset1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataset access property list */ - ret = H5Pclose(dapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file access property list */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy references */ - for (i = 0; i < 2; i++) { - ret = H5Rdestroy(&wbuf[i]); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&rbuf[i]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - } - - /* Free memory buffers */ - free(wbuf); - free(rbuf); - free(dwbuf); - free(drbuf); - -} /* test_reference_region_1D() */ - -/**************************************************************** -** -** test_reference_obj_deleted(): Test H5R (reference) object reference code. -** Tests for correct failures for deleted and non-existent objects -** -****************************************************************/ -static void -test_reference_obj_deleted(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset, /* Dataset ID */ - dset2; /* Dereferenced dataset ID */ - hid_t sid1; /* Dataspace ID */ - H5R_ref_t oref; /* Object Reference to test */ - H5O_type_t obj_type; /* Object type */ - herr_t ret; /* Generic return value */ - - MESSAGE(5, ("Testing References to Deleted Objects\n")); - - if ((vol_cap_flags_g & H5VL_CAP_FLAG_REF_BASIC) && (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) && - (vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) && (vol_cap_flags_g & H5VL_CAP_FLAG_LINK_BASIC)) { - /* Create file */ - fid1 = H5Fcreate(FILE_REF_OBJ_DEL, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - - /* Create scalar dataspace for datasets */ - sid1 = H5Screate_simple(0, NULL, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create a dataset to reference (deleted later) */ - dataset = H5Dcreate2(fid1, "Dataset1", H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset2", H5T_STD_REF, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create reference to dataset */ - ret = H5Rcreate_object(fid1, "/Dataset1", H5P_DEFAULT, &oref); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&oref, H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, &oref); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Delete referenced dataset */ - ret = H5Ldelete(fid1, "/Dataset1", H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy reference */ - ret = H5Rdestroy(&oref); - CHECK(ret, FAIL, "H5Rdestroy"); - - /* Re-open the file */ - fid1 = H5Fopen(FILE_REF_OBJ_DEL, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "/Dataset2", H5P_DEFAULT); - CHECK(ret, H5I_INVALID_HID, "H5Dopen2"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, &oref); - CHECK(ret, FAIL, "H5Dread"); - - /* Open deleted dataset object */ - dset2 = H5Ropen_object(&oref, H5P_DEFAULT, H5P_DEFAULT); - VERIFY(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy reference */ - ret = H5Rdestroy(&oref); - CHECK(ret, FAIL, "H5Rdestroy"); - } -} /* test_reference_obj_deleted() */ - -/**************************************************************** -** -** test_deref_iter_op(): Iterator callback for test_reference_group_iterate() -** test. -** -****************************************************************/ -static herr_t -test_deref_iter_op(hid_t H5_ATTR_UNUSED group, const char *name, const H5L_info2_t H5_ATTR_UNUSED *info, - void *op_data) -{ - int *count = (int *)op_data; /* Pointer to name counter */ - herr_t ret_value; - - /* Simple check for correct names */ - if (*count == 0) { - if (strcmp(name, DSETNAME2) == 0) - ret_value = 0; - else - ret_value = -1; - } /* end if */ - else if (*count == 1) { - if (strcmp(name, GROUPNAME2) == 0) - ret_value = 0; - else - ret_value = -1; - } /* end if */ - else if (*count == 2) { - if (strcmp(name, GROUPNAME3) == 0) - ret_value = 0; - else - ret_value = -1; - } /* end if */ - else - ret_value = -1; - - (*count)++; - - return (ret_value); -} /* end test_deref_iter_op() */ - -/**************************************************************** -** -** test_reference_group(): Test H5R (reference) object reference code. -** Tests for correct behavior of various routines on dereferenced group -** -****************************************************************/ -static void -test_reference_group(void) -{ - hid_t fid = -1; /* File ID */ - hid_t gid = -1, gid2 = -1; /* Group IDs */ - hid_t did; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - H5R_ref_t wref; /* Reference to write */ - H5R_ref_t rref; /* Reference to read */ - H5G_info_t ginfo; /* Group info struct */ - char objname[NAME_SIZE]; /* Buffer to store name */ - H5O_info2_t oinfo; /* Object info struct */ - int count = 0; /* Count within iterated group */ - ssize_t size; /* Name length */ - herr_t ret; - - /* Create file with a group and a dataset containing an object reference to the group */ - fid = H5Fcreate(FILE_REF_GRP, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace to use for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, H5I_INVALID_HID, "H5Screate"); - - /* Create group to refer to */ - gid = H5Gcreate2(fid, GROUPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, H5I_INVALID_HID, "H5Gcreate2"); - - /* Create nested groups */ - gid2 = H5Gcreate2(gid, GROUPNAME2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid2, H5I_INVALID_HID, "H5Gcreate2"); - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - gid2 = H5Gcreate2(gid, GROUPNAME3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid2, H5I_INVALID_HID, "H5Gcreate2"); - ret = H5Gclose(gid2); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create bottom dataset */ - did = H5Dcreate2(gid, DSETNAME2, H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate2"); - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create dataset */ - did = H5Dcreate2(fid, DSETNAME, H5T_STD_REF, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create reference to group */ - ret = H5Rcreate_object(fid, GROUPNAME, H5P_DEFAULT, &wref); - CHECK(ret, FAIL, "H5Rcreate_object"); - - /* Write reference to disk */ - ret = H5Dwrite(did, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wref); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close objects */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy reference */ - ret = H5Rdestroy(&wref); - CHECK(ret, FAIL, "H5Rdestroy"); - - /* Re-open file */ - fid = H5Fopen(FILE_REF_GRP, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, H5I_INVALID_HID, "H5Fopen"); - - /* Re-open dataset */ - did = H5Dopen2(fid, DSETNAME, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dopen2"); - - /* Read in the reference */ - ret = H5Dread(did, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, &rref); - CHECK(ret, FAIL, "H5Dread"); - - /* Dereference to get the group */ - gid = H5Ropen_object(&rref, H5P_DEFAULT, H5P_DEFAULT); - CHECK(gid, H5I_INVALID_HID, "H5Ropen_object"); - - /* Iterate through objects in dereferenced group */ - ret = H5Literate2(gid, H5_INDEX_NAME, H5_ITER_INC, NULL, test_deref_iter_op, &count); - CHECK(ret, FAIL, "H5Literate"); - - /* Various queries on the group opened */ - ret = H5Gget_info(gid, &ginfo); - CHECK(ret, FAIL, "H5Gget_info"); - VERIFY(ginfo.nlinks, 3, "H5Gget_info"); - - size = H5Lget_name_by_idx(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)0, objname, (size_t)NAME_SIZE, - H5P_DEFAULT); - CHECK(size, (-1), "H5Lget_name_by_idx"); - VERIFY_STR(objname, DSETNAME2, "H5Lget_name_by_idx"); - - ret = H5Oget_info_by_idx3(gid, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)0, &oinfo, H5O_INFO_BASIC, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_idx3"); - VERIFY(oinfo.type, H5O_TYPE_DATASET, "H5Oget_info_by_idx3"); - - /* Unlink one of the objects in the dereferenced group */ - ret = H5Ldelete(gid, GROUPNAME2, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Delete dataset object in dereferenced group (with other dataset still open) */ - ret = H5Ldelete(gid, DSETNAME2, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - - /* Close objects */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Gclose(gid); - CHECK(ret, FAIL, "H5Gclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy reference */ - ret = H5Rdestroy(&rref); - CHECK(ret, FAIL, "H5Rdestroy"); -} /* test_reference_group() */ - -/**************************************************************** -** -** test_reference_attr(): Test basic H5R (reference) attribute reference code. -** Tests references to attributes on various kinds of objects -** -****************************************************************/ -static void -test_reference_attr(void) -{ - hid_t fid; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t group; /* Group ID */ - hid_t attr; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hsize_t dims[] = {SPACE1_DIM1}; - hid_t dapl_id; /* Dataset access property list */ - H5R_ref_t ref_wbuf[SPACE1_DIM1], /* Buffer to write to disk */ - ref_rbuf[SPACE1_DIM1]; /* Buffer read from disk */ - unsigned wbuf[SPACE1_DIM1], rbuf[SPACE1_DIM1]; - unsigned i; /* Local index variables */ - H5O_type_t obj_type; /* Object type */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Attribute Reference Functions\n")); - - /* Create file */ - fid = H5Fcreate(FILE_REF_ATTR, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid = H5Screate_simple(SPACE1_RANK, dims, NULL); - CHECK(sid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create dataset access property list */ - dapl_id = H5Pcreate(H5P_DATASET_ACCESS); - CHECK(dapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create a group */ - group = H5Gcreate2(fid, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Gcreate2"); - - /* Create an attribute for the dataset */ - attr = H5Acreate2(group, "Attr2", H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Acreate2"); - - for (i = 0; i < SPACE1_DIM1; i++) - wbuf[i] = (i * 3) + 1; - - /* Write attribute to disk */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, wbuf); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create a dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset1", H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create an attribute for the dataset */ - attr = H5Acreate2(dataset, "Attr1", H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Acreate2"); - - for (i = 0; i < SPACE1_DIM1; i++) - wbuf[i] = i * 3; - - /* Write attribute to disk */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, wbuf); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create another dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset2", H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a datatype to refer to */ - tid = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid, H5I_INVALID_HID, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid, "b", HOFFSET(s1_t, b), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid, "c", HOFFSET(s1_t, c), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Save datatype for later */ - ret = H5Tcommit2(group, "Datatype1", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create an attribute for the datatype */ - attr = H5Acreate2(tid, "Attr3", H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Acreate2"); - - for (i = 0; i < SPACE1_DIM1; i++) - wbuf[i] = (i * 3) + 2; - - /* Write attribute to disk */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, wbuf); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid, "Dataset3", H5T_STD_REF, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create reference to dataset1 attribute */ - ret = H5Rcreate_attr(fid, "/Group1/Dataset1", "Attr1", H5P_DEFAULT, &ref_wbuf[0]); - CHECK(ret, FAIL, "H5Rcreate_attr"); - ret = H5Rget_obj_type3(&ref_wbuf[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Create reference to dataset2 attribute */ - ret = H5Rcreate_attr(fid, "/Group1/Dataset2", "Attr1", H5P_DEFAULT, &ref_wbuf[1]); - CHECK(ret, FAIL, "H5Rcreate_attr"); - ret = H5Rget_obj_type3(&ref_wbuf[1], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Create reference to group attribute */ - ret = H5Rcreate_attr(fid, "/Group1", "Attr2", H5P_DEFAULT, &ref_wbuf[2]); - CHECK(ret, FAIL, "H5Rcreate_attr"); - ret = H5Rget_obj_type3(&ref_wbuf[2], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_GROUP, "H5Rget_obj_type3"); - - /* Create reference to named datatype attribute */ - ret = H5Rcreate_attr(fid, "/Group1/Datatype1", "Attr3", H5P_DEFAULT, &ref_wbuf[3]); - CHECK(ret, FAIL, "H5Rcreate_attr"); - ret = H5Rget_obj_type3(&ref_wbuf[3], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_NAMED_DATATYPE, "H5Rget_obj_type3"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, ref_wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid = H5Fopen(FILE_REF_ATTR, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid, "/Dataset3", H5P_DEFAULT); - CHECK(ret, H5I_INVALID_HID, "H5Dopen2"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, ref_rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Open attribute on dataset object */ - attr = H5Ropen_attr(&ref_rbuf[0], H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Ropen_attr"); - - /* Check information in referenced dataset */ - sid = H5Aget_space(attr); - CHECK(sid, H5I_INVALID_HID, "H5Aget_space"); - - ret = (int)H5Sget_simple_extent_npoints(sid); - VERIFY(ret, SPACE1_DIM1, "H5Sget_simple_extent_npoints"); - - /* Read from disk */ - ret = H5Aread(attr, H5T_NATIVE_UINT, rbuf); - CHECK(ret, FAIL, "H5Aread"); - - for (i = 0; i < SPACE1_DIM1; i++) - VERIFY(rbuf[i], i * 3, "Data"); - - /* Close dereferenced Dataset */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open attribute on group object */ - attr = H5Ropen_attr(&ref_rbuf[2], H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Ropen_attr"); - - /* Read from disk */ - ret = H5Aread(attr, H5T_NATIVE_UINT, rbuf); - CHECK(ret, FAIL, "H5Aread"); - - for (i = 0; i < SPACE1_DIM1; i++) - VERIFY(rbuf[i], (i * 3) + 1, "Data"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open attribute on named datatype object */ - attr = H5Ropen_attr(&ref_rbuf[3], H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Ropen_attr"); - - /* Read from disk */ - ret = H5Aread(attr, H5T_NATIVE_UINT, rbuf); - CHECK(ret, FAIL, "H5Aread"); - - for (i = 0; i < SPACE1_DIM1; i++) - VERIFY(rbuf[i], (i * 3) + 2, "Data"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataset access property list */ - ret = H5Pclose(dapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - for (i = 0; i < SPACE1_DIM1; i++) { - ret = H5Rdestroy(&ref_wbuf[i]); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&ref_rbuf[i]); - CHECK(ret, FAIL, "H5Rdestroy"); - } -} /* test_reference_attr() */ - -/**************************************************************** -** -** test_reference_external(): -** Tests external references on various kinds of objects -** -****************************************************************/ -static void -test_reference_external(void) -{ - hid_t fid1, fid2; /* HDF5 File ID */ - hid_t dataset; /* Dataset ID */ - hid_t group; /* Group ID */ - hid_t attr; /* Attribute ID */ - hid_t sid; /* Dataspace ID */ - hid_t tid; /* Datatype ID */ - hsize_t dims[] = {SPACE1_DIM1}; - hid_t dapl_id; /* Dataset access property list */ - H5R_ref_t ref_wbuf[SPACE1_DIM1], /* Buffer to write to disk */ - ref_rbuf[SPACE1_DIM1]; /* Buffer read from disk */ - unsigned wbuf[SPACE1_DIM1], rbuf[SPACE1_DIM1]; - unsigned i; /* Local index variables */ - H5O_type_t obj_type; /* Object type */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing External References Functions\n")); - - /* Create file */ - fid1 = H5Fcreate(FILE_REF_EXT1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid = H5Screate_simple(SPACE1_RANK, dims, NULL); - CHECK(sid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create dataset access property list */ - dapl_id = H5Pcreate(H5P_DATASET_ACCESS); - CHECK(dapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create a group */ - group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Gcreate2"); - - /* Create an attribute for the dataset */ - attr = H5Acreate2(group, "Attr2", H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Acreate2"); - - for (i = 0; i < SPACE1_DIM1; i++) - wbuf[i] = (i * 3) + 1; - - /* Write attribute to disk */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, wbuf); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Create a dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset1", H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create an attribute for the dataset */ - attr = H5Acreate2(dataset, "Attr1", H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Acreate2"); - - for (i = 0; i < SPACE1_DIM1; i++) - wbuf[i] = i * 3; - - /* Write attribute to disk */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, wbuf); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create another dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset2", H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a datatype to refer to */ - tid = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid, H5I_INVALID_HID, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid, "b", HOFFSET(s1_t, b), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid, "c", HOFFSET(s1_t, c), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Save datatype for later */ - ret = H5Tcommit2(group, "Datatype1", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Create an attribute for the datatype */ - attr = H5Acreate2(tid, "Attr3", H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Acreate2"); - - for (i = 0; i < SPACE1_DIM1; i++) - wbuf[i] = (i * 3) + 2; - - /* Write attribute to disk */ - ret = H5Awrite(attr, H5T_NATIVE_UINT, wbuf); - CHECK(ret, FAIL, "H5Awrite"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close datatype */ - ret = H5Tclose(tid); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create reference to dataset1 attribute */ - ret = H5Rcreate_attr(fid1, "/Group1/Dataset1", "Attr1", H5P_DEFAULT, &ref_wbuf[0]); - CHECK(ret, FAIL, "H5Rcreate_attr"); - ret = H5Rget_obj_type3(&ref_wbuf[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Create reference to dataset2 attribute */ - ret = H5Rcreate_attr(fid1, "/Group1/Dataset2", "Attr1", H5P_DEFAULT, &ref_wbuf[1]); - CHECK(ret, FAIL, "H5Rcreate_attr"); - ret = H5Rget_obj_type3(&ref_wbuf[1], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Create reference to group attribute */ - ret = H5Rcreate_attr(fid1, "/Group1", "Attr2", H5P_DEFAULT, &ref_wbuf[2]); - CHECK(ret, FAIL, "H5Rcreate_attr"); - ret = H5Rget_obj_type3(&ref_wbuf[2], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_GROUP, "H5Rget_obj_type3"); - - /* Create reference to named datatype attribute */ - ret = H5Rcreate_attr(fid1, "/Group1/Datatype1", "Attr3", H5P_DEFAULT, &ref_wbuf[3]); - CHECK(ret, FAIL, "H5Rcreate_attr"); - ret = H5Rget_obj_type3(&ref_wbuf[3], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_NAMED_DATATYPE, "H5Rget_obj_type3"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Create file */ - fid2 = H5Fcreate(FILE_REF_EXT2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid2, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid = H5Screate_simple(SPACE1_RANK, dims, NULL); - CHECK(sid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid2, "Dataset3", H5T_STD_REF, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, ref_wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid2 = H5Fopen(FILE_REF_EXT2, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid2, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid2, "/Dataset3", H5P_DEFAULT); - CHECK(ret, H5I_INVALID_HID, "H5Dopen2"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, ref_rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Open attribute on dataset object */ - attr = H5Ropen_attr(&ref_rbuf[0], H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Ropen_attr"); - - /* Check information in referenced dataset */ - sid = H5Aget_space(attr); - CHECK(sid, H5I_INVALID_HID, "H5Aget_space"); - - ret = (int)H5Sget_simple_extent_npoints(sid); - VERIFY(ret, SPACE1_DIM1, "H5Sget_simple_extent_npoints"); - - /* Read from disk */ - ret = H5Aread(attr, H5T_NATIVE_UINT, rbuf); - CHECK(ret, FAIL, "H5Aread"); - - for (i = 0; i < SPACE1_DIM1; i++) - VERIFY(rbuf[i], i * 3, "Data"); - - /* Close dereferenced Dataset */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open attribute on group object */ - attr = H5Ropen_attr(&ref_rbuf[2], H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Ropen_attr"); - - /* Read from disk */ - ret = H5Aread(attr, H5T_NATIVE_UINT, rbuf); - CHECK(ret, FAIL, "H5Aread"); - - for (i = 0; i < SPACE1_DIM1; i++) - VERIFY(rbuf[i], (i * 3) + 1, "Data"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Open attribute on named datatype object */ - attr = H5Ropen_attr(&ref_rbuf[3], H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr, H5I_INVALID_HID, "H5Ropen_attr"); - - /* Read from disk */ - ret = H5Aread(attr, H5T_NATIVE_UINT, rbuf); - CHECK(ret, FAIL, "H5Aread"); - - for (i = 0; i < SPACE1_DIM1; i++) - VERIFY(rbuf[i], (i * 3) + 2, "Data"); - - /* Close attribute */ - ret = H5Aclose(attr); - CHECK(ret, FAIL, "H5Aclose"); - - /* Close dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close dataset access property list */ - ret = H5Pclose(dapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid2); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - for (i = 0; i < SPACE1_DIM1; i++) { - ret = H5Rdestroy(&ref_wbuf[i]); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&ref_rbuf[i]); - CHECK(ret, FAIL, "H5Rdestroy"); - } -} /* test_reference_external() */ - -/**************************************************************** -** -** test_reference_compat_conv(): Test basic H5R (reference) object reference code. -** Tests deprecated API routines and type conversion. -** -****************************************************************/ -#if 0 -static void -test_reference_compat_conv(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset, dset2; /* Dataset ID */ - hid_t group, group2; /* Group ID */ - hid_t sid1, sid2, sid3; /* Dataspace IDs */ - hid_t tid1, tid2; /* Datatype ID */ - hsize_t dims1[] = {SPACE1_DIM1}, dims2[] = {SPACE2_DIM1, SPACE2_DIM2}, - dims3[] = {SPACE1_DIM1}; /* Purposely set dimension larger to test NULL references */ - hsize_t start[SPACE2_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE2_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE2_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE2_RANK]; /* Block size of hyperslab */ - hsize_t coord1[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */ - hobj_ref_t *wbuf_obj = NULL; /* Buffer to write to disk */ - H5R_ref_t *rbuf_obj = NULL; /* Buffer read from disk */ - hdset_reg_ref_t *wbuf_reg = NULL; /* Buffer to write to disk */ - H5R_ref_t *rbuf_reg = NULL; /* Buffer read from disk */ - H5O_type_t obj_type; /* Object type */ - herr_t ret; /* Generic return value */ - unsigned int i; /* Counter */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Deprecated Object Reference Functions\n")); - - /* Allocate write & read buffers */ - wbuf_obj = (hobj_ref_t *)calloc(sizeof(hobj_ref_t), SPACE1_DIM1); - rbuf_obj = calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - wbuf_reg = calloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1); - rbuf_reg = calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - - /* Create file */ - fid1 = H5Fcreate(FILE_REF_COMPAT, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create another dataspace for datasets */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create another dataspace for datasets */ - sid3 = H5Screate_simple(SPACE1_RANK, dims3, NULL); - CHECK(sid3, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create a group */ - group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Gcreate2"); - - /* Create a dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset1", H5T_NATIVE_UINT, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create another dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset2", H5T_NATIVE_UCHAR, sid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a datatype to refer to */ - tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid1, H5I_INVALID_HID, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "c", HOFFSET(s1_t, c), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Save datatype for later */ - ret = H5Tcommit2(group, "Datatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create a dataset with object reference datatype */ - dataset = H5Dcreate2(fid1, "Dataset3", H5T_STD_REF_OBJ, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Create reference to dataset */ - ret = H5Rcreate(&wbuf_obj[0], fid1, "/Group1/Dataset1", H5R_OBJECT, H5I_INVALID_HID); - CHECK(ret, FAIL, "H5Rcreate"); - - /* Create reference to dataset */ - ret = H5Rcreate(&wbuf_obj[1], fid1, "/Group1/Dataset2", H5R_OBJECT, H5I_INVALID_HID); - CHECK(ret, FAIL, "H5Rcreate"); - - /* Create reference to group */ - ret = H5Rcreate(&wbuf_obj[2], fid1, "/Group1", H5R_OBJECT, H5I_INVALID_HID); - CHECK(ret, FAIL, "H5Rcreate"); - - /* Create reference to named datatype */ - ret = H5Rcreate(&wbuf_obj[3], fid1, "/Group1/Datatype1", H5R_OBJECT, H5I_INVALID_HID); - CHECK(ret, FAIL, "H5Rcreate"); - - /* Write references to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf_obj); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a dataset with region reference datatype */ - dataset = H5Dcreate2(fid1, "Dataset4", H5T_STD_REF_DSETREG, sid3, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Select 6x6 hyperslab for first reference */ - start[0] = 2; - start[1] = 2; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 6; - block[1] = 6; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create first dataset region */ - ret = H5Rcreate(&wbuf_reg[0], fid1, "/Group1/Dataset1", H5R_DATASET_REGION, sid2); - CHECK(ret, FAIL, "H5Rcreate"); - - /* Select sequence of ten points for second reference */ - coord1[0][0] = 6; - coord1[0][1] = 9; - coord1[1][0] = 2; - coord1[1][1] = 2; - coord1[2][0] = 8; - coord1[2][1] = 4; - coord1[3][0] = 1; - coord1[3][1] = 6; - coord1[4][0] = 2; - coord1[4][1] = 8; - coord1[5][0] = 3; - coord1[5][1] = 2; - coord1[6][0] = 0; - coord1[6][1] = 4; - coord1[7][0] = 9; - coord1[7][1] = 0; - coord1[8][0] = 7; - coord1[8][1] = 1; - coord1[9][0] = 3; - coord1[9][1] = 3; - ret = H5Sselect_elements(sid2, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Create second dataset region */ - ret = H5Rcreate(&wbuf_reg[1], fid1, "/Group1/Dataset2", H5R_DATASET_REGION, sid2); - CHECK(ret, FAIL, "H5Rcreate"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf_reg); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close disk dataspaces */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid1 = H5Fopen(FILE_REF_COMPAT, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fopen"); - - /* Open the object reference dataset */ - dataset = H5Dopen2(fid1, "/Dataset3", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf_obj); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify type of objects pointed at */ - ret = H5Rget_obj_type3(&rbuf_obj[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - ret = H5Rget_obj_type3(&rbuf_obj[1], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - ret = H5Rget_obj_type3(&rbuf_obj[2], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_GROUP, "H5Rget_obj_type3"); - - ret = H5Rget_obj_type3(&rbuf_obj[3], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_NAMED_DATATYPE, "H5Rget_obj_type3"); - - /* Make sure the referenced objects can be opened */ - dset2 = H5Ropen_object(&rbuf_obj[0], H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - dset2 = H5Ropen_object(&rbuf_obj[1], H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - group2 = H5Ropen_object(&rbuf_obj[2], H5P_DEFAULT, H5P_DEFAULT); - CHECK(group2, H5I_INVALID_HID, "H5Ropen_object"); - - ret = H5Gclose(group2); - CHECK(ret, FAIL, "H5Gclose"); - - tid2 = H5Ropen_object(&rbuf_obj[3], H5P_DEFAULT, H5P_DEFAULT); - CHECK(tid2, H5I_INVALID_HID, "H5Ropen_object"); - - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open the dataset region reference dataset */ - dataset = H5Dopen2(fid1, "/Dataset4", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf_reg); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify type of objects pointed at */ - ret = H5Rget_obj_type3(&rbuf_reg[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - ret = H5Rget_obj_type3(&rbuf_reg[1], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - /* Make sure the referenced objects can be opened */ - dset2 = H5Ropen_object(&rbuf_reg[0], H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - dset2 = H5Ropen_object(&rbuf_reg[1], H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy references */ - for (i = 0; i < dims1[0]; i++) { - ret = H5Rdestroy(&rbuf_obj[i]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - for (i = 0; i < dims3[0]; i++) { - ret = H5Rdestroy(&rbuf_reg[i]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - - /* Free memory buffers */ - free(wbuf_obj); - free(rbuf_obj); - free(wbuf_reg); - free(rbuf_reg); -} /* test_reference_compat() */ -#endif - -/**************************************************************** -** -** test_reference_perf(): Test basic H5R (reference) object reference -** performance. -** -****************************************************************/ -static void -test_reference_perf(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset, /* Dataset ID */ - dset2; /* Dereferenced dataset ID */ - hid_t group; /* Group ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - hsize_t dims1[] = {1}; - hid_t dapl_id; /* Dataset access property list */ - H5R_ref_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf; /* temp. buffer read from disk */ - H5R_ref_t *wbuf_reg, /* buffer to write to disk */ - *rbuf_reg; /* buffer read from disk */ - hobj_ref_t *wbuf_deprec, /* deprecated references */ - *rbuf_deprec; /* deprecated references */ - hdset_reg_ref_t *wbuf_reg_deprec, /* deprecated references*/ - *rbuf_reg_deprec; /* deprecated references*/ - unsigned *ibuf, *obuf; - unsigned i, j; /* Counters */ - H5O_type_t obj_type; /* Object type */ - herr_t ret; /* Generic return value */ - double t1, t2, t; /* Timers */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Object Reference Performance\n")); - - /* Allocate write & read buffers */ - wbuf = calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - obuf = calloc(sizeof(unsigned), SPACE1_DIM1); - ibuf = calloc(sizeof(unsigned), SPACE1_DIM1); - wbuf_deprec = (hobj_ref_t *)calloc(sizeof(hobj_ref_t), SPACE1_DIM1); - rbuf = (H5R_ref_t *)calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - rbuf_deprec = (hobj_ref_t *)calloc(sizeof(hobj_ref_t), SPACE1_DIM1); - tbuf = (H5R_ref_t *)calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - wbuf_reg = (H5R_ref_t *)calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - rbuf_reg = (H5R_ref_t *)calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - wbuf_reg_deprec = (hdset_reg_ref_t *)calloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1); - rbuf_reg_deprec = (hdset_reg_ref_t *)calloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1); - - for (i = 0; i < SPACE1_DIM1; i++) - obuf[i] = i * 3; - - /* Create file */ - fid1 = H5Fcreate(FILE_REF_OBJ, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); - - /* Create dataset access property list */ - dapl_id = H5Pcreate(H5P_DATASET_ACCESS); - CHECK(dapl_id, H5I_INVALID_HID, "H5Pcreate"); - - /* Create a group */ - group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group, H5I_INVALID_HID, "H5Gcreate2"); - - /* Create a dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset1", H5T_NATIVE_UINT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, obuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create another dataset (inside Group1) */ - dataset = H5Dcreate2(group, "Dataset2", H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a datatype to refer to */ - tid1 = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(tid1, H5I_INVALID_HID, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid1, "a", HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "b", HOFFSET(s1_t, b), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(tid1, "c", HOFFSET(s1_t, c), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Save datatype for later */ - ret = H5Tcommit2(group, "Datatype1", tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close group */ - ret = H5Gclose(group); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset3", H5T_STD_REF, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - t = 0; - for (i = 0; i < MAX_ITER_CREATE; i++) { - t1 = H5_get_time(); - ret = H5Rcreate_object(fid1, "/Group1/Dataset1", H5P_DEFAULT, &wbuf[0]); - CHECK(ret, FAIL, "H5Rcreate_object"); - t2 = H5_get_time(); - t += t2 - t1; - ret = H5Rdestroy(&wbuf[0]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - if (VERBOSE_MED) - printf("--- Object reference create time: %lfs\n", t / MAX_ITER_CREATE); - - /* Create reference to dataset */ - ret = H5Rcreate_object(fid1, "/Group1/Dataset1", H5P_DEFAULT, &wbuf[0]); - CHECK(ret, FAIL, "H5Rcreate_object"); - ret = H5Rget_obj_type3(&wbuf[0], H5P_DEFAULT, &obj_type); - CHECK(ret, FAIL, "H5Rget_obj_type3"); - VERIFY(obj_type, H5O_TYPE_DATASET, "H5Rget_obj_type3"); - - t = 0; - for (i = 0; i < MAX_ITER_WRITE; i++) { - t1 = H5_get_time(); - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - t2 = H5_get_time(); - t += t2 - t1; - } - if (VERBOSE_MED) - printf("--- Object reference write time: %lfs\n", t / MAX_ITER_WRITE); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); -#if 0 - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset4", H5T_STD_REF_OBJ, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - t = 0; - for (i = 0; i < MAX_ITER_CREATE; i++) { - t1 = H5_get_time(); - ret = H5Rcreate(&wbuf_deprec[0], fid1, "/Group1/Dataset1", H5R_OBJECT1, H5I_INVALID_HID); - CHECK(ret, FAIL, "H5Rcreate"); - t2 = H5_get_time(); - t += t2 - t1; - } - if (VERBOSE_MED) - printf("--- Deprecated object reference create time: %lfs\n", t / MAX_ITER_CREATE); - - /* Create reference to dataset */ - ret = H5Rcreate(&wbuf_deprec[0], fid1, "/Group1/Dataset1", H5R_OBJECT1, H5I_INVALID_HID); - CHECK(ret, FAIL, "H5Rcreate"); - - t = 0; - for (i = 0; i < MAX_ITER_WRITE; i++) { - t1 = H5_get_time(); - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf_deprec); - CHECK(ret, FAIL, "H5Dwrite"); - t2 = H5_get_time(); - t += t2 - t1; - } - if (VERBOSE_MED) - printf("--- Deprecated object reference write time: %lfs\n", t / MAX_ITER_WRITE); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); -#endif - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset5", H5T_STD_REF, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - t = 0; - for (i = 0; i < MAX_ITER_CREATE; i++) { - t1 = H5_get_time(); - /* Store first dataset region */ - ret = H5Rcreate_region(fid1, "/Group1/Dataset1", sid1, H5P_DEFAULT, &wbuf_reg[0]); - CHECK(ret, FAIL, "H5Rcreate_region"); - t2 = H5_get_time(); - t += t2 - t1; - ret = H5Rdestroy(&wbuf_reg[0]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - if (VERBOSE_MED) - printf("--- Region reference create time: %lfs\n", t / MAX_ITER_CREATE); - - /* Store first dataset region */ - ret = H5Rcreate_region(fid1, "/Group1/Dataset1", sid1, H5P_DEFAULT, &wbuf_reg[0]); - CHECK(ret, FAIL, "H5Rcreate_region"); - - t = 0; - for (i = 0; i < MAX_ITER_WRITE; i++) { - t1 = H5_get_time(); - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf_reg); - CHECK(ret, FAIL, "H5Dwrite"); - t2 = H5_get_time(); - t += t2 - t1; - } - if (VERBOSE_MED) - printf("--- Region reference write time: %lfs\n", t / MAX_ITER_WRITE); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); -#if 0 - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset6", H5T_STD_REF_DSETREG, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - t = 0; - for (i = 0; i < MAX_ITER_CREATE; i++) { - t1 = H5_get_time(); - /* Store first dataset region */ - ret = H5Rcreate(&wbuf_reg_deprec[0], fid1, "/Group1/Dataset1", H5R_DATASET_REGION1, sid1); - CHECK(ret, FAIL, "H5Rcreate"); - t2 = H5_get_time(); - t += t2 - t1; - } - if (VERBOSE_MED) - printf("--- Deprecated region reference create time: %lfs\n", t / MAX_ITER_CREATE); - - t = 0; - for (i = 0; i < MAX_ITER_WRITE; i++) { - t1 = H5_get_time(); - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf_reg_deprec); - CHECK(ret, FAIL, "H5Dwrite"); - t2 = H5_get_time(); - t += t2 - t1; - } - if (VERBOSE_MED) - printf("--- Deprecated region reference write time: %lfs\n", t / MAX_ITER_WRITE); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); -#endif - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open the file */ - fid1 = H5Fopen(FILE_REF_OBJ, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "/Dataset3", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - t = 0; - for (i = 0; i < MAX_ITER_READ; i++) { - t1 = H5_get_time(); - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - t2 = H5_get_time(); - t += t2 - t1; - ret = H5Rdestroy(&rbuf[0]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - if (VERBOSE_MED) - printf("--- Object reference read time: %lfs\n", t / MAX_ITER_READ); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Open dataset object */ - dset2 = H5Ropen_object(&rbuf[0], H5P_DEFAULT, dapl_id); - CHECK(dset2, H5I_INVALID_HID, "H5Ropen_object"); - - /* Check information in referenced dataset */ - sid1 = H5Dget_space(dset2); - CHECK(sid1, H5I_INVALID_HID, "H5Dget_space"); - - ret = (int)H5Sget_simple_extent_npoints(sid1); - VERIFY(ret, dims1[0], "H5Sget_simple_extent_npoints"); - - /* Read from disk */ - ret = H5Dread(dset2, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, ibuf); - CHECK(ret, FAIL, "H5Dread"); - - for (i = 0; i < dims1[0]; i++) - VERIFY(ibuf[i], i * 3, "Data"); - - /* Close dereferenced Dataset */ - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); -#if 0 - /* Open the dataset */ - dataset = H5Dopen2(fid1, "/Dataset4", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - t = 0; - for (i = 0; i < MAX_ITER_READ; i++) { - t1 = H5_get_time(); - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf_deprec); - CHECK(ret, FAIL, "H5Dread"); - t2 = H5_get_time(); - t += t2 - t1; - } - if (VERBOSE_MED) - printf("--- Deprecated object reference read time: %lfs\n", t / MAX_ITER_READ); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); -#endif - /* Open the dataset */ - dataset = H5Dopen2(fid1, "/Dataset5", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - t = 0; - for (i = 0; i < MAX_ITER_READ; i++) { - t1 = H5_get_time(); - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf_reg); - CHECK(ret, FAIL, "H5Dread"); - t2 = H5_get_time(); - t += t2 - t1; - ret = H5Rdestroy(&rbuf_reg[0]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - if (VERBOSE_MED) - printf("--- Region reference read time: %lfs\n", t / MAX_ITER_READ); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf_reg); - CHECK(ret, FAIL, "H5Dread"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); -#if 0 - /* Open the dataset */ - dataset = H5Dopen2(fid1, "/Dataset6", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); - - t = 0; - for (i = 0; i < MAX_ITER_READ; i++) { - t1 = H5_get_time(); - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf_reg_deprec); - CHECK(ret, FAIL, "H5Dread"); - t2 = H5_get_time(); - t += t2 - t1; - } - if (VERBOSE_MED) - printf("--- Deprecated region reference read time: %lfs\n", t / MAX_ITER_READ); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); -#endif - /* Close dataset access property list */ - ret = H5Pclose(dapl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Destroy references */ - for (j = 0; j < dims1[0]; j++) { - ret = H5Rdestroy(&wbuf[j]); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&wbuf_reg[j]); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&rbuf[j]); - CHECK(ret, FAIL, "H5Rdestroy"); - ret = H5Rdestroy(&rbuf_reg[j]); - CHECK(ret, FAIL, "H5Rdestroy"); - } - - /* Free memory buffers */ - free(wbuf); - free(rbuf); - free(wbuf_reg); - free(rbuf_reg); - free(wbuf_deprec); - free(rbuf_deprec); - free(wbuf_reg_deprec); - free(rbuf_reg_deprec); - free(tbuf); - free(ibuf); - free(obuf); -} /* test_reference_perf() */ - -/**************************************************************** -** -** test_reference(): Main H5R reference testing routine. -** -****************************************************************/ -void -test_reference(void) -{ - H5F_libver_t low, high; /* Low and high bounds */ - const char *env_h5_drvr; /* File Driver value from environment */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing References\n")); - - /* Get the VFD to use */ - env_h5_drvr = getenv(HDF5_DRIVER); - if (env_h5_drvr == NULL) - env_h5_drvr = "nomatch"; - - test_reference_params(); /* Test for correct parameter checking */ - test_reference_obj(); /* Test basic H5R object reference code */ - test_reference_vlen_obj(); /* Test reference within vlen */ - test_reference_cmpnd_obj(); /* Test reference within compound type */ - - /* Loop through all the combinations of low/high version bounds */ - for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) { - for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) { - - /* Invalid combinations, just continue */ - if (high == H5F_LIBVER_EARLIEST || high < low) - continue; - - test_reference_region(low, high); /* Test basic H5R dataset region reference code */ - test_reference_region_1D(low, high); /* Test H5R dataset region reference code for 1-D datasets */ - - } /* end high bound */ - } /* end low bound */ - - /* The following test is currently broken with the Direct VFD */ - if (strcmp(env_h5_drvr, "direct") != 0) { - test_reference_obj_deleted(); /* Test H5R object reference code for deleted objects */ - } - - test_reference_group(); /* Test operations on dereferenced groups */ - test_reference_attr(); /* Test attribute references */ - test_reference_external(); /* Test external references */ -#if 0 - test_reference_compat_conv(); /* Test operations with old types */ -#endif - - test_reference_perf(); - -} /* test_reference() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_reference - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_reference(void) -{ - H5Fdelete(FILE_REF_PARAM, H5P_DEFAULT); - H5Fdelete(FILE_REF_OBJ, H5P_DEFAULT); - H5Fdelete(FILE_REF_VL_OBJ, H5P_DEFAULT); - H5Fdelete(FILE_REF_CMPND_OBJ, H5P_DEFAULT); - H5Fdelete(FILE_REF_REG, H5P_DEFAULT); - H5Fdelete(FILE_REF_REG_1D, H5P_DEFAULT); - H5Fdelete(FILE_REF_OBJ_DEL, H5P_DEFAULT); - H5Fdelete(FILE_REF_GRP, H5P_DEFAULT); - H5Fdelete(FILE_REF_ATTR, H5P_DEFAULT); - H5Fdelete(FILE_REF_EXT1, H5P_DEFAULT); - H5Fdelete(FILE_REF_EXT2, H5P_DEFAULT); - H5Fdelete(FILE_REF_COMPAT, H5P_DEFAULT); -} diff --git a/test/API/tselect.c b/test/API/tselect.c deleted file mode 100644 index 9d398be..0000000 --- a/test/API/tselect.c +++ /dev/null @@ -1,16308 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tselect - * - * Test the Dataspace selection functionality - * - *************************************************************/ - -#define H5S_FRIEND /*suppress error about including H5Spkg */ - -/* Define this macro to indicate that the testing APIs should be available */ -#define H5S_TESTING - -#include "testhdf5.h" -#include "hdf5.h" -/* #include "H5Spkg.h" */ /* Dataspaces */ - -#define FILENAME "tselect.h5" - -/* 3-D dataset with fixed dimensions */ -#define SPACE1_NAME "Space1" -#define SPACE1_RANK 3 -#define SPACE1_DIM1 3 -#define SPACE1_DIM2 15 -#define SPACE1_DIM3 13 - -/* 2-D dataset with fixed dimensions */ -#define SPACE2_NAME "Space2" -#define SPACE2_RANK 2 -#define SPACE2_DIM1 30 -#define SPACE2_DIM2 26 -#define SPACE2A_RANK 1 -#define SPACE2A_DIM1 (SPACE2_DIM1 * SPACE2_DIM2) - -/* 2-D dataset with fixed dimensions */ -#define SPACE3_NAME "Space3" -#define SPACE3_RANK 2 -#define SPACE3_DIM1 15 -#define SPACE3_DIM2 26 - -/* 3-D dataset with fixed dimensions */ -#define SPACE4_NAME "Space4" -#define SPACE4_RANK 3 -#define SPACE4_DIM1 11 -#define SPACE4_DIM2 13 -#define SPACE4_DIM3 17 - -/* Number of random hyperslabs to test */ -#define NHYPERSLABS 10 - -/* Number of random hyperslab tests performed */ -#define NRAND_HYPER 100 - -/* 5-D dataset with fixed dimensions */ -#define SPACE5_NAME "Space5" -#define SPACE5_RANK 5 -#define SPACE5_DIM1 10 -#define SPACE5_DIM2 10 -#define SPACE5_DIM3 10 -#define SPACE5_DIM4 10 -#define SPACE5_DIM5 10 - -/* 1-D dataset with same size as 5-D dataset */ -#define SPACE6_RANK 1 -#define SPACE6_DIM1 (SPACE5_DIM1 * SPACE5_DIM2 * SPACE5_DIM3 * SPACE5_DIM4 * SPACE5_DIM5) - -/* 2-D dataset with easy dimension sizes */ -#define SPACE7_NAME "Space7" -#define SPACE7_RANK 2 -#define SPACE7_DIM1 10 -#define SPACE7_DIM2 10 -#define SPACE7_FILL 254 -#define SPACE7_CHUNK_DIM1 5 -#define SPACE7_CHUNK_DIM2 5 -#define SPACE7_NPOINTS 8 - -/* 4-D dataset with fixed dimensions */ -#define SPACE8_NAME "Space8" -#define SPACE8_RANK 4 -#define SPACE8_DIM1 11 -#define SPACE8_DIM2 13 -#define SPACE8_DIM3 17 -#define SPACE8_DIM4 19 - -/* Another 2-D dataset with easy dimension sizes */ -#define SPACE9_RANK 2 -#define SPACE9_DIM1 12 -#define SPACE9_DIM2 12 - -/* Element selection information */ -#define POINT1_NPOINTS 10 - -/* Chunked dataset information */ -#define DATASETNAME "ChunkArray" -#define NX_SUB 87 /* hyperslab dimensions */ -#define NY_SUB 61 -#define NZ_SUB 181 -#define NX 87 /* output buffer dimensions */ -#define NY 61 -#define NZ 181 -#define RANK_F 3 /* File dataspace rank */ -#define RANK_M 3 /* Memory dataspace rank */ -#define X 87 /* dataset dimensions */ -#define Y 61 -#define Z 181 -#define CHUNK_X 87 /* chunk dimensions */ -#define CHUNK_Y 61 -#define CHUNK_Z 181 - -/* Basic chunk size */ -#define SPACE10_DIM1 180 -#define SPACE10_CHUNK_SIZE 12 - -/* Information for bounds checking test */ -#define SPACE11_RANK 2 -#define SPACE11_DIM1 100 -#define SPACE11_DIM2 100 -#define SPACE11_NPOINTS 4 - -/* Information for offsets w/chunks test #2 */ -#define SPACE12_RANK 1 -#define SPACE12_DIM0 25 -#define SPACE12_CHUNK_DIM0 5 - -/* Information for Space rebuild test */ -#define SPACERE1_RANK 1 -#define SPACERE1_DIM0 20 -#define SPACERE2_RANK 2 -#define SPACERE2_DIM0 8 -#define SPACERE2_DIM1 12 -#define SPACERE3_RANK 3 -#define SPACERE3_DIM0 8 -#define SPACERE3_DIM1 12 -#define SPACERE3_DIM2 8 -#define SPACERE4_RANK 4 -#define SPACERE4_DIM0 8 -#define SPACERE4_DIM1 12 -#define SPACERE4_DIM2 8 -#define SPACERE4_DIM3 12 -#define SPACERE5_RANK 5 -#define SPACERE5_DIM0 8 -#define SPACERE5_DIM1 12 -#define SPACERE5_DIM2 8 -#define SPACERE5_DIM3 12 -#define SPACERE5_DIM4 8 - -/* Information for Space update diminfo test */ -#define SPACEUD1_DIM0 20 -#define SPACEUD3_DIM0 9 -#define SPACEUD3_DIM1 12 -#define SPACEUD3_DIM2 13 - -/* #defines for shape same / different rank tests */ -#define SS_DR_MAX_RANK 5 - -/* Information for regular hyperslab query test */ -#define SPACE13_RANK 3 -#define SPACE13_DIM1 50 -#define SPACE13_DIM2 50 -#define SPACE13_DIM3 50 -#define SPACE13_NPOINTS 4 - -/* Information for testing selection iterators */ -#define SEL_ITER_MAX_SEQ 256 - -/* Defines for test_hyper_io_1d() */ -#define DNAME "DSET_1D" -#define RANK 1 -#define NUMCHUNKS 3 -#define CHUNKSZ 20 -#define NUM_ELEMENTS NUMCHUNKS *CHUNKSZ - -/* Location comparison function */ -static int compare_size_t(const void *s1, const void *s2); - -static herr_t test_select_hyper_iter1(void *elem, hid_t type_id, unsigned ndim, const hsize_t *point, - void *operator_data); -static herr_t test_select_point_iter1(void *elem, hid_t type_id, unsigned ndim, const hsize_t *point, - void *operator_data); -static herr_t test_select_all_iter1(void *elem, hid_t type_id, unsigned ndim, const hsize_t *point, - void *operator_data); -static herr_t test_select_none_iter1(void *elem, hid_t type_id, unsigned ndim, const hsize_t *point, - void *operator_data); -static herr_t test_select_hyper_iter2(void *_elem, hid_t type_id, unsigned ndim, const hsize_t *point, - void *_operator_data); -static herr_t test_select_hyper_iter3(void *elem, hid_t type_id, unsigned ndim, const hsize_t *point, - void *operator_data); - -/**************************************************************** -** -** test_select_hyper_iter1(): Iterator for checking hyperslab iteration -** -****************************************************************/ -static herr_t -test_select_hyper_iter1(void *_elem, hid_t H5_ATTR_UNUSED type_id, unsigned H5_ATTR_UNUSED ndim, - const hsize_t H5_ATTR_UNUSED *point, void *_operator_data) -{ - uint8_t *tbuf = (uint8_t *)_elem, /* temporary buffer pointer */ - **tbuf2 = (uint8_t **)_operator_data; /* temporary buffer handle */ - - if (*tbuf != **tbuf2) - return (-1); - else { - (*tbuf2)++; - return (0); - } -} /* end test_select_hyper_iter1() */ - -/**************************************************************** -** -** test_select_hyper(): Test basic H5S (dataspace) selection code. -** Tests hyperslabs of various sizes and dimensionalities. -** -****************************************************************/ -static void -test_select_hyper(hid_t xfer_plist) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t start[SPACE1_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE1_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE1_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE1_RANK]; /* Block size of hyperslab */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - H5S_class_t ext_type; /* Extent type */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslab Selection Functions\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Verify extent type */ - ext_type = H5Sget_simple_extent_type(sid1); - VERIFY(ext_type, H5S_SIMPLE, "H5Sget_simple_extent_type"); - - /* Test selecting stride==0 to verify failure */ - start[0] = 1; - start[1] = 0; - start[2] = 0; - stride[0] = 0; - stride[1] = 0; - stride[2] = 0; - count[0] = 2; - count[1] = 15; - count[2] = 13; - block[0] = 1; - block[1] = 1; - block[2] = 1; - H5E_BEGIN_TRY - { - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - - /* Test selecting stride<block to verify failure */ - start[0] = 1; - start[1] = 0; - start[2] = 0; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 2; - count[1] = 15; - count[2] = 13; - block[0] = 2; - block[1] = 2; - block[2] = 2; - H5E_BEGIN_TRY - { - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 2x15x13 hyperslab for disk dataset */ - start[0] = 1; - start[1] = 0; - start[2] = 0; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 2; - count[1] = 15; - count[2] = 13; - block[0] = 1; - block[1] = 1; - block[2] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 15x26 hyperslab for memory dataset */ - start[0] = 15; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE2_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer_plist, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Exercise checks for NULL buffer and valid selection */ - H5E_BEGIN_TRY - { - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer_plist, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dwrite"); - H5E_BEGIN_TRY - { - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, xfer_plist, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 15x26 hyperslab for reading memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 0x26 hyperslab to OR into current selection (should be a NOOP) */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 0; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer_plist, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Exercise checks for NULL buffer and valid selection */ - H5E_BEGIN_TRY - { - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer_plist, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dread"); - H5E_BEGIN_TRY - { - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, xfer_plist, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dread"); - - /* Check that the values match with a dataset iterator */ - tbuf = wbuf + (15 * SPACE2_DIM2); - ret = H5Diterate(rbuf, H5T_NATIVE_UCHAR, sid2, test_select_hyper_iter1, &tbuf); - CHECK(ret, FAIL, "H5Diterate"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper() */ - -struct pnt_iter { - hsize_t coord[POINT1_NPOINTS * 2][SPACE2_RANK]; /* Coordinates for point selection */ - uint8_t *buf; /* Buffer the points are in */ - int offset; /* Which point we are looking at */ -}; - -/**************************************************************** -** -** test_select_point_iter1(): Iterator for checking point iteration -** (This is really ugly code, not a very good example of correct usage - QAK) -** -****************************************************************/ -static herr_t -test_select_point_iter1(void *_elem, hid_t H5_ATTR_UNUSED type_id, unsigned H5_ATTR_UNUSED ndim, - const hsize_t H5_ATTR_UNUSED *point, void *_operator_data) -{ - uint8_t *elem = (uint8_t *)_elem; /* Pointer to the element to examine */ - uint8_t *tmp; /* temporary ptr to element in operator data */ - struct pnt_iter *pnt_info = (struct pnt_iter *)_operator_data; - - tmp = pnt_info->buf + (pnt_info->coord[pnt_info->offset][0] * SPACE2_DIM2) + - pnt_info->coord[pnt_info->offset][1]; - if (*elem != *tmp) - return (-1); - else { - pnt_info->offset++; - return (0); - } -} /* end test_select_point_iter1() */ - -/**************************************************************** -** -** test_select_point(): Test basic H5S (dataspace) selection code. -** Tests element selections between dataspaces of various sizes -** and dimensionalities. -** -****************************************************************/ -static void -test_select_point(hid_t xfer_plist) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t coord1[POINT1_NPOINTS][SPACE1_RANK]; /* Coordinates for point selection */ - hsize_t temp_coord1[POINT1_NPOINTS][SPACE1_RANK]; /* Coordinates for point selection */ - hsize_t coord2[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */ - hsize_t temp_coord2[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */ - hsize_t coord3[POINT1_NPOINTS][SPACE3_RANK]; /* Coordinates for point selection */ - hsize_t temp_coord3[POINT1_NPOINTS][SPACE3_RANK]; /* Coordinates for point selection */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf; /* temporary buffer pointer */ - int i, j; /* Counters */ - struct pnt_iter pi; /* Custom Pointer iterator struct */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Element Selection Functions\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for write buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select sequence of ten points for disk dataset */ - coord1[0][0] = 0; - coord1[0][1] = 10; - coord1[0][2] = 5; - coord1[1][0] = 1; - coord1[1][1] = 2; - coord1[1][2] = 7; - coord1[2][0] = 2; - coord1[2][1] = 4; - coord1[2][2] = 9; - coord1[3][0] = 0; - coord1[3][1] = 6; - coord1[3][2] = 11; - coord1[4][0] = 1; - coord1[4][1] = 8; - coord1[4][2] = 13; - coord1[5][0] = 2; - coord1[5][1] = 12; - coord1[5][2] = 0; - coord1[6][0] = 0; - coord1[6][1] = 14; - coord1[6][2] = 2; - coord1[7][0] = 1; - coord1[7][1] = 0; - coord1[7][2] = 4; - coord1[8][0] = 2; - coord1[8][1] = 1; - coord1[8][2] = 6; - coord1[9][0] = 0; - coord1[9][1] = 3; - coord1[9][2] = 8; - ret = H5Sselect_elements(sid1, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Verify correct elements selected */ - H5Sget_select_elem_pointlist(sid1, (hsize_t)0, (hsize_t)POINT1_NPOINTS, (hsize_t *)temp_coord1); - for (i = 0; i < POINT1_NPOINTS; i++) { - VERIFY(temp_coord1[i][0], coord1[i][0], "H5Sget_select_elem_pointlist"); - VERIFY(temp_coord1[i][1], coord1[i][1], "H5Sget_select_elem_pointlist"); - VERIFY(temp_coord1[i][2], coord1[i][2], "H5Sget_select_elem_pointlist"); - } /* end for */ - - ret = (int)H5Sget_select_npoints(sid1); - VERIFY(ret, 10, "H5Sget_select_npoints"); - - /* Append another sequence of ten points to disk dataset */ - coord1[0][0] = 0; - coord1[0][1] = 2; - coord1[0][2] = 0; - coord1[1][0] = 1; - coord1[1][1] = 10; - coord1[1][2] = 8; - coord1[2][0] = 2; - coord1[2][1] = 8; - coord1[2][2] = 10; - coord1[3][0] = 0; - coord1[3][1] = 7; - coord1[3][2] = 12; - coord1[4][0] = 1; - coord1[4][1] = 3; - coord1[4][2] = 11; - coord1[5][0] = 2; - coord1[5][1] = 1; - coord1[5][2] = 1; - coord1[6][0] = 0; - coord1[6][1] = 13; - coord1[6][2] = 7; - coord1[7][0] = 1; - coord1[7][1] = 14; - coord1[7][2] = 6; - coord1[8][0] = 2; - coord1[8][1] = 2; - coord1[8][2] = 5; - coord1[9][0] = 0; - coord1[9][1] = 6; - coord1[9][2] = 13; - ret = H5Sselect_elements(sid1, H5S_SELECT_APPEND, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Verify correct elements selected */ - H5Sget_select_elem_pointlist(sid1, (hsize_t)POINT1_NPOINTS, (hsize_t)POINT1_NPOINTS, - (hsize_t *)temp_coord1); - for (i = 0; i < POINT1_NPOINTS; i++) { - VERIFY(temp_coord1[i][0], coord1[i][0], "H5Sget_select_elem_pointlist"); - VERIFY(temp_coord1[i][1], coord1[i][1], "H5Sget_select_elem_pointlist"); - VERIFY(temp_coord1[i][2], coord1[i][2], "H5Sget_select_elem_pointlist"); - } /* end for */ - - ret = (int)H5Sget_select_npoints(sid1); - VERIFY(ret, 20, "H5Sget_select_npoints"); - - /* Select sequence of ten points for memory dataset */ - coord2[0][0] = 12; - coord2[0][1] = 3; - coord2[1][0] = 15; - coord2[1][1] = 13; - coord2[2][0] = 7; - coord2[2][1] = 25; - coord2[3][0] = 0; - coord2[3][1] = 6; - coord2[4][0] = 13; - coord2[4][1] = 0; - coord2[5][0] = 24; - coord2[5][1] = 11; - coord2[6][0] = 12; - coord2[6][1] = 21; - coord2[7][0] = 29; - coord2[7][1] = 4; - coord2[8][0] = 8; - coord2[8][1] = 8; - coord2[9][0] = 19; - coord2[9][1] = 17; - ret = H5Sselect_elements(sid2, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord2); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Verify correct elements selected */ - H5Sget_select_elem_pointlist(sid2, (hsize_t)0, (hsize_t)POINT1_NPOINTS, (hsize_t *)temp_coord2); - for (i = 0; i < POINT1_NPOINTS; i++) { - VERIFY(temp_coord2[i][0], coord2[i][0], "H5Sget_select_elem_pointlist"); - VERIFY(temp_coord2[i][1], coord2[i][1], "H5Sget_select_elem_pointlist"); - } /* end for */ - - /* Save points for later iteration */ - /* (these are in the second half of the buffer, because we are prepending */ - /* the next list of points to the beginning of the point selection list) */ - memcpy(((char *)pi.coord) + sizeof(coord2), coord2, sizeof(coord2)); - - ret = (int)H5Sget_select_npoints(sid2); - VERIFY(ret, 10, "H5Sget_select_npoints"); - - /* Append another sequence of ten points to memory dataset */ - coord2[0][0] = 24; - coord2[0][1] = 0; - coord2[1][0] = 2; - coord2[1][1] = 25; - coord2[2][0] = 13; - coord2[2][1] = 17; - coord2[3][0] = 8; - coord2[3][1] = 3; - coord2[4][0] = 29; - coord2[4][1] = 4; - coord2[5][0] = 11; - coord2[5][1] = 14; - coord2[6][0] = 5; - coord2[6][1] = 22; - coord2[7][0] = 12; - coord2[7][1] = 2; - coord2[8][0] = 21; - coord2[8][1] = 12; - coord2[9][0] = 9; - coord2[9][1] = 18; - ret = H5Sselect_elements(sid2, H5S_SELECT_PREPEND, (size_t)POINT1_NPOINTS, (const hsize_t *)coord2); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Verify correct elements selected */ - H5Sget_select_elem_pointlist(sid2, (hsize_t)0, (hsize_t)POINT1_NPOINTS, (hsize_t *)temp_coord2); - for (i = 0; i < POINT1_NPOINTS; i++) { - VERIFY(temp_coord2[i][0], coord2[i][0], "H5Sget_select_elem_pointlist"); - VERIFY(temp_coord2[i][1], coord2[i][1], "H5Sget_select_elem_pointlist"); - } /* end for */ - - ret = (int)H5Sget_select_npoints(sid2); - VERIFY(ret, 20, "H5Sget_select_npoints"); - - /* Save points for later iteration */ - memcpy(pi.coord, coord2, sizeof(coord2)); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer_plist, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select sequence of points for read dataset */ - coord3[0][0] = 0; - coord3[0][1] = 2; - coord3[1][0] = 4; - coord3[1][1] = 8; - coord3[2][0] = 13; - coord3[2][1] = 13; - coord3[3][0] = 14; - coord3[3][1] = 20; - coord3[4][0] = 7; - coord3[4][1] = 9; - coord3[5][0] = 2; - coord3[5][1] = 0; - coord3[6][0] = 9; - coord3[6][1] = 19; - coord3[7][0] = 1; - coord3[7][1] = 22; - coord3[8][0] = 12; - coord3[8][1] = 21; - coord3[9][0] = 11; - coord3[9][1] = 6; - ret = H5Sselect_elements(sid2, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord3); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Verify correct elements selected */ - H5Sget_select_elem_pointlist(sid2, (hsize_t)0, (hsize_t)POINT1_NPOINTS, (hsize_t *)temp_coord3); - for (i = 0; i < POINT1_NPOINTS; i++) { - VERIFY(temp_coord3[i][0], coord3[i][0], "H5Sget_select_elem_pointlist"); - VERIFY(temp_coord3[i][1], coord3[i][1], "H5Sget_select_elem_pointlist"); - } /* end for */ - - ret = (int)H5Sget_select_npoints(sid2); - VERIFY(ret, 10, "H5Sget_select_npoints"); - - /* Append another sequence of ten points to disk dataset */ - coord3[0][0] = 14; - coord3[0][1] = 25; - coord3[1][0] = 0; - coord3[1][1] = 0; - coord3[2][0] = 11; - coord3[2][1] = 11; - coord3[3][0] = 5; - coord3[3][1] = 14; - coord3[4][0] = 3; - coord3[4][1] = 5; - coord3[5][0] = 2; - coord3[5][1] = 2; - coord3[6][0] = 7; - coord3[6][1] = 13; - coord3[7][0] = 9; - coord3[7][1] = 16; - coord3[8][0] = 12; - coord3[8][1] = 22; - coord3[9][0] = 13; - coord3[9][1] = 9; - ret = H5Sselect_elements(sid2, H5S_SELECT_APPEND, (size_t)POINT1_NPOINTS, (const hsize_t *)coord3); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Verify correct elements selected */ - H5Sget_select_elem_pointlist(sid2, (hsize_t)POINT1_NPOINTS, (hsize_t)POINT1_NPOINTS, - (hsize_t *)temp_coord3); - for (i = 0; i < POINT1_NPOINTS; i++) { - VERIFY(temp_coord3[i][0], coord3[i][0], "H5Sget_select_elem_pointlist"); - VERIFY(temp_coord3[i][1], coord3[i][1], "H5Sget_select_elem_pointlist"); - } /* end for */ - ret = (int)H5Sget_select_npoints(sid2); - VERIFY(ret, 20, "H5Sget_select_npoints"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer_plist, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Check that the values match with a dataset iterator */ - pi.buf = wbuf; - pi.offset = 0; - ret = H5Diterate(rbuf, H5T_NATIVE_UCHAR, sid2, test_select_point_iter1, &pi); - CHECK(ret, FAIL, "H5Diterate"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_point() */ - -/**************************************************************** -** -** test_select_all_iter1(): Iterator for checking all iteration -** -** -****************************************************************/ -static herr_t -test_select_all_iter1(void *_elem, hid_t H5_ATTR_UNUSED type_id, unsigned H5_ATTR_UNUSED ndim, - const hsize_t H5_ATTR_UNUSED *point, void *_operator_data) -{ - uint8_t *tbuf = (uint8_t *)_elem, /* temporary buffer pointer */ - **tbuf2 = (uint8_t **)_operator_data; /* temporary buffer handle */ - - if (*tbuf != **tbuf2) - return (-1); - else { - (*tbuf2)++; - return (0); - } -} /* end test_select_all_iter1() */ - -/**************************************************************** -** -** test_select_none_iter1(): Iterator for checking none iteration -** (This is never supposed to be called, so it always returns -1) -** -****************************************************************/ -static herr_t -test_select_none_iter1(void H5_ATTR_UNUSED *_elem, hid_t H5_ATTR_UNUSED type_id, unsigned H5_ATTR_UNUSED ndim, - const hsize_t H5_ATTR_UNUSED *point, void H5_ATTR_UNUSED *_operator_data) -{ - return (-1); -} /* end test_select_none_iter1() */ - -/**************************************************************** -** -** test_select_all(): Test basic H5S (dataspace) selection code. -** Tests "all" selections. -** -****************************************************************/ -static void -test_select_all(hid_t xfer_plist) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hsize_t dims1[] = {SPACE4_DIM1, SPACE4_DIM2, SPACE4_DIM3}; - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf; /* temporary buffer pointer */ - int i, j, k; /* Counters */ - herr_t ret; /* Generic return value */ - H5S_class_t ext_type; /* Extent type */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 'All' Selection Functions\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE4_DIM1 * SPACE4_DIM2 * SPACE4_DIM3); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE4_DIM1 * SPACE4_DIM2 * SPACE4_DIM3)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE4_DIM1; i++) - for (j = 0; j < SPACE4_DIM2; j++) - for (k = 0; k < SPACE4_DIM3; k++) - *tbuf++ = (uint8_t)((((i * SPACE4_DIM2) + j) * SPACE4_DIM3) + k); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE4_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Verify extent type */ - ext_type = H5Sget_simple_extent_type(sid1); - VERIFY(ext_type, H5S_SIMPLE, "H5Sget_simple_extent_type"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE4_NAME, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, xfer_plist, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, xfer_plist, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Check that the values match with a dataset iterator */ - tbuf = wbuf; - ret = H5Diterate(rbuf, H5T_NATIVE_UCHAR, sid1, test_select_all_iter1, &tbuf); - CHECK(ret, FAIL, "H5Diterate"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_all() */ - -/**************************************************************** -** -** test_select_all_hyper(): Test basic H5S (dataspace) selection code. -** Tests "all" and hyperslab selections. -** -****************************************************************/ -static void -test_select_all_hyper(hid_t xfer_plist) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t start[SPACE1_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE1_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE1_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE1_RANK]; /* Block size of hyperslab */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - H5S_class_t ext_type; /* Extent type */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing 'All' Selection Functions\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE3_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Verify extent type */ - ext_type = H5Sget_simple_extent_type(sid1); - VERIFY(ext_type, H5S_SIMPLE, "H5Sget_simple_extent_type"); - - /* Select entire 15x26 extent for disk dataset */ - ret = H5Sselect_all(sid1); - CHECK(ret, FAIL, "H5Sselect_all"); - - /* Select 15x26 hyperslab for memory dataset */ - start[0] = 15; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE3_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer_plist, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 15x26 hyperslab for reading memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select no extent for disk dataset */ - ret = H5Sselect_none(sid1); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Read selection from disk (should fail with no selection defined) */ - H5E_BEGIN_TRY - { - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer_plist, rbuf); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dread"); - - /* Select entire 15x26 extent for disk dataset */ - ret = H5Sselect_all(sid1); - CHECK(ret, FAIL, "H5Sselect_all"); - - /* Read selection from disk (should work now) */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer_plist, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Check that the values match with a dataset iterator */ - tbuf = wbuf + (15 * SPACE2_DIM2); - ret = H5Diterate(rbuf, H5T_NATIVE_UCHAR, sid2, test_select_all_iter1, &tbuf); - CHECK(ret, FAIL, "H5Diterate"); - - /* A quick check to make certain that iterating through a "none" selection works */ - ret = H5Sselect_none(sid2); - CHECK(ret, FAIL, "H5Sselect_none"); - ret = H5Diterate(rbuf, H5T_NATIVE_UCHAR, sid2, test_select_none_iter1, &tbuf); - CHECK(ret, FAIL, "H5Diterate"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_all_hyper() */ - -/**************************************************************** -** -** test_select_combo(): Test basic H5S (dataspace) selection code. -** Tests combinations of element and hyperslab selections between -** dataspaces of various sizes and dimensionalities. -** -****************************************************************/ -static void -test_select_combo(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t coord1[POINT1_NPOINTS][SPACE1_RANK]; /* Coordinates for point selection */ - hsize_t start[SPACE1_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE1_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE1_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE1_RANK]; /* Block size of hyperslab */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Combination of Hyperslab & Element Selection Functions\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for write buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select sequence of ten points for disk dataset */ - coord1[0][0] = 0; - coord1[0][1] = 10; - coord1[0][2] = 5; - coord1[1][0] = 1; - coord1[1][1] = 2; - coord1[1][2] = 7; - coord1[2][0] = 2; - coord1[2][1] = 4; - coord1[2][2] = 9; - coord1[3][0] = 0; - coord1[3][1] = 6; - coord1[3][2] = 11; - coord1[4][0] = 1; - coord1[4][1] = 8; - coord1[4][2] = 13; - coord1[5][0] = 2; - coord1[5][1] = 12; - coord1[5][2] = 0; - coord1[6][0] = 0; - coord1[6][1] = 14; - coord1[6][2] = 2; - coord1[7][0] = 1; - coord1[7][1] = 0; - coord1[7][2] = 4; - coord1[8][0] = 2; - coord1[8][1] = 1; - coord1[8][2] = 6; - coord1[9][0] = 0; - coord1[9][1] = 3; - coord1[9][2] = 8; - ret = H5Sselect_elements(sid1, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Select 1x10 hyperslab for writing memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 10; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 10x1 hyperslab for reading memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 10; - count[1] = 1; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - for (i = 0; i < POINT1_NPOINTS; i++) { - tbuf = wbuf + i; - tbuf2 = rbuf + (i * SPACE3_DIM2); - if (*tbuf != *tbuf2) - TestErrPrintf("element values don't match!, i=%d\n", i); - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_combo() */ - -static int -compare_size_t(const void *s1, const void *s2) -{ - if (*(const size_t *)s1 < *(const size_t *)s2) - return (-1); - else if (*(const size_t *)s1 > *(const size_t *)s2) - return (1); - else - return (0); -} - -/**************************************************************** -** -** test_select_hyper_stride(): Test H5S (dataspace) selection code. -** Tests strided hyperslabs of various sizes and dimensionalities. -** -****************************************************************/ -static void -test_select_hyper_stride(hid_t xfer_plist) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t start[SPACE1_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE1_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE1_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE1_RANK]; /* Block size of hyperslab */ - uint16_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - size_t loc1[72] = { - /* Gruesomely ugly way to make certain hyperslab locations are checked correctly */ - 27, 28, 29, 53, 54, 55, 79, 80, 81, /* Block #1 */ - 32, 33, 34, 58, 59, 60, 84, 85, 86, /* Block #2 */ - 157, 158, 159, 183, 184, 185, 209, 210, 211, /* Block #3 */ - 162, 163, 164, 188, 189, 190, 214, 215, 216, /* Block #4 */ - 287, 288, 289, 313, 314, 315, 339, 340, 341, /* Block #5 */ - 292, 293, 294, 318, 319, 320, 344, 345, 346, /* Block #6 */ - 417, 418, 419, 443, 444, 445, 469, 470, 471, /* Block #7 */ - 422, 423, 424, 448, 449, 450, 474, 475, 476, /* Block #8 */ - }; - size_t loc2[72] = { - 0, 1, 2, 26, 27, 28, /* Block #1 */ - 4, 5, 6, 30, 31, 32, /* Block #2 */ - 8, 9, 10, 34, 35, 36, /* Block #3 */ - 12, 13, 14, 38, 39, 40, /* Block #4 */ - 104, 105, 106, 130, 131, 132, /* Block #5 */ - 108, 109, 110, 134, 135, 136, /* Block #6 */ - 112, 113, 114, 138, 139, 140, /* Block #7 */ - 116, 117, 118, 142, 143, 144, /* Block #8 */ - 208, 209, 210, 234, 235, 236, /* Block #9 */ - 212, 213, 214, 238, 239, 240, /* Block #10 */ - 216, 217, 218, 242, 243, 244, /* Block #11 */ - 220, 221, 222, 246, 247, 248, /* Block #12 */ - }; - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslabs with Strides Functionality\n")); - - /* Allocate write & read buffers */ - wbuf = (uint16_t *)malloc(sizeof(uint16_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint16_t *)calloc(sizeof(uint16_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint16_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 2x3x3 count with a stride of 2x4x3 & 1x2x2 block hyperslab for disk dataset */ - start[0] = 0; - start[1] = 0; - start[2] = 0; - stride[0] = 2; - stride[1] = 4; - stride[2] = 3; - count[0] = 2; - count[1] = 3; - count[2] = 3; - block[0] = 1; - block[1] = 2; - block[2] = 2; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 4x2 count with a stride of 5x5 & 3x3 block hyperslab for memory dataset */ - start[0] = 1; - start[1] = 1; - stride[0] = 5; - stride[1] = 5; - count[0] = 4; - count[1] = 2; - block[0] = 3; - block[1] = 3; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE2_NAME, H5T_STD_U16LE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, sid1, xfer_plist, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 3x4 count with a stride of 4x4 & 2x3 block hyperslab for memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 4; - stride[1] = 4; - count[0] = 3; - count[1] = 4; - block[0] = 2; - block[1] = 3; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_USHORT, sid2, sid1, xfer_plist, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Sort the locations into the proper order */ - qsort(loc1, (size_t)72, sizeof(size_t), compare_size_t); - qsort(loc2, (size_t)72, sizeof(size_t), compare_size_t); - /* Compare data read with data written out */ - for (i = 0; i < 72; i++) { - tbuf = wbuf + loc1[i]; - tbuf2 = rbuf + loc2[i]; - if (*tbuf != *tbuf2) { - printf("%d: hyperslab values don't match!, loc1[%d]=%d, loc2[%d]=%d\n", __LINE__, i, (int)loc1[i], - i, (int)loc2[i]); - printf("wbuf=%p, tbuf=%p, rbuf=%p, tbuf2=%p\n", (void *)wbuf, (void *)tbuf, (void *)rbuf, - (void *)tbuf2); - TestErrPrintf("*tbuf=%u, *tbuf2=%u\n", (unsigned)*tbuf, (unsigned)*tbuf2); - } /* end if */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_stride() */ - -/**************************************************************** -** -** test_select_hyper_contig(): Test H5S (dataspace) selection code. -** Tests contiguous hyperslabs of various sizes and dimensionalities. -** -****************************************************************/ -static void -test_select_hyper_contig(hid_t dset_type, hid_t xfer_plist) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims2[] = {SPACE2_DIM2, SPACE2_DIM1}; - hsize_t start[SPACE1_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE1_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE1_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE1_RANK]; /* Block size of hyperslab */ - uint16_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Contiguous Hyperslabs Functionality\n")); - - /* Allocate write & read buffers */ - wbuf = (uint16_t *)malloc(sizeof(uint16_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint16_t *)calloc(sizeof(uint16_t), (size_t)(SPACE2_DIM1 * SPACE2_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint16_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 12x10 count with a stride of 1x3 & 3x3 block hyperslab for disk dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 3; - count[0] = 12; - count[1] = 10; - block[0] = 1; - block[1] = 3; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 4x5 count with a stride of 3x6 & 3x6 block hyperslab for memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 3; - stride[1] = 6; - count[0] = 4; - count[1] = 5; - block[0] = 3; - block[1] = 6; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE2_NAME, dset_type, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, sid1, xfer_plist, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 6x5 count with a stride of 2x6 & 2x6 block hyperslab for disk dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 2; - stride[1] = 6; - count[0] = 6; - count[1] = 5; - block[0] = 2; - block[1] = 6; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 3x15 count with a stride of 4x2 & 4x2 block hyperslab for memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 4; - stride[1] = 2; - count[0] = 3; - count[1] = 15; - block[0] = 4; - block[1] = 2; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_USHORT, sid2, sid1, xfer_plist, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - if (memcmp(rbuf, wbuf, sizeof(uint16_t) * 30 * 12) != 0) - TestErrPrintf("hyperslab values don't match! Line=%d\n", __LINE__); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_contig() */ - -/**************************************************************** -** -** test_select_hyper_contig2(): Test H5S (dataspace) selection code. -** Tests more contiguous hyperslabs of various sizes and dimensionalities. -** -****************************************************************/ -static void -test_select_hyper_contig2(hid_t dset_type, hid_t xfer_plist) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims2[] = {SPACE8_DIM4, SPACE8_DIM3, SPACE8_DIM2, SPACE8_DIM1}; - hsize_t start[SPACE8_RANK]; /* Starting location of hyperslab */ - hsize_t count[SPACE8_RANK]; /* Element count of hyperslab */ - uint16_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf; /* temporary buffer pointer */ - int i, j, k, l; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing More Contiguous Hyperslabs Functionality\n")); - - /* Allocate write & read buffers */ - wbuf = (uint16_t *)malloc(sizeof(uint16_t) * SPACE8_DIM1 * SPACE8_DIM2 * SPACE8_DIM3 * SPACE8_DIM4); - CHECK_PTR(wbuf, "malloc"); - rbuf = - (uint16_t *)calloc(sizeof(uint16_t), (size_t)(SPACE8_DIM1 * SPACE8_DIM2 * SPACE8_DIM3 * SPACE8_DIM4)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE8_DIM1; i++) - for (j = 0; j < SPACE8_DIM2; j++) - for (k = 0; k < SPACE8_DIM3; k++) - for (l = 0; l < SPACE8_DIM4; l++) - *tbuf++ = (uint16_t)((i * SPACE8_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE8_RANK, dims2, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE8_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select contiguous hyperslab for disk dataset */ - start[0] = 0; - start[1] = 0; - start[2] = 0; - start[3] = 0; - count[0] = 2; - count[1] = SPACE8_DIM3; - count[2] = SPACE8_DIM2; - count[3] = SPACE8_DIM1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select contiguous hyperslab in memory */ - start[0] = 0; - start[1] = 0; - start[2] = 0; - start[3] = 0; - count[0] = 2; - count[1] = SPACE8_DIM3; - count[2] = SPACE8_DIM2; - count[3] = SPACE8_DIM1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE8_NAME, dset_type, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, sid1, xfer_plist, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE8_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select contiguous hyperslab in memory */ - start[0] = 0; - start[1] = 0; - start[2] = 0; - start[3] = 0; - count[0] = 2; - count[1] = SPACE8_DIM3; - count[2] = SPACE8_DIM2; - count[3] = SPACE8_DIM1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select contiguous hyperslab in memory */ - start[0] = 0; - start[1] = 0; - start[2] = 0; - start[3] = 0; - count[0] = 2; - count[1] = SPACE8_DIM3; - count[2] = SPACE8_DIM2; - count[3] = SPACE8_DIM1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_USHORT, sid2, sid1, xfer_plist, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - if (memcmp(rbuf, wbuf, sizeof(uint16_t) * 2 * SPACE8_DIM3 * SPACE8_DIM2 * SPACE8_DIM1) != 0) - TestErrPrintf("Error: hyperslab values don't match!\n"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_contig2() */ - -/**************************************************************** -** -** test_select_hyper_contig3(): Test H5S (dataspace) selection code. -** Tests contiguous hyperslabs of various sizes and dimensionalities. -** This test uses a hyperslab that is contiguous in the lowest dimension, -** not contiguous in a dimension, then has a selection across the entire next -** dimension (which should be "flattened" out also). -** -****************************************************************/ -static void -test_select_hyper_contig3(hid_t dset_type, hid_t xfer_plist) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims2[] = {SPACE8_DIM4, SPACE8_DIM3, SPACE8_DIM2, SPACE8_DIM1}; - hsize_t start[SPACE8_RANK]; /* Starting location of hyperslab */ - hsize_t count[SPACE8_RANK]; /* Element count of hyperslab */ - uint16_t *wbuf, /* Buffer to write to disk */ - *rbuf, /* Buffer read from disk */ - *tbuf, *tbuf2; /* Temporary buffer pointers */ - unsigned i, j, k, l; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Yet More Contiguous Hyperslabs Functionality\n")); - - /* Allocate write & read buffers */ - wbuf = (uint16_t *)malloc(sizeof(uint16_t) * SPACE8_DIM1 * SPACE8_DIM2 * SPACE8_DIM3 * SPACE8_DIM4); - CHECK_PTR(wbuf, "malloc"); - rbuf = - (uint16_t *)calloc(sizeof(uint16_t), (size_t)(SPACE8_DIM1 * SPACE8_DIM2 * SPACE8_DIM3 * SPACE8_DIM4)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE8_DIM4; i++) - for (j = 0; j < SPACE8_DIM3; j++) - for (k = 0; k < SPACE8_DIM2; k++) - for (l = 0; l < SPACE8_DIM1; l++) - *tbuf++ = (uint16_t)((k * SPACE8_DIM2) + l); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE8_RANK, dims2, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE8_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select semi-contiguous hyperslab for disk dataset */ - start[0] = 0; - start[1] = 0; - start[2] = SPACE8_DIM2 / 2; - start[3] = 0; - count[0] = 2; - count[1] = SPACE8_DIM3; - count[2] = SPACE8_DIM2 / 2; - count[3] = SPACE8_DIM1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select semi-contiguous hyperslab in memory */ - start[0] = 0; - start[1] = 0; - start[2] = SPACE8_DIM2 / 2; - start[3] = 0; - count[0] = 2; - count[1] = SPACE8_DIM3; - count[2] = SPACE8_DIM2 / 2; - count[3] = SPACE8_DIM1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE8_NAME, dset_type, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, sid1, xfer_plist, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE8_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select semi-contiguous hyperslab in memory */ - start[0] = 0; - start[1] = 0; - start[2] = SPACE8_DIM2 / 2; - start[3] = 0; - count[0] = 2; - count[1] = SPACE8_DIM3; - count[2] = SPACE8_DIM2 / 2; - count[3] = SPACE8_DIM1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select semi-contiguous hyperslab in memory */ - start[0] = 0; - start[1] = 0; - start[2] = SPACE8_DIM2 / 2; - start[3] = 0; - count[0] = 2; - count[1] = SPACE8_DIM3; - count[2] = SPACE8_DIM2 / 2; - count[3] = SPACE8_DIM1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_USHORT, sid2, sid1, xfer_plist, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - for (i = 0, tbuf = wbuf, tbuf2 = rbuf; i < SPACE8_DIM4; i++) - for (j = 0; j < SPACE8_DIM3; j++) - for (k = 0; k < SPACE8_DIM2; k++) - for (l = 0; l < SPACE8_DIM1; l++, tbuf++, tbuf2++) - if ((i >= start[0] && i < (start[0] + count[0])) && - (j >= start[1] && j < (start[1] + count[1])) && - (k >= start[2] && k < (start[2] + count[2])) && - (l >= start[3] && l < (start[3] + count[3]))) { - if (*tbuf != *tbuf2) { - printf("Error: hyperslab values don't match!\n"); - TestErrPrintf("Line: %d, i=%u, j=%u, k=%u, l=%u, *tbuf=%u,*tbuf2=%u\n", __LINE__, - i, j, k, l, (unsigned)*tbuf, (unsigned)*tbuf2); - } /* end if */ - } /* end if */ - else { - if (*tbuf2 != 0) { - printf("Error: invalid data in read buffer!\n"); - TestErrPrintf("Line: %d, i=%u, j=%u, k=%u, l=%u, *tbuf=%u,*tbuf2=%u\n", __LINE__, - i, j, k, l, (unsigned)*tbuf, (unsigned)*tbuf2); - } /* end if */ - } /* end else */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_contig3() */ - -#if 0 -/**************************************************************** -** -** verify_select_hyper_contig_dr__run_test(): Verify data from -** test_select_hyper_contig_dr__run_test() -** -****************************************************************/ -static void -verify_select_hyper_contig_dr__run_test(const uint16_t *cube_buf, size_t cube_size, - unsigned edge_size, unsigned cube_rank) -{ - const uint16_t *cube_ptr; /* Pointer into the cube buffer */ - uint16_t expected_value; /* Expected value in dataset */ - unsigned i, j, k, l, m; /* Local index variables */ - size_t s; /* Local index variable */ - bool mis_match; /* Flag to indicate mismatch in expected value */ - - assert(cube_buf); - assert(cube_size > 0); - - expected_value = 0; - mis_match = false; - cube_ptr = cube_buf; - s = 0; - i = 0; - do { - j = 0; - do { - k = 0; - do { - l = 0; - do { - m = 0; - do { - /* Sanity check */ - assert(s < cube_size); - - /* Check for correct value */ - if (*cube_ptr != expected_value) - mis_match = true; - - /* Advance to next element */ - cube_ptr++; - expected_value++; - s++; - m++; - } while ((cube_rank > 0) && (m < edge_size)); - l++; - } while ((cube_rank > 1) && (l < edge_size)); - k++; - } while ((cube_rank > 2) && (k < edge_size)); - j++; - } while ((cube_rank > 3) && (j < edge_size)); - i++; - } while ((cube_rank > 4) && (i < edge_size)); - if (mis_match) - TestErrPrintf("Initial cube data don't match! Line = %d\n", __LINE__); -} /* verify_select_hyper_contig_dr__run_test() */ -#endif -#if 0 - -/**************************************************************** -** -** test_select_hyper_contig_dr__run_test(): Test H5S (dataspace) -** selection code with contiguous source and target having -** different ranks but the same shape. We have already -** tested H5Sselect_shape_same in isolation, so now we try to do -** I/O. -** -****************************************************************/ -static void -test_select_hyper_contig_dr__run_test(int test_num, const uint16_t *cube_buf, const uint16_t *zero_buf, - unsigned edge_size, unsigned chunk_edge_size, unsigned small_rank, - unsigned large_rank, hid_t dset_type, hid_t xfer_plist) -{ - bool mis_match; /* Flag indicating a value read in wasn't what was expected */ - hid_t fapl; /* File access property list */ - hid_t fid1; /* File ID */ - hid_t small_cube_sid; /* Dataspace ID for small cube in memory & file */ - hid_t mem_large_cube_sid; /* Dataspace ID for large cube in memory */ - hid_t file_large_cube_sid; /* Dataspace ID for large cube in file */ - hid_t small_cube_dcpl_id = H5P_DEFAULT; /* DCPL for small cube dataset */ - hid_t large_cube_dcpl_id = H5P_DEFAULT; /* DCPL for large cube dataset */ - hid_t small_cube_dataset; /* Dataset ID */ - hid_t large_cube_dataset; /* Dataset ID */ - size_t start_index; /* Offset within buffer to begin inspecting */ - size_t stop_index; /* Offset within buffer to end inspecting */ - uint16_t expected_value; /* Expected value in dataset */ - uint16_t *small_cube_buf_1; /* Buffer for small cube data */ - uint16_t *large_cube_buf_1; /* Buffer for large cube data */ - uint16_t *ptr_1; /* Temporary pointer into cube data */ - hsize_t dims[SS_DR_MAX_RANK]; /* Dataspace dimensions */ - hsize_t start[SS_DR_MAX_RANK]; /* Shared hyperslab start offset */ - hsize_t stride[SS_DR_MAX_RANK]; /* Shared hyperslab stride */ - hsize_t count[SS_DR_MAX_RANK]; /* Shared hyperslab count */ - hsize_t block[SS_DR_MAX_RANK]; /* Shared hyperslab block size */ - hsize_t *start_ptr; /* Actual hyperslab start offset */ - hsize_t *stride_ptr; /* Actual hyperslab stride */ - hsize_t *count_ptr; /* Actual hyperslab count */ - hsize_t *block_ptr; /* Actual hyperslab block size */ - size_t small_cube_size; /* Number of elements in small cube */ - size_t large_cube_size; /* Number of elements in large cube */ - unsigned u, v, w, x; /* Local index variables */ - size_t s; /* Local index variable */ - htri_t check; /* Shape comparison return value */ - herr_t ret; /* Generic return value */ - - MESSAGE(7, ("\tn-cube slice through m-cube I/O test %d.\n", test_num)); - MESSAGE(7, ("\tranks = %u/%u, edge_size = %u, chunk_edge_size = %u.\n", small_rank, large_rank, edge_size, - chunk_edge_size)); - - assert(edge_size >= 6); - assert(edge_size >= chunk_edge_size); - assert((chunk_edge_size == 0) || (chunk_edge_size >= 3)); - assert(small_rank > 0); - assert(small_rank < large_rank); - assert(large_rank <= SS_DR_MAX_RANK); - - /* Compute cube sizes */ - small_cube_size = large_cube_size = (size_t)1; - for (u = 0; u < large_rank; u++) { - if (u < small_rank) - small_cube_size *= (size_t)edge_size; - - large_cube_size *= (size_t)edge_size; - } /* end for */ - - assert(large_cube_size < (size_t)UINT_MAX); - - /* set up the start, stride, count, and block pointers */ - start_ptr = &(start[SS_DR_MAX_RANK - large_rank]); - stride_ptr = &(stride[SS_DR_MAX_RANK - large_rank]); - count_ptr = &(count[SS_DR_MAX_RANK - large_rank]); - block_ptr = &(block[SS_DR_MAX_RANK - large_rank]); - - /* Allocate buffers */ - small_cube_buf_1 = (uint16_t *)calloc(sizeof(uint16_t), small_cube_size); - CHECK_PTR(small_cube_buf_1, "calloc"); - large_cube_buf_1 = (uint16_t *)calloc(sizeof(uint16_t), large_cube_size); - CHECK_PTR(large_cube_buf_1, "calloc"); - - /* Create a dataset transfer property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Use the 'core' VFD for this test */ - ret = H5Pset_fapl_core(fapl, (size_t)(1024 * 1024), false); - CHECK(ret, FAIL, "H5Pset_fapl_core"); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Close file access property list */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* setup dims: */ - dims[0] = dims[1] = dims[2] = dims[3] = dims[4] = (hsize_t)edge_size; - - /* Create small cube dataspaces */ - small_cube_sid = H5Screate_simple((int)small_rank, dims, NULL); - CHECK(small_cube_sid, FAIL, "H5Screate_simple"); - - /* Create large cube dataspace */ - mem_large_cube_sid = H5Screate_simple((int)large_rank, dims, NULL); - CHECK(mem_large_cube_sid, FAIL, "H5Screate_simple"); - file_large_cube_sid = H5Screate_simple((int)large_rank, dims, NULL); - CHECK(file_large_cube_sid, FAIL, "H5Screate_simple"); - - /* if chunk edge size is greater than zero, set up the small and - * large data set creation property lists to specify chunked - * datasets. - */ - if (chunk_edge_size > 0) { - hsize_t chunk_dims[SS_DR_MAX_RANK]; /* Chunk dimensions */ - - chunk_dims[0] = chunk_dims[1] = chunk_dims[2] = chunk_dims[3] = chunk_dims[4] = - (hsize_t)chunk_edge_size; - - small_cube_dcpl_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(small_cube_dcpl_id, FAIL, "H5Pcreate"); - - ret = H5Pset_layout(small_cube_dcpl_id, H5D_CHUNKED); - CHECK(ret, FAIL, "H5Pset_layout"); - - ret = H5Pset_chunk(small_cube_dcpl_id, (int)small_rank, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - large_cube_dcpl_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(large_cube_dcpl_id, FAIL, "H5Pcreate"); - - ret = H5Pset_layout(large_cube_dcpl_id, H5D_CHUNKED); - CHECK(ret, FAIL, "H5Pset_layout"); - - ret = H5Pset_chunk(large_cube_dcpl_id, (int)large_rank, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - } /* end if */ - - /* create the small cube dataset */ - small_cube_dataset = H5Dcreate2(fid1, "small_cube_dataset", dset_type, small_cube_sid, H5P_DEFAULT, - small_cube_dcpl_id, H5P_DEFAULT); - CHECK(small_cube_dataset, FAIL, "H5Dcreate2"); - - /* Close non-default small dataset DCPL */ - if (small_cube_dcpl_id != H5P_DEFAULT) { - ret = H5Pclose(small_cube_dcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - } /* end if */ - - /* create the large cube dataset */ - large_cube_dataset = H5Dcreate2(fid1, "large_cube_dataset", dset_type, file_large_cube_sid, H5P_DEFAULT, - large_cube_dcpl_id, H5P_DEFAULT); - CHECK(large_cube_dataset, FAIL, "H5Dcreate2"); - - /* Close non-default large dataset DCPL */ - if (large_cube_dcpl_id != H5P_DEFAULT) { - ret = H5Pclose(large_cube_dcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - } /* end if */ - - /* write initial data to the on disk datasets */ - ret = - H5Dwrite(small_cube_dataset, H5T_NATIVE_UINT16, small_cube_sid, small_cube_sid, xfer_plist, cube_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Dwrite(large_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid, file_large_cube_sid, xfer_plist, - cube_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* read initial data from disk and verify that it is as expected. */ - ret = H5Dread(small_cube_dataset, H5T_NATIVE_UINT16, small_cube_sid, small_cube_sid, xfer_plist, - small_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - /* Check that the data is valid */ - verify_select_hyper_contig_dr__run_test(small_cube_buf_1, small_cube_size, edge_size, small_rank); - - ret = H5Dread(large_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid, file_large_cube_sid, xfer_plist, - large_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - /* Check that the data is valid */ - verify_select_hyper_contig_dr__run_test(large_cube_buf_1, large_cube_size, edge_size, large_rank); - - /* first, verify that we can read from disk correctly using selections - * of different rank that H5Sselect_shape_same() views as being of the - * same shape. - * - * Start by reading small_rank-D slice from the on disk large cube, and - * verifying that the data read is correct. Verify that H5Sselect_shape_same() - * returns true on the memory and file selections. - */ - - /* set up start, stride, count, and block -- note that we will - * change start[] so as to read slices of the large cube. - */ - for (u = 0; u < SS_DR_MAX_RANK; u++) { - start[u] = 0; - stride[u] = 1; - count[u] = 1; - if ((SS_DR_MAX_RANK - u) > small_rank) - block[u] = 1; - else - block[u] = (hsize_t)edge_size; - } /* end for */ - - u = 0; - do { - v = 0; - do { - w = 0; - do { - x = 0; - do { - /* we know that small_rank >= 1 and that large_rank > small_rank - * by the assertions at the head of this function. Thus no - * need for another inner loop. - */ - start[0] = (hsize_t)u; - start[1] = (hsize_t)v; - start[2] = (hsize_t)w; - start[3] = (hsize_t)x; - start[4] = (hsize_t)0; - - ret = H5Sselect_hyperslab(file_large_cube_sid, H5S_SELECT_SET, start_ptr, stride_ptr, - count_ptr, block_ptr); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* verify that H5Sselect_shape_same() reports the two - * selections as having the same shape. - */ - check = H5Sselect_shape_same(small_cube_sid, file_large_cube_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Read selection from disk */ - ret = H5Dread(large_cube_dataset, H5T_NATIVE_UINT16, small_cube_sid, file_large_cube_sid, - xfer_plist, small_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - /* verify that expected data is retrieved */ - mis_match = false; - ptr_1 = small_cube_buf_1; - expected_value = (uint16_t)((u * edge_size * edge_size * edge_size * edge_size) + - (v * edge_size * edge_size * edge_size) + - (w * edge_size * edge_size) + (x * edge_size)); - for (s = 0; s < small_cube_size; s++) { - if (*ptr_1 != expected_value) - mis_match = true; - ptr_1++; - expected_value++; - } /* end for */ - if (mis_match) - TestErrPrintf("small cube read from largecube has bad data! Line=%d\n", __LINE__); - - x++; - } while ((large_rank >= 2) && (small_rank <= 1) && (x < edge_size)); - w++; - } while ((large_rank >= 3) && (small_rank <= 2) && (w < edge_size)); - v++; - } while ((large_rank >= 4) && (small_rank <= 3) && (v < edge_size)); - u++; - } while ((large_rank >= 5) && (small_rank <= 4) && (u < edge_size)); - - /* similarly, read the on disk small cube into slices through the in memory - * large cube, and verify that the correct data (and only the correct data) - * is read. - */ - - /* zero out the in-memory large cube */ - memset(large_cube_buf_1, 0, large_cube_size * sizeof(uint16_t)); - - u = 0; - do { - v = 0; - do { - w = 0; - do { - x = 0; - do { - /* we know that small_rank >= 1 and that large_rank > small_rank - * by the assertions at the head of this function. Thus no - * need for another inner loop. - */ - start[0] = (hsize_t)u; - start[1] = (hsize_t)v; - start[2] = (hsize_t)w; - start[3] = (hsize_t)x; - start[4] = (hsize_t)0; - - ret = H5Sselect_hyperslab(mem_large_cube_sid, H5S_SELECT_SET, start_ptr, stride_ptr, - count_ptr, block_ptr); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* verify that H5Sselect_shape_same() reports the two - * selections as having the same shape. - */ - check = H5Sselect_shape_same(small_cube_sid, mem_large_cube_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Read selection from disk */ - ret = H5Dread(small_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid, small_cube_sid, - xfer_plist, large_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - /* verify that the expected data and only the - * expected data was read. - */ - start_index = (u * edge_size * edge_size * edge_size * edge_size) + - (v * edge_size * edge_size * edge_size) + (w * edge_size * edge_size) + - (x * edge_size); - stop_index = start_index + small_cube_size - 1; - - assert(start_index < stop_index); - assert(stop_index <= large_cube_size); - - mis_match = false; - ptr_1 = large_cube_buf_1; - expected_value = 0; - for (s = 0; s < start_index; s++) { - if (*ptr_1 != 0) - mis_match = true; - ptr_1++; - } /* end for */ - for (; s <= stop_index; s++) { - if (*ptr_1 != expected_value) - mis_match = true; - expected_value++; - ptr_1++; - } /* end for */ - for (; s < large_cube_size; s++) { - if (*ptr_1 != 0) - mis_match = true; - ptr_1++; - } /* end for */ - if (mis_match) - TestErrPrintf("large cube read from small cube has bad data! Line=%u\n", __LINE__); - - /* Zero out the buffer for the next pass */ - memset(large_cube_buf_1 + start_index, 0, small_cube_size * sizeof(uint16_t)); - - x++; - } while ((large_rank >= 2) && (small_rank <= 1) && (x < edge_size)); - w++; - } while ((large_rank >= 3) && (small_rank <= 2) && (w < edge_size)); - v++; - } while ((large_rank >= 4) && (small_rank <= 3) && (v < edge_size)); - u++; - } while ((large_rank >= 5) && (small_rank <= 4) && (u < edge_size)); - - /* now we go in the opposite direction, verifying that we can write - * from memory to file using selections of different rank that - * H5Sselect_shape_same() views as being of the same shape. - * - * Start by writing small_rank D slices from the in memory large cube, to - * the the on disk small cube dataset. After each write, read the small - * cube dataset back from disk, and verify that it contains the expected - * data. Verify that H5Sselect_shape_same() returns true on the - * memory and file selections. - */ - - u = 0; - do { - v = 0; - do { - w = 0; - do { - x = 0; - do { - /* we know that small_rank >= 1 and that large_rank > small_rank - * by the assertions at the head of this function. Thus no - * need for another inner loop. - */ - - /* zero out the on disk small cube */ - ret = H5Dwrite(small_cube_dataset, H5T_NATIVE_UINT16, small_cube_sid, small_cube_sid, - xfer_plist, zero_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* select the portion of the in memory large cube from which we - * are going to write data. - */ - start[0] = (hsize_t)u; - start[1] = (hsize_t)v; - start[2] = (hsize_t)w; - start[3] = (hsize_t)x; - start[4] = (hsize_t)0; - - ret = H5Sselect_hyperslab(mem_large_cube_sid, H5S_SELECT_SET, start_ptr, stride_ptr, - count_ptr, block_ptr); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* verify that H5Sselect_shape_same() reports the in - * memory slice through the cube selection and the - * on disk full small cube selections as having the same shape. - */ - check = H5Sselect_shape_same(small_cube_sid, mem_large_cube_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* write the slice from the in memory large cube to the on disk small cube */ - ret = H5Dwrite(small_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid, small_cube_sid, - xfer_plist, cube_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* read the on disk small cube into memory */ - ret = H5Dread(small_cube_dataset, H5T_NATIVE_UINT16, small_cube_sid, small_cube_sid, - xfer_plist, small_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - /* verify that expected data is retrieved */ - mis_match = false; - ptr_1 = small_cube_buf_1; - expected_value = (uint16_t)((u * edge_size * edge_size * edge_size * edge_size) + - (v * edge_size * edge_size * edge_size) + - (w * edge_size * edge_size) + (x * edge_size)); - for (s = 0; s < small_cube_size; s++) { - if (*ptr_1 != expected_value) - mis_match = true; - expected_value++; - ptr_1++; - } /* end for */ - if (mis_match) - TestErrPrintf("small cube data don't match! Line=%d\n", __LINE__); - - x++; - } while ((large_rank >= 2) && (small_rank <= 1) && (x < edge_size)); - w++; - } while ((large_rank >= 3) && (small_rank <= 2) && (w < edge_size)); - v++; - } while ((large_rank >= 4) && (small_rank <= 3) && (v < edge_size)); - u++; - } while ((large_rank >= 5) && (small_rank <= 4) && (u < edge_size)); - - /* Now write the contents of the in memory small cube to slices of - * the on disk cube. After each write, read the on disk cube - * into memory, and verify that it contains the expected - * data. Verify that H5Sselect_shape_same() returns true on - * the memory and file selections. - */ - - /* select the entire memory and file cube dataspaces */ - ret = H5Sselect_all(mem_large_cube_sid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Sselect_all(file_large_cube_sid); - CHECK(ret, FAIL, "H5Sselect_all"); - - u = 0; - do { - v = 0; - do { - w = 0; - do { - x = 0; - do { - /* we know that small_rank >= 1 and that large_rank > small_rank - * by the assertions at the head of this function. Thus no - * need for another inner loop. - */ - - /* zero out the on disk cube */ - ret = H5Dwrite(large_cube_dataset, H5T_NATIVE_USHORT, mem_large_cube_sid, - file_large_cube_sid, xfer_plist, zero_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* select the portion of the in memory large cube to which we - * are going to write data. - */ - start[0] = (hsize_t)u; - start[1] = (hsize_t)v; - start[2] = (hsize_t)w; - start[3] = (hsize_t)x; - start[4] = (hsize_t)0; - - ret = H5Sselect_hyperslab(file_large_cube_sid, H5S_SELECT_SET, start_ptr, stride_ptr, - count_ptr, block_ptr); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* verify that H5Sselect_shape_same() reports the in - * memory full selection of the small cube and the - * on disk slice through the large cube selection - * as having the same shape. - */ - check = H5Sselect_shape_same(small_cube_sid, file_large_cube_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* write the cube from memory to the target slice of the disk cube */ - ret = H5Dwrite(large_cube_dataset, H5T_NATIVE_UINT16, small_cube_sid, file_large_cube_sid, - xfer_plist, cube_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* read the on disk cube into memory */ - ret = H5Sselect_all(file_large_cube_sid); - CHECK(ret, FAIL, "H5Sselect_all"); - - ret = H5Dread(large_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid, - file_large_cube_sid, xfer_plist, large_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - /* verify that the expected data and only the - * expected data was read. - */ - start_index = (u * edge_size * edge_size * edge_size * edge_size) + - (v * edge_size * edge_size * edge_size) + (w * edge_size * edge_size) + - (x * edge_size); - stop_index = start_index + small_cube_size - 1; - - assert(start_index < stop_index); - assert(stop_index <= large_cube_size); - - mis_match = false; - ptr_1 = large_cube_buf_1; - expected_value = 0; - for (s = 0; s < start_index; s++) { - if (*ptr_1 != 0) - mis_match = true; - ptr_1++; - } /* end for */ - for (; s <= stop_index; s++) { - if (*ptr_1 != expected_value) - mis_match = true; - expected_value++; - ptr_1++; - } /* end for */ - for (; s < large_cube_size; s++) { - if (*ptr_1 != 0) - mis_match = true; - ptr_1++; - } /* end for */ - if (mis_match) - TestErrPrintf("large cube written from small cube has bad data! Line=%d\n", __LINE__); - - x++; - } while ((large_rank >= 2) && (small_rank <= 1) && (x < edge_size)); - w++; - } while ((large_rank >= 3) && (small_rank <= 2) && (w < edge_size)); - v++; - } while ((large_rank >= 4) && (small_rank <= 3) && (v < edge_size)); - u++; - } while ((large_rank >= 5) && (small_rank <= 4) && (u < edge_size)); - - /* Close memory dataspaces */ - ret = H5Sclose(small_cube_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(mem_large_cube_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(file_large_cube_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Datasets */ - ret = H5Dclose(small_cube_dataset); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Dclose(large_cube_dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(small_cube_buf_1); - free(large_cube_buf_1); - -} /* test_select_hyper_contig_dr__run_test() */ -#endif -#if 0 -/**************************************************************** -** -** test_select_hyper_contig_dr(): Test H5S (dataspace) -** selection code with contiguous source and target having -** different ranks but the same shape. We have already -** tested H5Sselect_shape_same in isolation, so now we try to do -** I/O. -** -****************************************************************/ -static void -test_select_hyper_contig_dr(hid_t dset_type, hid_t xfer_plist) -{ - int test_num = 0; - unsigned chunk_edge_size; /* Size of chunk's dataspace dimensions */ - unsigned edge_size = 6; /* Size of dataset's dataspace dimensions */ - unsigned small_rank; /* Current rank of small dataset */ - unsigned large_rank; /* Current rank of large dataset */ - uint16_t *cube_buf; /* Buffer for writing cube data */ - uint16_t *zero_buf; /* Buffer for writing zeroed cube data */ - uint16_t *cube_ptr; /* Temporary pointer into cube data */ - unsigned max_rank = 5; /* Max. rank to use */ - size_t max_cube_size; /* Max. number of elements in largest cube */ - size_t s; /* Local index variable */ - unsigned u; /* Local index variable */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Contiguous Hyperslabs With Different Rank I/O Functionality\n")); - - /* Compute max. cube size */ - max_cube_size = (size_t)1; - for (u = 0; u < max_rank; u++) - max_cube_size *= (size_t)edge_size; - - /* Allocate cube buffer for writing values */ - cube_buf = (uint16_t *)malloc(sizeof(uint16_t) * max_cube_size); - CHECK_PTR(cube_buf, "malloc"); - - /* Initialize the cube buffer */ - cube_ptr = cube_buf; - for (s = 0; s < max_cube_size; s++) - *cube_ptr++ = (uint16_t)s; - - /* Allocate cube buffer for zeroing values on disk */ - zero_buf = (uint16_t *)calloc(sizeof(uint16_t), max_cube_size); - CHECK_PTR(zero_buf, "calloc"); - - for (large_rank = 1; large_rank <= max_rank; large_rank++) { - for (small_rank = 1; small_rank < large_rank; small_rank++) { - chunk_edge_size = 0; - test_select_hyper_contig_dr__run_test(test_num, cube_buf, zero_buf, edge_size, chunk_edge_size, - small_rank, large_rank, dset_type, xfer_plist); - test_num++; - - chunk_edge_size = 3; - test_select_hyper_contig_dr__run_test(test_num, cube_buf, zero_buf, edge_size, chunk_edge_size, - small_rank, large_rank, dset_type, xfer_plist); - test_num++; - } /* for loop on small rank */ - } /* for loop on large rank */ - - free(cube_buf); - free(zero_buf); - -} /* test_select_hyper_contig_dr() */ -#endif -/**************************************************************** -** -** test_select_hyper_checker_board_dr__select_checker_board(): -** Given an n-cube dataspace with each edge of length -** edge_size, and a checker_edge_size either select a checker -** board selection of the entire cube(if sel_rank == n), -** or select a checker board selection of a -** sel_rank dimensional slice through n-cube parallel to the -** sel_rank fastest changing indices, with origin (in the -** higher indices) as indicated by the start array. -** -** Note that this function, like all its relatives, is -** hard coded to presume a maximum n-cube rank of 5. -** While this maximum is declared as a constant, increasing -** it will require extensive coding in addition to changing -** the value of the constant. -** -** JRM -- 9/9/09 -** -****************************************************************/ -#if 0 -static void -test_select_hyper_checker_board_dr__select_checker_board(hid_t tgt_n_cube_sid, unsigned tgt_n_cube_rank, - unsigned edge_size, unsigned checker_edge_size, - unsigned sel_rank, const hsize_t sel_start[]) -{ - bool first_selection = true; - unsigned n_cube_offset; - unsigned sel_offset; - hsize_t base_count; - hsize_t offset_count; - hsize_t start[SS_DR_MAX_RANK]; /* Offset of hyperslab selection */ - hsize_t stride[SS_DR_MAX_RANK]; /* Stride of hyperslab selection */ - hsize_t count[SS_DR_MAX_RANK]; /* Count of hyperslab selection */ - hsize_t block[SS_DR_MAX_RANK]; /* Block size of hyperslab selection */ - unsigned i, j, k, l, m; /* Local index variable */ - unsigned u; /* Local index variables */ - herr_t ret; /* Generic return value */ - - assert(edge_size >= 6); - assert(0 < checker_edge_size); - assert(checker_edge_size <= edge_size); - assert(0 < sel_rank); - assert(sel_rank <= tgt_n_cube_rank); - assert(tgt_n_cube_rank <= SS_DR_MAX_RANK); - - sel_offset = SS_DR_MAX_RANK - sel_rank; - n_cube_offset = SS_DR_MAX_RANK - tgt_n_cube_rank; - assert(n_cube_offset <= sel_offset); - - /* First, compute the base count (which assumes start == 0 - * for the associated offset) and offset_count (which - * assumes start == checker_edge_size for the associated - * offset). - */ - base_count = edge_size / (checker_edge_size * 2); - if ((edge_size % (checker_edge_size * 2)) > 0) - base_count++; - - offset_count = (edge_size - checker_edge_size) / (checker_edge_size * 2); - if (((edge_size - checker_edge_size) % (checker_edge_size * 2)) > 0) - offset_count++; - - /* Now set up the stride and block arrays, and portions of the start - * and count arrays that will not be altered during the selection of - * the checker board. - */ - u = 0; - while (u < n_cube_offset) { - /* these values should never be used */ - start[u] = 0; - stride[u] = 0; - count[u] = 0; - block[u] = 0; - - u++; - } /* end while */ - - while (u < sel_offset) { - start[u] = sel_start[u]; - stride[u] = 2 * edge_size; - count[u] = 1; - block[u] = 1; - - u++; - } /* end while */ - - while (u < SS_DR_MAX_RANK) { - stride[u] = 2 * checker_edge_size; - block[u] = checker_edge_size; - - u++; - } /* end while */ - - i = 0; - do { - if (0 >= sel_offset) { - if (i == 0) { - start[0] = 0; - count[0] = base_count; - } /* end if */ - else { - start[0] = checker_edge_size; - count[0] = offset_count; - } /* end else */ - } /* end if */ - - j = 0; - do { - if (1 >= sel_offset) { - if (j == 0) { - start[1] = 0; - count[1] = base_count; - } /* end if */ - else { - start[1] = checker_edge_size; - count[1] = offset_count; - } /* end else */ - } /* end if */ - - k = 0; - do { - if (2 >= sel_offset) { - if (k == 0) { - start[2] = 0; - count[2] = base_count; - } /* end if */ - else { - start[2] = checker_edge_size; - count[2] = offset_count; - } /* end else */ - } /* end if */ - - l = 0; - do { - if (3 >= sel_offset) { - if (l == 0) { - start[3] = 0; - count[3] = base_count; - } /* end if */ - else { - start[3] = checker_edge_size; - count[3] = offset_count; - } /* end else */ - } /* end if */ - - m = 0; - do { - if (4 >= sel_offset) { - if (m == 0) { - start[4] = 0; - count[4] = base_count; - } /* end if */ - else { - start[4] = checker_edge_size; - count[4] = offset_count; - } /* end else */ - } /* end if */ - - if (((i + j + k + l + m) % 2) == 0) { - if (first_selection) { - first_selection = false; - - ret = H5Sselect_hyperslab(tgt_n_cube_sid, H5S_SELECT_SET, - &(start[n_cube_offset]), &(stride[n_cube_offset]), - &(count[n_cube_offset]), &(block[n_cube_offset])); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - } /* end if */ - else { - ret = H5Sselect_hyperslab(tgt_n_cube_sid, H5S_SELECT_OR, - &(start[n_cube_offset]), &(stride[n_cube_offset]), - &(count[n_cube_offset]), &(block[n_cube_offset])); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - } /* end else */ - } /* end if */ - - m++; - } while ((m <= 1) && (4 >= sel_offset)); - l++; - } while ((l <= 1) && (3 >= sel_offset)); - k++; - } while ((k <= 1) && (2 >= sel_offset)); - j++; - } while ((j <= 1) && (1 >= sel_offset)); - i++; - } while ((i <= 1) && (0 >= sel_offset)); - - /* Weirdness alert: - * - * Some how, it seems that selections can extend beyond the - * boundaries of the target dataspace -- hence the following - * code to manually clip the selection back to the dataspace - * proper. - */ - for (u = 0; u < SS_DR_MAX_RANK; u++) { - start[u] = 0; - stride[u] = edge_size; - count[u] = 1; - block[u] = edge_size; - } /* end for */ - - ret = H5Sselect_hyperslab(tgt_n_cube_sid, H5S_SELECT_AND, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -} /* test_select_hyper_checker_board_dr__select_checker_board() */ -#endif - -/**************************************************************** -** -** test_select_hyper_checker_board_dr__verify_data(): -** -** Examine the supplied buffer to see if it contains the -** expected data. Return true if it does, and false -** otherwise. -** -** The supplied buffer is presumed to contain the results -** of read or writing a checkerboard selection of an -** n-cube, or a checkerboard selection of an m (1 <= m < n) -** dimensional slice through an n-cube parallel to the -** fastest changing indices. -** -** It is further presumed that the buffer was zeroed before -** the read, and that the n-cube was initialize with the -** natural numbers listed in order from the origin along -** the fastest changing axis. -** -** Thus for a 10x10x10 3-cube, the value stored in location -** (x, y, z) (assuming that z is the fastest changing index -** and x the slowest) is assumed to be: -** -** (10 * 10 * x) + (10 * y) + z -** -** Thus, if the buffer contains the result of reading a -** checker board selection of a 10x10x10 3-cube, location -** (x, y, z) will contain zero if it is not in a checker, -** and 100x + 10y + z if (x, y, z) is in a checker. -** -** If the buffer contains the result of reading a 3 -** dimensional slice (parallel to the three fastest changing -** indices) through an n cube (n > 3), then the expected -** values in the buffer will be the same, save that we will -** add a constant determined by the origin of the 3-cube -** in the n-cube. -** -** Finally, the function presumes that the first element -** of the buffer resides either at the origin of either -** a selected or an unselected checker. -** -****************************************************************/ -#if 0 -H5_ATTR_PURE static bool -test_select_hyper_checker_board_dr__verify_data(uint16_t *buf_ptr, unsigned rank, unsigned edge_size, - unsigned checker_edge_size, uint16_t first_expected_val, - bool buf_starts_in_checker) -{ - bool good_data = true; - bool in_checker; - bool start_in_checker[5]; - uint16_t expected_value; - uint16_t *val_ptr; - unsigned i, j, k, l, m; /* to track position in n-cube */ - unsigned v, w, x, y, z; /* to track position in checker */ - const unsigned test_max_rank = 5; /* code changes needed if this is increased */ - - assert(buf_ptr != NULL); - assert(0 < rank); - assert(rank <= test_max_rank); - assert(edge_size >= 6); - assert(0 < checker_edge_size); - assert(checker_edge_size <= edge_size); - assert(test_max_rank <= SS_DR_MAX_RANK); - - val_ptr = buf_ptr; - expected_value = first_expected_val; - - i = 0; - v = 0; - start_in_checker[0] = buf_starts_in_checker; - do { - if (v >= checker_edge_size) { - start_in_checker[0] = !start_in_checker[0]; - v = 0; - } /* end if */ - - j = 0; - w = 0; - start_in_checker[1] = start_in_checker[0]; - do { - if (w >= checker_edge_size) { - start_in_checker[1] = !start_in_checker[1]; - w = 0; - } /* end if */ - - k = 0; - x = 0; - start_in_checker[2] = start_in_checker[1]; - do { - if (x >= checker_edge_size) { - start_in_checker[2] = !start_in_checker[2]; - x = 0; - } /* end if */ - - l = 0; - y = 0; - start_in_checker[3] = start_in_checker[2]; - do { - if (y >= checker_edge_size) { - start_in_checker[3] = !start_in_checker[3]; - y = 0; - } /* end if */ - - m = 0; - z = 0; - in_checker = start_in_checker[3]; - do { - if (z >= checker_edge_size) { - in_checker = !in_checker; - z = 0; - } /* end if */ - - if (in_checker) { - if (*val_ptr != expected_value) - good_data = false; - } /* end if */ - else { - if (*val_ptr != 0) - good_data = false; - } /* end else */ - - val_ptr++; - expected_value++; - - m++; - z++; - } while ((rank >= (test_max_rank - 4)) && (m < edge_size)); - l++; - y++; - } while ((rank >= (test_max_rank - 3)) && (l < edge_size)); - k++; - x++; - } while ((rank >= (test_max_rank - 2)) && (k < edge_size)); - j++; - w++; - } while ((rank >= (test_max_rank - 1)) && (j < edge_size)); - i++; - v++; - } while ((rank >= test_max_rank) && (i < edge_size)); - - return (good_data); -} /* test_select_hyper_checker_board_dr__verify_data() */ -#endif - -/**************************************************************** -** -** test_select_hyper_checker_board_dr__run_test(): Test H5S -** (dataspace) selection code with checker board source and -** target selections having different ranks but the same -** shape. We have already tested H5Sselect_shape_same in -** isolation, so now we try to do I/O. -** -****************************************************************/ -#if 0 -static void -test_select_hyper_checker_board_dr__run_test(int test_num, const uint16_t *cube_buf, const uint16_t *zero_buf, - unsigned edge_size, unsigned checker_edge_size, - unsigned chunk_edge_size, unsigned small_rank, - unsigned large_rank, hid_t dset_type, hid_t xfer_plist) -{ - bool data_ok; - hid_t fapl; /* File access property list */ - hid_t fid; /* HDF5 File IDs */ - hid_t full_small_cube_sid; /* Dataspace for small cube w/all selection */ - hid_t mem_small_cube_sid; - hid_t file_small_cube_sid; - hid_t full_large_cube_sid; /* Dataspace for large cube w/all selection */ - hid_t mem_large_cube_sid; - hid_t file_large_cube_sid; - hid_t small_cube_dcpl_id = H5P_DEFAULT; /* DCPL for small cube dataset */ - hid_t large_cube_dcpl_id = H5P_DEFAULT; /* DCPL for large cube dataset */ - hid_t small_cube_dataset; /* Dataset ID */ - hid_t large_cube_dataset; /* Dataset ID */ - unsigned small_rank_offset; /* Rank offset of slice */ - const unsigned test_max_rank = 5; /* must update code if this changes */ - size_t start_index; /* Offset within buffer to begin inspecting */ - size_t stop_index; /* Offset within buffer to end inspecting */ - uint16_t expected_value; - uint16_t *small_cube_buf_1; - uint16_t *large_cube_buf_1; - uint16_t *ptr_1; - size_t small_cube_size; /* Number of elements in small cube */ - size_t large_cube_size; /* Number of elements in large cube */ - hsize_t dims[SS_DR_MAX_RANK]; - hsize_t chunk_dims[SS_DR_MAX_RANK]; - hsize_t sel_start[SS_DR_MAX_RANK]; - unsigned u, v, w, x; /* Local index variables */ - size_t s; /* Local index variable */ - htri_t check; /* Shape comparison return value */ - herr_t ret; /* Generic return value */ - - MESSAGE(7, ("\tn-cube slice through m-cube I/O test %d.\n", test_num)); - MESSAGE(7, ("\tranks = %d/%d, edge_size = %d, checker_edge_size = %d, chunk_edge_size = %d.\n", - small_rank, large_rank, edge_size, checker_edge_size, chunk_edge_size)); - - assert(edge_size >= 6); - assert(checker_edge_size > 0); - assert(checker_edge_size <= edge_size); - assert(edge_size >= chunk_edge_size); - assert((chunk_edge_size == 0) || (chunk_edge_size >= 3)); - assert(small_rank > 0); - assert(small_rank < large_rank); - assert(large_rank <= test_max_rank); - assert(test_max_rank <= SS_DR_MAX_RANK); - - /* Compute cube sizes */ - small_cube_size = large_cube_size = (size_t)1; - for (u = 0; u < large_rank; u++) { - if (u < small_rank) - small_cube_size *= (size_t)edge_size; - - large_cube_size *= (size_t)edge_size; - } /* end for */ - assert(large_cube_size < (size_t)(UINT_MAX)); - - small_rank_offset = test_max_rank - small_rank; - assert(small_rank_offset >= 1); - - /* also, at present, we use 16 bit values in this test -- - * hence the following assertion. Delete it if we convert - * to 32 bit values. - */ - assert(large_cube_size < (size_t)(64 * 1024)); - - /* Allocate & initialize buffers */ - small_cube_buf_1 = (uint16_t *)calloc(sizeof(uint16_t), small_cube_size); - CHECK_PTR(small_cube_buf_1, "calloc"); - large_cube_buf_1 = (uint16_t *)calloc(sizeof(uint16_t), large_cube_size); - CHECK_PTR(large_cube_buf_1, "calloc"); - - /* Create a dataset transfer property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Use the 'core' VFD for this test */ - ret = H5Pset_fapl_core(fapl, (size_t)(1024 * 1024), false); - CHECK(ret, FAIL, "H5Pset_fapl_core"); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Close file access property list */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* setup dims: */ - dims[0] = dims[1] = dims[2] = dims[3] = dims[4] = edge_size; - - /* Create small cube dataspaces */ - full_small_cube_sid = H5Screate_simple((int)small_rank, dims, NULL); - CHECK(full_small_cube_sid, FAIL, "H5Screate_simple"); - - mem_small_cube_sid = H5Screate_simple((int)small_rank, dims, NULL); - CHECK(mem_small_cube_sid, FAIL, "H5Screate_simple"); - - file_small_cube_sid = H5Screate_simple((int)small_rank, dims, NULL); - CHECK(file_small_cube_sid, FAIL, "H5Screate_simple"); - - /* Create large cube dataspace */ - full_large_cube_sid = H5Screate_simple((int)large_rank, dims, NULL); - CHECK(full_large_cube_sid, FAIL, "H5Screate_simple"); - - mem_large_cube_sid = H5Screate_simple((int)large_rank, dims, NULL); - CHECK(mem_large_cube_sid, FAIL, "H5Screate_simple"); - - file_large_cube_sid = H5Screate_simple((int)large_rank, dims, NULL); - CHECK(file_large_cube_sid, FAIL, "H5Screate_simple"); - - /* if chunk edge size is greater than zero, set up the small and - * large data set creation property lists to specify chunked - * datasets. - */ - if (chunk_edge_size > 0) { - chunk_dims[0] = chunk_dims[1] = chunk_dims[2] = chunk_dims[3] = chunk_dims[4] = chunk_edge_size; - - small_cube_dcpl_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(small_cube_dcpl_id, FAIL, "H5Pcreate"); - - ret = H5Pset_layout(small_cube_dcpl_id, H5D_CHUNKED); - CHECK(ret, FAIL, "H5Pset_layout"); - - ret = H5Pset_chunk(small_cube_dcpl_id, (int)small_rank, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - large_cube_dcpl_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(large_cube_dcpl_id, FAIL, "H5Pcreate"); - - ret = H5Pset_layout(large_cube_dcpl_id, H5D_CHUNKED); - CHECK(ret, FAIL, "H5Pset_layout"); - - ret = H5Pset_chunk(large_cube_dcpl_id, (int)large_rank, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - } /* end if */ - - /* create the small cube dataset */ - small_cube_dataset = H5Dcreate2(fid, "small_cube_dataset", dset_type, file_small_cube_sid, H5P_DEFAULT, - small_cube_dcpl_id, H5P_DEFAULT); - CHECK(small_cube_dataset, FAIL, "H5Dcreate2"); - - /* Close non-default small dataset DCPL */ - if (small_cube_dcpl_id != H5P_DEFAULT) { - ret = H5Pclose(small_cube_dcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - } /* end if */ - - /* create the large cube dataset */ - large_cube_dataset = H5Dcreate2(fid, "large_cube_dataset", dset_type, file_large_cube_sid, H5P_DEFAULT, - large_cube_dcpl_id, H5P_DEFAULT); - CHECK(large_cube_dataset, FAIL, "H5Dcreate2"); - - /* Close non-default large dataset DCPL */ - if (large_cube_dcpl_id != H5P_DEFAULT) { - ret = H5Pclose(large_cube_dcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - } /* end if */ - - /* write initial data to the on disk datasets */ - ret = H5Dwrite(small_cube_dataset, H5T_NATIVE_UINT16, full_small_cube_sid, full_small_cube_sid, - xfer_plist, cube_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Dwrite(large_cube_dataset, H5T_NATIVE_UINT16, full_large_cube_sid, full_large_cube_sid, - xfer_plist, cube_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* read initial small cube data from disk and verify that it is as expected. */ - ret = H5Dread(small_cube_dataset, H5T_NATIVE_UINT16, full_small_cube_sid, full_small_cube_sid, xfer_plist, - small_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - /* Check that the data is valid */ - verify_select_hyper_contig_dr__run_test(small_cube_buf_1, small_cube_size, edge_size, small_rank); - - /* read initial large cube data from disk and verify that it is as expected. */ - ret = H5Dread(large_cube_dataset, H5T_NATIVE_UINT16, full_large_cube_sid, full_large_cube_sid, xfer_plist, - large_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - /* Check that the data is valid */ - verify_select_hyper_contig_dr__run_test(large_cube_buf_1, large_cube_size, edge_size, large_rank); - - /* first, verify that we can read from disk correctly using selections - * of different rank that H5Sselect_shape_same() views as being of the - * same shape. - * - * Start by reading small_rank-D slice from the on disk large cube, and - * verifying that the data read is correct. Verify that H5Sselect_shape_same() - * returns true on the memory and file selections. - * - * The first step is to set up the needed checker board selection in the - * in memory small small cube - */ - - sel_start[0] = sel_start[1] = sel_start[2] = sel_start[3] = sel_start[4] = 0; - - test_select_hyper_checker_board_dr__select_checker_board(mem_small_cube_sid, small_rank, edge_size, - checker_edge_size, small_rank, sel_start); - - /* now read slices from the large, on-disk cube into the small cube. - * Note how we adjust sel_start only in the dimensions peculiar to the - * large cube. - */ - - u = 0; - do { - if (small_rank_offset > 0) - sel_start[0] = u; - - v = 0; - do { - if (small_rank_offset > 1) - sel_start[1] = v; - - w = 0; - do { - if (small_rank_offset > 2) - sel_start[2] = w; - - x = 0; - do { - if (small_rank_offset > 3) - sel_start[3] = x; - - /* we know that small_rank >= 1 and that large_rank > small_rank - * by the assertions at the head of this function. Thus no - * need for another inner loop. - */ - - assert((sel_start[0] == 0) || (0 < small_rank_offset)); - assert((sel_start[1] == 0) || (1 < small_rank_offset)); - assert((sel_start[2] == 0) || (2 < small_rank_offset)); - assert((sel_start[3] == 0) || (3 < small_rank_offset)); - assert((sel_start[4] == 0) || (4 < small_rank_offset)); - - test_select_hyper_checker_board_dr__select_checker_board( - file_large_cube_sid, large_rank, edge_size, checker_edge_size, small_rank, sel_start); - - /* verify that H5Sselect_shape_same() reports the two - * selections as having the same shape. - */ - check = H5Sselect_shape_same(mem_small_cube_sid, file_large_cube_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* zero the buffer that we will be using for reading */ - memset(small_cube_buf_1, 0, sizeof(*small_cube_buf_1) * small_cube_size); - - /* Read selection from disk */ - ret = H5Dread(large_cube_dataset, H5T_NATIVE_UINT16, mem_small_cube_sid, - file_large_cube_sid, xfer_plist, small_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - expected_value = (uint16_t)((u * edge_size * edge_size * edge_size * edge_size) + - (v * edge_size * edge_size * edge_size) + - (w * edge_size * edge_size) + (x * edge_size)); - - data_ok = test_select_hyper_checker_board_dr__verify_data(small_cube_buf_1, small_rank, - edge_size, checker_edge_size, - expected_value, (bool)true); - if (!data_ok) - TestErrPrintf("small cube read from largecube has bad data! Line=%d\n", __LINE__); - - x++; - } while ((large_rank >= (test_max_rank - 3)) && (small_rank <= (test_max_rank - 4)) && - (x < edge_size)); - w++; - } while ((large_rank >= (test_max_rank - 2)) && (small_rank <= (test_max_rank - 3)) && - (w < edge_size)); - v++; - } while ((large_rank >= (test_max_rank - 1)) && (small_rank <= (test_max_rank - 2)) && - (v < edge_size)); - u++; - } while ((large_rank >= test_max_rank) && (small_rank <= (test_max_rank - 1)) && (u < edge_size)); - - /* similarly, read the on disk small cube into slices through the in memory - * large cube, and verify that the correct data (and only the correct data) - * is read. - */ - - /* select a checker board in the file small cube dataspace */ - sel_start[0] = sel_start[1] = sel_start[2] = sel_start[3] = sel_start[4] = 0; - test_select_hyper_checker_board_dr__select_checker_board(file_small_cube_sid, small_rank, edge_size, - checker_edge_size, small_rank, sel_start); - - u = 0; - do { - if (0 < small_rank_offset) - sel_start[0] = u; - - v = 0; - do { - if (1 < small_rank_offset) - sel_start[1] = v; - - w = 0; - do { - if (2 < small_rank_offset) - sel_start[2] = w; - - x = 0; - do { - if (3 < small_rank_offset) - sel_start[3] = x; - - /* we know that small_rank >= 1 and that large_rank > small_rank - * by the assertions at the head of this function. Thus no - * need for another inner loop. - */ - - assert((sel_start[0] == 0) || (0 < small_rank_offset)); - assert((sel_start[1] == 0) || (1 < small_rank_offset)); - assert((sel_start[2] == 0) || (2 < small_rank_offset)); - assert((sel_start[3] == 0) || (3 < small_rank_offset)); - assert((sel_start[4] == 0) || (4 < small_rank_offset)); - - test_select_hyper_checker_board_dr__select_checker_board( - mem_large_cube_sid, large_rank, edge_size, checker_edge_size, small_rank, sel_start); - - /* verify that H5Sselect_shape_same() reports the two - * selections as having the same shape. - */ - check = H5Sselect_shape_same(file_small_cube_sid, mem_large_cube_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* zero out the in memory large cube */ - memset(large_cube_buf_1, 0, sizeof(*large_cube_buf_1) * large_cube_size); - - /* Read selection from disk */ - ret = H5Dread(small_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid, - file_small_cube_sid, xfer_plist, large_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - /* verify that the expected data and only the - * expected data was read. - */ - data_ok = true; - ptr_1 = large_cube_buf_1; - expected_value = 0; - start_index = (u * edge_size * edge_size * edge_size * edge_size) + - (v * edge_size * edge_size * edge_size) + (w * edge_size * edge_size) + - (x * edge_size); - stop_index = start_index + small_cube_size - 1; - - assert(start_index < stop_index); - assert(stop_index <= large_cube_size); - - /* verify that the large cube contains only zeros before the slice */ - for (s = 0; s < start_index; s++) { - if (*ptr_1 != 0) - data_ok = false; - ptr_1++; - } /* end for */ - assert(s == start_index); - - data_ok &= test_select_hyper_checker_board_dr__verify_data( - ptr_1, small_rank, edge_size, checker_edge_size, (uint16_t)0, (bool)true); - - ptr_1 += small_cube_size; - s += small_cube_size; - - assert(s == stop_index + 1); - - /* verify that the large cube contains only zeros after the slice */ - for (s = stop_index + 1; s < large_cube_size; s++) { - if (*ptr_1 != 0) - data_ok = false; - ptr_1++; - } /* end for */ - if (!data_ok) - TestErrPrintf("large cube read from small cube has bad data! Line=%d\n", __LINE__); - - x++; - } while ((large_rank >= (test_max_rank - 3)) && (small_rank <= (test_max_rank - 4)) && - (x < edge_size)); - w++; - } while ((large_rank >= (test_max_rank - 2)) && (small_rank <= (test_max_rank - 3)) && - (w < edge_size)); - v++; - } while ((large_rank >= (test_max_rank - 1)) && (small_rank <= (test_max_rank - 2)) && - (v < edge_size)); - u++; - } while ((large_rank >= test_max_rank) && (small_rank <= (test_max_rank - 1)) && (u < edge_size)); - - /* now we go in the opposite direction, verifying that we can write - * from memory to file using selections of different rank that - * H5Sselect_shape_same() views as being of the same shape. - * - * Start by writing small_rank D slices from the in memory large cube, to - * the the on disk small cube dataset. After each write, read the small - * cube dataset back from disk, and verify that it contains the expected - * data. Verify that H5Sselect_shape_same() returns true on the - * memory and file selections. - */ - - /* select a checker board in the file small cube dataspace */ - sel_start[0] = sel_start[1] = sel_start[2] = sel_start[3] = sel_start[4] = 0; - test_select_hyper_checker_board_dr__select_checker_board(file_small_cube_sid, small_rank, edge_size, - checker_edge_size, small_rank, sel_start); - - u = 0; - do { - if (small_rank_offset > 0) - sel_start[0] = u; - - v = 0; - do { - if (small_rank_offset > 1) - sel_start[1] = v; - - w = 0; - do { - if (small_rank_offset > 2) - sel_start[2] = w; - - x = 0; - do { - if (small_rank_offset > 3) - sel_start[3] = x; - - /* zero out the on disk small cube */ - ret = H5Dwrite(small_cube_dataset, H5T_NATIVE_UINT16, full_small_cube_sid, - full_small_cube_sid, xfer_plist, zero_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* we know that small_rank >= 1 and that large_rank > small_rank - * by the assertions at the head of this function. Thus no - * need for another inner loop. - */ - - assert((sel_start[0] == 0) || (0 < small_rank_offset)); - assert((sel_start[1] == 0) || (1 < small_rank_offset)); - assert((sel_start[2] == 0) || (2 < small_rank_offset)); - assert((sel_start[3] == 0) || (3 < small_rank_offset)); - assert((sel_start[4] == 0) || (4 < small_rank_offset)); - - test_select_hyper_checker_board_dr__select_checker_board( - mem_large_cube_sid, large_rank, edge_size, checker_edge_size, small_rank, sel_start); - - /* verify that H5Sselect_shape_same() reports the two - * selections as having the same shape. - */ - check = H5Sselect_shape_same(file_small_cube_sid, mem_large_cube_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* write the slice from the in memory large cube to the - * on disk small cube - */ - ret = H5Dwrite(small_cube_dataset, H5T_NATIVE_UINT16, mem_large_cube_sid, - file_small_cube_sid, xfer_plist, cube_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* zero the buffer that we will be using for reading */ - memset(small_cube_buf_1, 0, sizeof(*small_cube_buf_1) * small_cube_size); - - /* read the on disk small cube into memory */ - ret = H5Dread(small_cube_dataset, H5T_NATIVE_UINT16, full_small_cube_sid, - full_small_cube_sid, xfer_plist, small_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - expected_value = (uint16_t)((u * edge_size * edge_size * edge_size * edge_size) + - (v * edge_size * edge_size * edge_size) + - (w * edge_size * edge_size) + (x * edge_size)); - - data_ok = test_select_hyper_checker_board_dr__verify_data(small_cube_buf_1, small_rank, - edge_size, checker_edge_size, - expected_value, (bool)true); - if (!data_ok) - TestErrPrintf("small cube read from largecube has bad data! Line=%d\n", __LINE__); - - x++; - } while ((large_rank >= (test_max_rank - 3)) && (small_rank <= (test_max_rank - 4)) && - (x < edge_size)); - w++; - } while ((large_rank >= (test_max_rank - 2)) && (small_rank <= (test_max_rank - 3)) && - (w < edge_size)); - v++; - } while ((large_rank >= (test_max_rank - 1)) && (small_rank <= (test_max_rank - 2)) && - (v < edge_size)); - u++; - } while ((large_rank >= test_max_rank) && (small_rank <= (test_max_rank - 1)) && (u < edge_size)); - - /* Now write checker board selections of the entries in memory - * small cube to slices of the on disk cube. After each write, - * read the on disk large cube * into memory, and verify that - * it contains the expected * data. Verify that - * H5Sselect_shape_same() returns true on the memory and file - * selections. - */ - - /* select a checker board in the in memory small cube dataspace */ - sel_start[0] = sel_start[1] = sel_start[2] = sel_start[3] = sel_start[4] = 0; - test_select_hyper_checker_board_dr__select_checker_board(mem_small_cube_sid, small_rank, edge_size, - checker_edge_size, small_rank, sel_start); - - u = 0; - do { - if (small_rank_offset > 0) - sel_start[0] = u; - - v = 0; - do { - if (small_rank_offset > 1) - sel_start[1] = v; - - w = 0; - do { - if (small_rank_offset > 2) - sel_start[2] = w; - - x = 0; - do { - if (small_rank_offset > 3) - sel_start[3] = x; - - /* zero out the on disk cube */ - ret = H5Dwrite(large_cube_dataset, H5T_NATIVE_USHORT, full_large_cube_sid, - full_large_cube_sid, xfer_plist, zero_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* we know that small_rank >= 1 and that large_rank > small_rank - * by the assertions at the head of this function. Thus no - * need for another inner loop. - */ - - assert((sel_start[0] == 0) || (0 < small_rank_offset)); - assert((sel_start[1] == 0) || (1 < small_rank_offset)); - assert((sel_start[2] == 0) || (2 < small_rank_offset)); - assert((sel_start[3] == 0) || (3 < small_rank_offset)); - assert((sel_start[4] == 0) || (4 < small_rank_offset)); - - test_select_hyper_checker_board_dr__select_checker_board( - file_large_cube_sid, large_rank, edge_size, checker_edge_size, small_rank, sel_start); - - /* verify that H5Sselect_shape_same() reports the two - * selections as having the same shape. - */ - check = H5Sselect_shape_same(file_large_cube_sid, mem_small_cube_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* write the checker board selection of the in memory - * small cube to a slice through the on disk large - * cube. - */ - ret = H5Dwrite(large_cube_dataset, H5T_NATIVE_UINT16, mem_small_cube_sid, - file_large_cube_sid, xfer_plist, cube_buf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* zero out the in memory large cube */ - memset(large_cube_buf_1, 0, sizeof(*large_cube_buf_1) * large_cube_size); - - /* read the on disk large cube into memory */ - ret = H5Dread(large_cube_dataset, H5T_NATIVE_UINT16, full_large_cube_sid, - full_large_cube_sid, xfer_plist, large_cube_buf_1); - CHECK(ret, FAIL, "H5Dread"); - - /* verify that the expected data and only the - * expected data was written to the on disk large - * cube. - */ - data_ok = true; - ptr_1 = large_cube_buf_1; - expected_value = 0; - start_index = (u * edge_size * edge_size * edge_size * edge_size) + - (v * edge_size * edge_size * edge_size) + (w * edge_size * edge_size) + - (x * edge_size); - stop_index = start_index + small_cube_size - 1; - - assert(start_index < stop_index); - assert(stop_index <= large_cube_size); - - /* verify that the large cube contains only zeros before the slice */ - for (s = 0; s < start_index; s++) { - if (*ptr_1 != 0) - data_ok = false; - ptr_1++; - } /* end for */ - assert(s == start_index); - - /* verify that the slice contains the expected data */ - data_ok &= test_select_hyper_checker_board_dr__verify_data( - ptr_1, small_rank, edge_size, checker_edge_size, (uint16_t)0, (bool)true); - - ptr_1 += small_cube_size; - s += small_cube_size; - - assert(s == stop_index + 1); - - /* verify that the large cube contains only zeros after the slice */ - for (s = stop_index + 1; s < large_cube_size; s++) { - if (*ptr_1 != 0) - data_ok = false; - ptr_1++; - } /* end for */ - if (!data_ok) - TestErrPrintf("large cube written from small cube has bad data! Line=%d\n", __LINE__); - - x++; - } while ((large_rank >= (test_max_rank - 3)) && (small_rank <= (test_max_rank - 4)) && - (x < edge_size)); - w++; - } while ((large_rank >= (test_max_rank - 2)) && (small_rank <= (test_max_rank - 3)) && - (w < edge_size)); - v++; - } while ((large_rank >= (test_max_rank - 1)) && (small_rank <= (test_max_rank - 2)) && - (v < edge_size)); - u++; - } while ((large_rank >= test_max_rank) && (small_rank <= (test_max_rank - 1)) && (u < edge_size)); - - /* Close memory dataspaces */ - ret = H5Sclose(full_small_cube_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(full_large_cube_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(mem_small_cube_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(mem_large_cube_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(file_small_cube_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(file_large_cube_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Datasets */ - ret = H5Dclose(small_cube_dataset); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Dclose(large_cube_dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(small_cube_buf_1); - free(large_cube_buf_1); - -} /* test_select_hyper_checker_board_dr__run_test() */ -#endif -/**************************************************************** -** -** test_select_hyper_checker_board_dr(): Test H5S (dataspace) -** selection code with checkerboard source and target having -** different ranks but the same shape. We have already -** tested H5Sselect_shape_same in isolation, so now we try to do -** I/O. -** -** This is just an initial smoke check, so we will work -** with a slice through a cube only. -** -****************************************************************/ -#if 0 -static void -test_select_hyper_checker_board_dr(hid_t dset_type, hid_t xfer_plist) -{ - uint16_t *cube_buf; /* Buffer for writing cube data */ - uint16_t *cube_ptr; /* Temporary pointer into cube data */ - uint16_t *zero_buf; /* Buffer for writing zeroed cube data */ - int test_num = 0; - unsigned checker_edge_size = 2; /* Size of checkerboard dimension */ - unsigned chunk_edge_size; /* Size of chunk's dataspace dimensions */ - unsigned edge_size = 6; /* Size of dataset's dataspace dimensions */ - unsigned small_rank; /* Current rank of small dataset */ - unsigned large_rank; /* Current rank of large dataset */ - unsigned max_rank = 5; /* Max. rank to use */ - size_t max_cube_size; /* Max. number of elements in largest cube */ - size_t s; /* Local index variable */ - unsigned u; /* Local index variable */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Checker Board Hyperslabs With Different Rank I/O Functionality\n")); - - /* Compute max. cube size */ - max_cube_size = (size_t)1; - for (u = 0; u < max_rank; u++) - max_cube_size *= (size_t)(edge_size + 1); - - /* Allocate cube buffer for writing values */ - cube_buf = (uint16_t *)malloc(sizeof(uint16_t) * max_cube_size); - CHECK_PTR(cube_buf, "malloc"); - - /* Initialize the cube buffer */ - cube_ptr = cube_buf; - for (s = 0; s < max_cube_size; s++) - *cube_ptr++ = (uint16_t)s; - - /* Allocate cube buffer for zeroing values on disk */ - zero_buf = (uint16_t *)calloc(sizeof(uint16_t), max_cube_size); - CHECK_PTR(zero_buf, "calloc"); - - for (large_rank = 1; large_rank <= max_rank; large_rank++) { - for (small_rank = 1; small_rank < large_rank; small_rank++) { - chunk_edge_size = 0; - test_select_hyper_checker_board_dr__run_test(test_num, cube_buf, zero_buf, edge_size, - checker_edge_size, chunk_edge_size, small_rank, - large_rank, dset_type, xfer_plist); - test_num++; - - test_select_hyper_checker_board_dr__run_test(test_num, cube_buf, zero_buf, edge_size + 1, - checker_edge_size, chunk_edge_size, small_rank, - large_rank, dset_type, xfer_plist); - test_num++; - - chunk_edge_size = 3; - test_select_hyper_checker_board_dr__run_test(test_num, cube_buf, zero_buf, edge_size, - checker_edge_size, chunk_edge_size, small_rank, - large_rank, dset_type, xfer_plist); - test_num++; - - test_select_hyper_checker_board_dr__run_test(test_num, cube_buf, zero_buf, edge_size + 1, - checker_edge_size, chunk_edge_size, small_rank, - large_rank, dset_type, xfer_plist); - test_num++; - } /* for loop on small rank */ - } /* for loop on large rank */ - - free(cube_buf); - free(zero_buf); - -} /* test_select_hyper_checker_board_dr() */ -#endif -/**************************************************************** -** -** test_select_hyper_copy(): Test H5S (dataspace) selection code. -** Tests copying hyperslab selections -** -****************************************************************/ -static void -test_select_hyper_copy(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t data1, data2; /* Dataset IDs */ - hid_t sid1, sid2, sid3; /* Dataspace IDs */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t start[SPACE1_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE1_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE1_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE1_RANK]; /* Block size of hyperslab */ - uint16_t *wbuf, /* buffer to write to disk */ - *rbuf, /* 1st buffer read from disk */ - *rbuf2, /* 2nd buffer read from disk */ - *tbuf; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslabs with Strides Functionality\n")); - - /* Allocate write & read buffers */ - wbuf = (uint16_t *)malloc(sizeof(uint16_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint16_t *)calloc(sizeof(uint16_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf, "calloc"); - rbuf2 = (uint16_t *)calloc(sizeof(uint16_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf2, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint16_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 2x3x3 count with a stride of 2x4x3 & 1x2x2 block hyperslab for disk dataset */ - start[0] = 0; - start[1] = 0; - start[2] = 0; - stride[0] = 2; - stride[1] = 4; - stride[2] = 3; - count[0] = 2; - count[1] = 3; - count[2] = 3; - block[0] = 1; - block[1] = 2; - block[2] = 2; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 4x2 count with a stride of 5x5 & 3x3 block hyperslab for memory dataset */ - start[0] = 1; - start[1] = 1; - stride[0] = 5; - stride[1] = 5; - count[0] = 4; - count[1] = 2; - block[0] = 3; - block[1] = 3; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Make a copy of the dataspace to write */ - sid3 = H5Scopy(sid2); - CHECK(sid3, FAIL, "H5Scopy"); - - /* Create a dataset */ - data1 = H5Dcreate2(fid1, SPACE1_NAME, H5T_STD_U16LE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(data1, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(data1, H5T_STD_U16LE, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create another dataset */ - data2 = H5Dcreate2(fid1, SPACE2_NAME, H5T_STD_U16LE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(data2, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(data2, H5T_STD_U16LE, sid3, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 3x4 count with a stride of 4x4 & 2x3 block hyperslab for memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 4; - stride[1] = 4; - count[0] = 3; - count[1] = 4; - block[0] = 2; - block[1] = 3; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Make a copy of the dataspace to read */ - sid3 = H5Scopy(sid2); - CHECK(sid3, FAIL, "H5Scopy"); - - /* Read selection from disk */ - ret = H5Dread(data1, H5T_STD_U16LE, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Read selection from disk */ - ret = H5Dread(data2, H5T_STD_U16LE, sid3, sid1, H5P_DEFAULT, rbuf2); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - if (memcmp(rbuf, rbuf2, sizeof(uint16_t) * SPACE3_DIM1 * SPACE3_DIM2) != 0) - TestErrPrintf("hyperslab values don't match! Line=%d\n", __LINE__); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close 2nd memory dataspace */ - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(data1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close Dataset */ - ret = H5Dclose(data2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); - free(rbuf2); -} /* test_select_hyper_copy() */ - -/**************************************************************** -** -** test_select_point_copy(): Test H5S (dataspace) selection code. -** Tests copying point selections -** -****************************************************************/ -static void -test_select_point_copy(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t data1, data2; /* Dataset IDs */ - hid_t sid1, sid2, sid3; /* Dataspace IDs */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t coord1[POINT1_NPOINTS][SPACE1_RANK]; /* Coordinates for point selection */ - hsize_t coord2[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */ - hsize_t coord3[POINT1_NPOINTS][SPACE3_RANK]; /* Coordinates for point selection */ - uint16_t *wbuf, /* buffer to write to disk */ - *rbuf, /* 1st buffer read from disk */ - *rbuf2, /* 2nd buffer read from disk */ - *tbuf; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslabs with Strides Functionality\n")); - - /* Allocate write & read buffers */ - wbuf = (uint16_t *)malloc(sizeof(uint16_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint16_t *)calloc(sizeof(uint16_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf, "calloc"); - rbuf2 = (uint16_t *)calloc(sizeof(uint16_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf2, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint16_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select sequence of ten points for disk dataset */ - coord1[0][0] = 0; - coord1[0][1] = 10; - coord1[0][2] = 5; - coord1[1][0] = 1; - coord1[1][1] = 2; - coord1[1][2] = 7; - coord1[2][0] = 2; - coord1[2][1] = 4; - coord1[2][2] = 9; - coord1[3][0] = 0; - coord1[3][1] = 6; - coord1[3][2] = 11; - coord1[4][0] = 1; - coord1[4][1] = 8; - coord1[4][2] = 13; - coord1[5][0] = 2; - coord1[5][1] = 12; - coord1[5][2] = 0; - coord1[6][0] = 0; - coord1[6][1] = 14; - coord1[6][2] = 2; - coord1[7][0] = 1; - coord1[7][1] = 0; - coord1[7][2] = 4; - coord1[8][0] = 2; - coord1[8][1] = 1; - coord1[8][2] = 6; - coord1[9][0] = 0; - coord1[9][1] = 3; - coord1[9][2] = 8; - ret = H5Sselect_elements(sid1, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Select sequence of ten points for write dataset */ - coord2[0][0] = 12; - coord2[0][1] = 3; - coord2[1][0] = 15; - coord2[1][1] = 13; - coord2[2][0] = 7; - coord2[2][1] = 25; - coord2[3][0] = 0; - coord2[3][1] = 6; - coord2[4][0] = 13; - coord2[4][1] = 0; - coord2[5][0] = 24; - coord2[5][1] = 11; - coord2[6][0] = 12; - coord2[6][1] = 21; - coord2[7][0] = 29; - coord2[7][1] = 4; - coord2[8][0] = 8; - coord2[8][1] = 8; - coord2[9][0] = 19; - coord2[9][1] = 17; - ret = H5Sselect_elements(sid2, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord2); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Make a copy of the dataspace to write */ - sid3 = H5Scopy(sid2); - CHECK(sid3, FAIL, "H5Scopy"); - - /* Create a dataset */ - data1 = H5Dcreate2(fid1, SPACE1_NAME, H5T_STD_U16LE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(data1, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(data1, H5T_STD_U16LE, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create another dataset */ - data2 = H5Dcreate2(fid1, SPACE2_NAME, H5T_STD_U16LE, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(data2, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(data2, H5T_STD_U16LE, sid3, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select sequence of points for read dataset */ - coord3[0][0] = 0; - coord3[0][1] = 2; - coord3[1][0] = 4; - coord3[1][1] = 8; - coord3[2][0] = 13; - coord3[2][1] = 13; - coord3[3][0] = 14; - coord3[3][1] = 25; - coord3[4][0] = 7; - coord3[4][1] = 9; - coord3[5][0] = 2; - coord3[5][1] = 0; - coord3[6][0] = 9; - coord3[6][1] = 19; - coord3[7][0] = 1; - coord3[7][1] = 22; - coord3[8][0] = 12; - coord3[8][1] = 21; - coord3[9][0] = 11; - coord3[9][1] = 6; - ret = H5Sselect_elements(sid2, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord3); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Make a copy of the dataspace to read */ - sid3 = H5Scopy(sid2); - CHECK(sid3, FAIL, "H5Scopy"); - - /* Read selection from disk */ - ret = H5Dread(data1, H5T_STD_U16LE, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Read selection from disk */ - ret = H5Dread(data2, H5T_STD_U16LE, sid3, sid1, H5P_DEFAULT, rbuf2); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - if (memcmp(rbuf, rbuf2, sizeof(uint16_t) * SPACE3_DIM1 * SPACE3_DIM2) != 0) - TestErrPrintf("point values don't match!\n"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close 2nd memory dataspace */ - ret = H5Sclose(sid3); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(data1); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close Dataset */ - ret = H5Dclose(data2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); - free(rbuf2); -} /* test_select_point_copy() */ - -/**************************************************************** -** -** test_select_hyper_offset(): Test basic H5S (dataspace) selection code. -** Tests hyperslabs of various sizes and dimensionalities with selection -** offsets. -** -****************************************************************/ -static void -test_select_hyper_offset(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t start[SPACE1_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE1_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE1_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE1_RANK]; /* Block size of hyperslab */ - hssize_t offset[SPACE1_RANK]; /* Offset of selection */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - htri_t valid; /* Generic boolean return value */ - H5S_class_t ext_type; /* Extent type */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslab Selection Functions with Offsets\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Verify extent type */ - ext_type = H5Sget_simple_extent_type(sid1); - VERIFY(ext_type, H5S_SIMPLE, "H5Sget_simple_extent_type"); - - /* Select 2x15x13 hyperslab for disk dataset */ - start[0] = 1; - start[1] = 0; - start[2] = 0; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 2; - count[1] = 15; - count[2] = 13; - block[0] = 1; - block[1] = 1; - block[2] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Check a valid offset */ - offset[0] = -1; - offset[1] = 0; - offset[2] = 0; - ret = H5Soffset_simple(sid1, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - valid = H5Sselect_valid(sid1); - VERIFY(valid, true, "H5Sselect_valid"); - - /* Check an invalid offset */ - offset[0] = 10; - offset[1] = 0; - offset[2] = 0; - ret = H5Soffset_simple(sid1, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - valid = H5Sselect_valid(sid1); - VERIFY(valid, false, "H5Sselect_valid"); - - /* Reset offset */ - offset[0] = 0; - offset[1] = 0; - offset[2] = 0; - ret = H5Soffset_simple(sid1, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - valid = H5Sselect_valid(sid1); - VERIFY(valid, true, "H5Sselect_valid"); - - /* Select 15x26 hyperslab for memory dataset */ - start[0] = 15; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Choose a valid offset for the memory dataspace */ - offset[0] = -10; - offset[1] = 0; - ret = H5Soffset_simple(sid2, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - valid = H5Sselect_valid(sid2); - VERIFY(valid, true, "H5Sselect_valid"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 15x26 hyperslab for reading memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - for (i = 0; i < SPACE3_DIM1; i++) { - tbuf = wbuf + ((i + 5) * SPACE2_DIM2); - tbuf2 = rbuf + (i * SPACE3_DIM2); - for (j = 0; j < SPACE3_DIM2; j++, tbuf++, tbuf2++) { - if (*tbuf != *tbuf2) - TestErrPrintf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%u, *tbuf2=%u\n", - __LINE__, i, j, (unsigned)*tbuf, (unsigned)*tbuf2); - } /* end for */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_offset() */ - -/**************************************************************** -** -** test_select_hyper_offset2(): Test basic H5S (dataspace) selection code. -** Tests optimized hyperslab I/O with selection offsets. -** -****************************************************************/ -static void -test_select_hyper_offset2(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE7_DIM1, SPACE7_DIM2}; - hsize_t dims2[] = {SPACE7_DIM1, SPACE7_DIM2}; - hsize_t start[SPACE7_RANK]; /* Starting location of hyperslab */ - hsize_t count[SPACE7_RANK]; /* Element count of hyperslab */ - hssize_t offset[SPACE7_RANK]; /* Offset of selection */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - htri_t valid; /* Generic boolean return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing More Hyperslab Selection Functions with Offsets\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE7_DIM1 * SPACE7_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE7_DIM1; i++) - for (j = 0; j < SPACE7_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE7_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE7_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE7_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 4x10 hyperslab for disk dataset */ - start[0] = 1; - start[1] = 0; - count[0] = 4; - count[1] = 10; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Set offset */ - offset[0] = 1; - offset[1] = 0; - ret = H5Soffset_simple(sid1, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - valid = H5Sselect_valid(sid1); - VERIFY(valid, true, "H5Sselect_valid"); - - /* Select 4x10 hyperslab for memory dataset */ - start[0] = 1; - start[1] = 0; - count[0] = 4; - count[1] = 10; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Choose a valid offset for the memory dataspace */ - offset[0] = 2; - offset[1] = 0; - ret = H5Soffset_simple(sid2, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - valid = H5Sselect_valid(sid2); - VERIFY(valid, true, "H5Sselect_valid"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE7_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - for (i = 0; i < 4; i++) { - tbuf = wbuf + ((i + 3) * SPACE7_DIM2); - tbuf2 = rbuf + ((i + 3) * SPACE7_DIM2); - for (j = 0; j < SPACE7_DIM2; j++, tbuf++, tbuf2++) { - if (*tbuf != *tbuf2) - TestErrPrintf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%u, *tbuf2=%u\n", - __LINE__, i, j, (unsigned)*tbuf, (unsigned)*tbuf2); - } /* end for */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_offset2() */ - -/**************************************************************** -** -** test_select_point_offset(): Test basic H5S (dataspace) selection code. -** Tests element selections between dataspaces of various sizes -** and dimensionalities with selection offsets. -** -****************************************************************/ -static void -test_select_point_offset(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t coord1[POINT1_NPOINTS][SPACE1_RANK]; /* Coordinates for point selection */ - hsize_t coord2[POINT1_NPOINTS][SPACE2_RANK]; /* Coordinates for point selection */ - hsize_t coord3[POINT1_NPOINTS][SPACE3_RANK]; /* Coordinates for point selection */ - hssize_t offset[SPACE1_RANK]; /* Offset of selection */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - htri_t valid; /* Generic boolean return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Element Selection Functions\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for write buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select sequence of ten points for disk dataset */ - coord1[0][0] = 0; - coord1[0][1] = 10; - coord1[0][2] = 5; - coord1[1][0] = 1; - coord1[1][1] = 2; - coord1[1][2] = 7; - coord1[2][0] = 2; - coord1[2][1] = 4; - coord1[2][2] = 9; - coord1[3][0] = 0; - coord1[3][1] = 6; - coord1[3][2] = 11; - coord1[4][0] = 1; - coord1[4][1] = 8; - coord1[4][2] = 12; - coord1[5][0] = 2; - coord1[5][1] = 12; - coord1[5][2] = 0; - coord1[6][0] = 0; - coord1[6][1] = 14; - coord1[6][2] = 2; - coord1[7][0] = 1; - coord1[7][1] = 0; - coord1[7][2] = 4; - coord1[8][0] = 2; - coord1[8][1] = 1; - coord1[8][2] = 6; - coord1[9][0] = 0; - coord1[9][1] = 3; - coord1[9][2] = 8; - ret = H5Sselect_elements(sid1, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Check a valid offset */ - offset[0] = 0; - offset[1] = 0; - offset[2] = 1; - ret = H5Soffset_simple(sid1, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - valid = H5Sselect_valid(sid1); - VERIFY(valid, true, "H5Sselect_valid"); - - /* Check an invalid offset */ - offset[0] = 10; - offset[1] = 0; - offset[2] = 0; - ret = H5Soffset_simple(sid1, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - valid = H5Sselect_valid(sid1); - VERIFY(valid, false, "H5Sselect_valid"); - - /* Reset offset */ - offset[0] = 0; - offset[1] = 0; - offset[2] = 0; - ret = H5Soffset_simple(sid1, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - valid = H5Sselect_valid(sid1); - VERIFY(valid, true, "H5Sselect_valid"); - - /* Select sequence of ten points for write dataset */ - coord2[0][0] = 12; - coord2[0][1] = 3; - coord2[1][0] = 15; - coord2[1][1] = 13; - coord2[2][0] = 7; - coord2[2][1] = 24; - coord2[3][0] = 0; - coord2[3][1] = 6; - coord2[4][0] = 13; - coord2[4][1] = 0; - coord2[5][0] = 24; - coord2[5][1] = 11; - coord2[6][0] = 12; - coord2[6][1] = 21; - coord2[7][0] = 23; - coord2[7][1] = 4; - coord2[8][0] = 8; - coord2[8][1] = 8; - coord2[9][0] = 19; - coord2[9][1] = 17; - ret = H5Sselect_elements(sid2, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord2); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Choose a valid offset for the memory dataspace */ - offset[0] = 5; - offset[1] = 1; - ret = H5Soffset_simple(sid2, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - valid = H5Sselect_valid(sid2); - VERIFY(valid, true, "H5Sselect_valid"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select sequence of points for read dataset */ - coord3[0][0] = 0; - coord3[0][1] = 2; - coord3[1][0] = 4; - coord3[1][1] = 8; - coord3[2][0] = 13; - coord3[2][1] = 13; - coord3[3][0] = 14; - coord3[3][1] = 25; - coord3[4][0] = 7; - coord3[4][1] = 9; - coord3[5][0] = 2; - coord3[5][1] = 0; - coord3[6][0] = 9; - coord3[6][1] = 19; - coord3[7][0] = 1; - coord3[7][1] = 22; - coord3[8][0] = 12; - coord3[8][1] = 21; - coord3[9][0] = 11; - coord3[9][1] = 6; - ret = H5Sselect_elements(sid2, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord3); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - for (i = 0; i < POINT1_NPOINTS; i++) { - tbuf = wbuf + ((coord2[i][0] + (hsize_t)offset[0]) * SPACE2_DIM2) + coord2[i][1] + (hsize_t)offset[1]; - tbuf2 = rbuf + (coord3[i][0] * SPACE3_DIM2) + coord3[i][1]; - if (*tbuf != *tbuf2) - TestErrPrintf("element values don't match!, i=%d\n", i); - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_point_offset() */ - -/**************************************************************** -** -** test_select_hyper_union(): Test basic H5S (dataspace) selection code. -** Tests unions of hyperslabs of various sizes and dimensionalities. -** -****************************************************************/ -static void -test_select_hyper_union(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t xfer; /* Dataset Transfer Property List ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t start[SPACE1_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE1_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE1_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE1_RANK]; /* Block size of hyperslab */ - size_t begin[SPACE2_DIM1] = /* Offset within irregular block */ - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* First ten rows start at offset 0 */ - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; /* Next eighteen rows start at offset 5 */ - size_t len[SPACE2_DIM1] = /* Len of each row within irregular block */ - {10, 10, 10, 10, 10, 10, 10, 10, /* First eight rows are 10 long */ - 20, 20, /* Next two rows are 20 long */ - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}; /* Next eighteen rows are 15 long */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - hssize_t npoints; /* Number of elements in selection */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslab Selection Functions with unions of hyperslabs\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Test simple case of one block overlapping another */ - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 2x15x13 hyperslab for disk dataset */ - start[0] = 1; - start[1] = 0; - start[2] = 0; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 2; - count[1] = 15; - count[2] = 13; - block[0] = 1; - block[1] = 1; - block[2] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid1); - VERIFY(npoints, 2 * 15 * 13, "H5Sget_select_npoints"); - - /* Select 8x26 hyperslab for memory dataset */ - start[0] = 15; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 8; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Union overlapping 8x26 hyperslab for memory dataset (to form a 15x26 selection) */ - start[0] = 22; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 8; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid2); - VERIFY(npoints, 15 * 26, "H5Sget_select_npoints"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 15x26 hyperslab for reading memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - for (i = 0; i < SPACE3_DIM1; i++) { - tbuf = wbuf + ((i + 15) * SPACE2_DIM2); - tbuf2 = rbuf + (i * SPACE3_DIM2); - for (j = 0; j < SPACE3_DIM2; j++, tbuf++, tbuf2++) { - if (*tbuf != *tbuf2) - TestErrPrintf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%d, *tbuf2=%d\n", - __LINE__, i, j, (int)*tbuf, (int)*tbuf2); - } /* end for */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Test simple case of several block overlapping another */ - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 2x15x13 hyperslab for disk dataset */ - start[0] = 1; - start[1] = 0; - start[2] = 0; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 2; - count[1] = 15; - count[2] = 13; - block[0] = 1; - block[1] = 1; - block[2] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 8x15 hyperslab for memory dataset */ - start[0] = 15; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 8; - count[1] = 15; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Union overlapping 8x15 hyperslab for memory dataset (to form a 15x15 selection) */ - start[0] = 22; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 8; - count[1] = 15; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Union overlapping 15x15 hyperslab for memory dataset (to form a 15x26 selection) */ - start[0] = 15; - start[1] = 11; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 15; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid2); - VERIFY(npoints, 15 * 26, "H5Sget_select_npoints"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE2_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 15x26 hyperslab for reading memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - for (i = 0; i < SPACE3_DIM1; i++) { - tbuf = wbuf + ((i + 15) * SPACE2_DIM2); - tbuf2 = rbuf + (i * SPACE3_DIM2); - for (j = 0; j < SPACE3_DIM2; j++, tbuf++, tbuf2++) { - if (*tbuf != *tbuf2) - TestErrPrintf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%d, *tbuf2=%d\n", - __LINE__, i, j, (int)*tbuf, (int)*tbuf2); - } /* end for */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Test disjoint case of two non-overlapping blocks */ - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 2x15x13 hyperslab for disk dataset */ - start[0] = 1; - start[1] = 0; - start[2] = 0; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 2; - count[1] = 15; - count[2] = 13; - block[0] = 1; - block[1] = 1; - block[2] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 7x26 hyperslab for memory dataset */ - start[0] = 1; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 7; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Union non-overlapping 8x26 hyperslab for memory dataset (to form a 15x26 disjoint selection) */ - start[0] = 22; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 8; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid2); - VERIFY(npoints, 15 * 26, "H5Sget_select_npoints"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE3_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 15x26 hyperslab for reading memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - for (i = 0; i < SPACE3_DIM1; i++) { - /* Jump over gap in middle */ - if (i < 7) - tbuf = wbuf + ((i + 1) * SPACE2_DIM2); - else - tbuf = wbuf + ((i + 15) * SPACE2_DIM2); - tbuf2 = rbuf + (i * SPACE3_DIM2); - for (j = 0; j < SPACE3_DIM2; j++, tbuf++, tbuf2++) { - if (*tbuf != *tbuf2) - TestErrPrintf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%d, *tbuf2=%d\n", - __LINE__, i, j, (int)*tbuf, (int)*tbuf2); - } /* end for */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Test disjoint case of two non-overlapping blocks with hyperslab caching turned off */ - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 2x15x13 hyperslab for disk dataset */ - start[0] = 1; - start[1] = 0; - start[2] = 0; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 2; - count[1] = 15; - count[2] = 13; - block[0] = 1; - block[1] = 1; - block[2] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 7x26 hyperslab for memory dataset */ - start[0] = 1; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 7; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Union non-overlapping 8x26 hyperslab for memory dataset (to form a 15x26 disjoint selection) */ - start[0] = 22; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 8; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid2); - VERIFY(npoints, 15 * 26, "H5Sget_select_npoints"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE4_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - xfer = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer, FAIL, "H5Pcreate"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 15x26 hyperslab for reading memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, xfer, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Close transfer property list */ - ret = H5Pclose(xfer); - CHECK(ret, FAIL, "H5Pclose"); - - /* Compare data read with data written out */ - for (i = 0; i < SPACE3_DIM1; i++) { - /* Jump over gap in middle */ - if (i < 7) - tbuf = wbuf + ((i + 1) * SPACE2_DIM2); - else - tbuf = wbuf + ((i + 15) * SPACE2_DIM2); - tbuf2 = rbuf + (i * SPACE3_DIM2); - for (j = 0; j < SPACE3_DIM2; j++, tbuf++, tbuf2++) { - if (*tbuf != *tbuf2) - TestErrPrintf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%d, *tbuf2=%d\n", - __LINE__, i, j, (int)*tbuf, (int)*tbuf2); - } /* end for */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Test case of two blocks which overlap corners and must be split */ - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 2x15x13 hyperslab for disk dataset */ - start[0] = 1; - start[1] = 0; - start[2] = 0; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 2; - count[1] = 15; - count[2] = 13; - block[0] = 1; - block[1] = 1; - block[2] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 10x10 hyperslab for memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 10; - count[1] = 10; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Union overlapping 15x20 hyperslab for memory dataset (forming a irregularly shaped region) */ - start[0] = 8; - start[1] = 5; - stride[0] = 1; - stride[1] = 1; - count[0] = 20; - count[1] = 15; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid2); - VERIFY(npoints, 15 * 26, "H5Sget_select_npoints"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE5_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 15x26 hyperslab for reading memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - for (i = 0, tbuf2 = rbuf; i < SPACE2_DIM1; i++) { - tbuf = wbuf + (i * SPACE2_DIM2) + begin[i]; - for (j = 0; j < (int)len[i]; j++, tbuf++, tbuf2++) { - if (*tbuf != *tbuf2) - TestErrPrintf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%d, *tbuf2=%d\n", - __LINE__, i, j, (int)*tbuf, (int)*tbuf2); - } /* end for */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_union() */ - -/**************************************************************** -** -** test_select_hyper_union_stagger(): Test basic H5S (dataspace) selection code. -** Tests unions of staggered hyperslabs. (Uses H5Scombine_hyperslab -** and H5Smodify_select instead of H5Sselect_hyperslab) -** -****************************************************************/ -static void -test_select_hyper_union_stagger(void) -{ - hid_t file_id; /* File ID */ - hid_t dset_id; /* Dataset ID */ - hid_t dataspace; /* File dataspace ID */ - hid_t memspace; /* Memory dataspace ID */ - hid_t tmp_space; /* Temporary dataspace ID */ - hid_t tmp2_space; /* Another emporary dataspace ID */ - hsize_t dimsm[2] = {7, 7}; /* Memory array dimensions */ - hsize_t dimsf[2] = {6, 5}; /* File array dimensions */ - hsize_t count[2] = {3, 1}; /* 1st Hyperslab size */ - hsize_t count2[2] = {3, 1}; /* 2nd Hyperslab size */ - hsize_t count3[2] = {2, 1}; /* 3rd Hyperslab size */ - hsize_t start[2] = {0, 0}; /* 1st Hyperslab offset */ - hsize_t start2[2] = {2, 1}; /* 2nd Hyperslab offset */ - hsize_t start3[2] = {4, 2}; /* 3rd Hyperslab offset */ - hsize_t count_out[2] = {4, 2}; /* Hyperslab size in memory */ - hsize_t start_out[2] = {0, 3}; /* Hyperslab offset in memory */ - int data[6][5]; /* Data to write */ - int data_out[7][7]; /* Data read in */ - int input_loc[8][2] = {{0, 0}, {1, 0}, {2, 0}, {2, 1}, {3, 1}, {4, 1}, {4, 2}, {5, 2}}; - int output_loc[8][2] = {{0, 3}, {0, 4}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 3}, {3, 4}}; - int dsetrank = 2; /* File Dataset rank */ - int memrank = 2; /* Memory Dataset rank */ - int i, j; /* Local counting variables */ - herr_t error; - hsize_t stride[2] = {1, 1}; - hsize_t block[2] = {1, 1}; - - /* Initialize data to write */ - for (i = 0; i < 6; i++) - for (j = 0; j < 5; j++) - data[i][j] = j * 10 + i; - - /* Create file */ - file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Create File Dataspace */ - dataspace = H5Screate_simple(dsetrank, dimsf, NULL); - CHECK(dataspace, FAIL, "H5Screate_simple"); - - /* Create File Dataset */ - dset_id = - H5Dcreate2(file_id, "IntArray", H5T_NATIVE_INT, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate2"); - - /* Write File Dataset */ - error = H5Dwrite(dset_id, H5T_NATIVE_INT, dataspace, dataspace, H5P_DEFAULT, data); - CHECK(error, FAIL, "H5Dwrite"); - - /* Close things */ - error = H5Sclose(dataspace); - CHECK(error, FAIL, "H5Sclose"); - error = H5Dclose(dset_id); - CHECK(error, FAIL, "H5Dclose"); - error = H5Fclose(file_id); - CHECK(error, FAIL, "H5Fclose"); - - /* Initialize input buffer */ - memset(data_out, 0, 7 * 7 * sizeof(int)); - - /* Open file */ - file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fopen"); - - /* Open dataset */ - dset_id = H5Dopen2(file_id, "IntArray", H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dopen2"); - - /* Get the dataspace */ - dataspace = H5Dget_space(dset_id); - CHECK(dataspace, FAIL, "H5Dget_space"); - - /* Select the hyperslabs */ - error = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - tmp_space = H5Scombine_hyperslab(dataspace, H5S_SELECT_OR, start2, stride, count2, block); - CHECK(tmp_space, FAIL, "H5Scombine_hyperslab"); - - /* Copy the file dataspace and select hyperslab */ - tmp2_space = H5Scopy(dataspace); - CHECK(tmp2_space, FAIL, "H5Scopy"); - error = H5Sselect_hyperslab(tmp2_space, H5S_SELECT_SET, start3, stride, count3, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Combine the copied dataspace with the temporary dataspace */ - error = H5Smodify_select(tmp_space, H5S_SELECT_OR, tmp2_space); - CHECK(error, FAIL, "H5Smodify_select"); - - /* Create Memory Dataspace */ - memspace = H5Screate_simple(memrank, dimsm, NULL); - CHECK(memspace, FAIL, "H5Screate_simple"); - - /* Select hyperslab in memory */ - error = H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start_out, stride, count_out, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Read File Dataset */ - error = H5Dread(dset_id, H5T_NATIVE_INT, memspace, tmp_space, H5P_DEFAULT, data_out); - CHECK(error, FAIL, "H5Dread"); - - /* Verify input data */ - for (i = 0; i < 8; i++) { - if (data[input_loc[i][0]][input_loc[i][1]] != data_out[output_loc[i][0]][output_loc[i][1]]) { - printf("input data #%d is wrong!\n", i); - printf("input_loc=[%d][%d]\n", input_loc[i][0], input_loc[i][1]); - printf("output_loc=[%d][%d]\n", output_loc[i][0], output_loc[i][1]); - printf("data=%d\n", data[input_loc[i][0]][input_loc[i][1]]); - TestErrPrintf("data_out=%d\n", data_out[output_loc[i][0]][output_loc[i][1]]); - } /* end if */ - } /* end for */ - - /* Close things */ - error = H5Sclose(tmp2_space); - CHECK(error, FAIL, "H5Sclose"); - error = H5Sclose(tmp_space); - CHECK(error, FAIL, "H5Sclose"); - error = H5Sclose(dataspace); - CHECK(error, FAIL, "H5Sclose"); - error = H5Sclose(memspace); - CHECK(error, FAIL, "H5Sclose"); - error = H5Dclose(dset_id); - CHECK(error, FAIL, "H5Dclose"); - error = H5Fclose(file_id); - CHECK(error, FAIL, "H5Fclose"); -} - -/**************************************************************** -** -** test_select_hyper_union_3d(): Test basic H5S (dataspace) selection code. -** Tests unions of hyperslabs in 3-D (Uses H5Scombine_hyperslab -** and H5Scombine_select instead of H5Sselect_hyperslab) -** -****************************************************************/ -static void -test_select_hyper_union_3d(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hid_t tmp_space; /* Temporary Dataspace ID */ - hid_t tmp2_space; /* Another temporary Dataspace ID */ - hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; - hsize_t dims2[] = {SPACE4_DIM1, SPACE4_DIM2, SPACE4_DIM3}; - hsize_t dims3[] = {SPACE3_DIM1, SPACE3_DIM2}; - hsize_t start[SPACE1_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE1_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE1_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE1_RANK]; /* Block size of hyperslab */ - struct row_list { - size_t z; - size_t y; - size_t x; - size_t l; - } rows[] = { - /* Array of x,y,z coordinates & length for each row written from memory */ - {0, 0, 0, 6}, /* 1st face of 3-D object */ - {0, 1, 0, 6}, {0, 2, 0, 6}, {0, 3, 0, 6}, {0, 4, 0, 6}, {1, 0, 0, 6}, /* 2nd face of 3-D object */ - {1, 1, 0, 6}, {1, 2, 0, 6}, {1, 3, 0, 6}, {1, 4, 0, 6}, {2, 0, 0, 6}, /* 3rd face of 3-D object */ - {2, 1, 0, 10}, {2, 2, 0, 10}, {2, 3, 0, 10}, {2, 4, 0, 10}, {2, 5, 2, 8}, - {2, 6, 2, 8}, {3, 0, 0, 6}, /* 4th face of 3-D object */ - {3, 1, 0, 10}, {3, 2, 0, 10}, {3, 3, 0, 10}, {3, 4, 0, 10}, {3, 5, 2, 8}, - {3, 6, 2, 8}, {4, 0, 0, 6}, /* 5th face of 3-D object */ - {4, 1, 0, 10}, {4, 2, 0, 10}, {4, 3, 0, 10}, {4, 4, 0, 10}, {4, 5, 2, 8}, - {4, 6, 2, 8}, {5, 1, 2, 8}, /* 6th face of 3-D object */ - {5, 2, 2, 8}, {5, 3, 2, 8}, {5, 4, 2, 8}, {5, 5, 2, 8}, {5, 6, 2, 8}, - {6, 1, 2, 8}, /* 7th face of 3-D object */ - {6, 2, 2, 8}, {6, 3, 2, 8}, {6, 4, 2, 8}, {6, 5, 2, 8}, {6, 6, 2, 8}, - {7, 1, 2, 8}, /* 8th face of 3-D object */ - {7, 2, 2, 8}, {7, 3, 2, 8}, {7, 4, 2, 8}, {7, 5, 2, 8}, {7, 6, 2, 8}}; - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - int i, j, k; /* Counters */ - herr_t ret; /* Generic return value */ - hsize_t npoints; /* Number of elements in selection */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslab Selection Functions with unions of 3-D hyperslabs\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE4_DIM1 * SPACE4_DIM2 * SPACE4_DIM3); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), SPACE3_DIM1 * SPACE3_DIM2); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE4_DIM1; i++) - for (j = 0; j < SPACE4_DIM2; j++) - for (k = 0; k < SPACE4_DIM3; k++) - *tbuf++ = (uint8_t)((((i * SPACE4_DIM2) + j) * SPACE4_DIM3) + k); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Test case of two blocks which overlap corners and must be split */ - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE4_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 2x15x13 hyperslab for disk dataset */ - start[0] = 1; - start[1] = 0; - start[2] = 0; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 2; - count[1] = 15; - count[2] = 13; - block[0] = 1; - block[1] = 1; - block[2] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select 5x5x6 hyperslab for memory dataset */ - start[0] = 0; - start[1] = 0; - start[2] = 0; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 5; - count[1] = 5; - count[2] = 6; - block[0] = 1; - block[1] = 1; - block[2] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Union overlapping 15x20 hyperslab for memory dataset (forming a irregularly shaped region) */ - start[0] = 2; - start[1] = 1; - start[2] = 2; - stride[0] = 1; - stride[1] = 1; - stride[2] = 1; - count[0] = 6; - count[1] = 6; - count[2] = 8; - block[0] = 1; - block[1] = 1; - block[2] = 1; - tmp_space = H5Scombine_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(tmp_space, FAIL, "H5Sselect_hyperslab"); - - /* Combine dataspaces and create new dataspace */ - tmp2_space = H5Scombine_select(sid2, H5S_SELECT_OR, tmp_space); - CHECK(tmp2_space, FAIL, "H5Scombin_select"); - - npoints = (hsize_t)H5Sget_select_npoints(tmp2_space); - VERIFY(npoints, 15 * 26, "H5Sget_select_npoints"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE1_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, tmp2_space, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close temporary dataspaces */ - ret = H5Sclose(tmp_space); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(tmp2_space); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE3_RANK, dims3, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 15x26 hyperslab for reading memory dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 15; - count[1] = 26; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read with data written out */ - for (i = 0, tbuf2 = rbuf; i < (int)(sizeof(rows) / sizeof(struct row_list)); i++) { - tbuf = wbuf + (rows[i].z * SPACE4_DIM3 * SPACE4_DIM2) + (rows[i].y * SPACE4_DIM3) + rows[i].x; - for (j = 0; j < (int)rows[i].l; j++, tbuf++, tbuf2++) { - if (*tbuf != *tbuf2) - TestErrPrintf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%d, *tbuf2=%d\n", - __LINE__, i, j, (int)*tbuf, (int)*tbuf2); - } /* end for */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_union_3d() */ - -/**************************************************************** -** -** test_select_hyper_valid_combination(): Tests invalid and valid -** combinations of selections on dataspace for H5Scombine_select -** and H5Smodify_select. -** -****************************************************************/ -static void -test_select_hyper_valid_combination(void) -{ - hid_t single_pt_sid; /* Dataspace ID with single point selection */ - hid_t single_hyper_sid; /* Dataspace ID with single block hyperslab selection */ - hid_t regular_hyper_sid; /* Dataspace ID with regular hyperslab selection */ - hid_t non_existent_sid = -1; /* A non-existent space id */ - hid_t tmp_sid; /* Temporary dataspace ID */ - hsize_t dims2D[] = {SPACE9_DIM1, SPACE9_DIM2}; - hsize_t dims3D[] = {SPACE4_DIM1, SPACE4_DIM2, SPACE4_DIM3}; - - hsize_t coord1[1][SPACE2_RANK]; /* Coordinates for single point selection */ - hsize_t start[SPACE4_RANK]; /* Hyperslab start */ - hsize_t stride[SPACE4_RANK]; /* Hyperslab stride */ - hsize_t count[SPACE4_RANK]; /* Hyperslab block count */ - hsize_t block[SPACE4_RANK]; /* Hyperslab block size */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing Selection Combination Validity\n")); - assert(SPACE9_DIM2 >= POINT1_NPOINTS); - - /* Create dataspace for single point selection */ - single_pt_sid = H5Screate_simple(SPACE9_RANK, dims2D, NULL); - CHECK(single_pt_sid, FAIL, "H5Screate_simple"); - - /* Select sequence of ten points for multiple point selection */ - coord1[0][0] = 2; - coord1[0][1] = 2; - ret = H5Sselect_elements(single_pt_sid, H5S_SELECT_SET, (size_t)1, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Create dataspace for single hyperslab selection */ - single_hyper_sid = H5Screate_simple(SPACE9_RANK, dims2D, NULL); - CHECK(single_hyper_sid, FAIL, "H5Screate_simple"); - - /* Select 10x10 hyperslab for single hyperslab selection */ - start[0] = 1; - start[1] = 1; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = (SPACE9_DIM1 - 2); - block[1] = (SPACE9_DIM2 - 2); - ret = H5Sselect_hyperslab(single_hyper_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for regular hyperslab selection */ - regular_hyper_sid = H5Screate_simple(SPACE4_RANK, dims3D, NULL); - CHECK(regular_hyper_sid, FAIL, "H5Screate_simple"); - - /* Select regular, strided hyperslab selection */ - start[0] = 2; - start[1] = 2; - start[2] = 2; - stride[0] = 2; - stride[1] = 2; - stride[2] = 2; - count[0] = 5; - count[1] = 2; - count[2] = 5; - block[0] = 1; - block[1] = 1; - block[2] = 1; - ret = H5Sselect_hyperslab(regular_hyper_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Test all the selections created */ - - /* Test the invalid combinations between point and hyperslab */ - H5E_BEGIN_TRY - { - tmp_sid = H5Scombine_select(single_pt_sid, H5S_SELECT_AND, single_hyper_sid); - } - H5E_END_TRY - VERIFY(tmp_sid, FAIL, "H5Scombine_select"); - - H5E_BEGIN_TRY - { - tmp_sid = H5Smodify_select(single_pt_sid, H5S_SELECT_AND, single_hyper_sid); - } - H5E_END_TRY - VERIFY(tmp_sid, FAIL, "H5Smodify_select"); - - /* Test the invalid combination between two hyperslab but of different dimension size */ - H5E_BEGIN_TRY - { - tmp_sid = H5Scombine_select(single_hyper_sid, H5S_SELECT_AND, regular_hyper_sid); - } - H5E_END_TRY - VERIFY(tmp_sid, FAIL, "H5Scombine_select"); - - H5E_BEGIN_TRY - { - tmp_sid = H5Smodify_select(single_hyper_sid, H5S_SELECT_AND, regular_hyper_sid); - } - H5E_END_TRY - VERIFY(tmp_sid, FAIL, "H5Smodify_select"); - - /* Test invalid operation inputs to the two functions */ - H5E_BEGIN_TRY - { - tmp_sid = H5Scombine_select(single_hyper_sid, H5S_SELECT_SET, single_hyper_sid); - } - H5E_END_TRY - VERIFY(tmp_sid, FAIL, "H5Scombine_select"); - - H5E_BEGIN_TRY - { - tmp_sid = H5Smodify_select(single_hyper_sid, H5S_SELECT_SET, single_hyper_sid); - } - H5E_END_TRY - VERIFY(tmp_sid, FAIL, "H5Smodify_select"); - - /* Test inputs in case of non-existent space ids */ - H5E_BEGIN_TRY - { - tmp_sid = H5Scombine_select(single_hyper_sid, H5S_SELECT_AND, non_existent_sid); - } - H5E_END_TRY - VERIFY(tmp_sid, FAIL, "H5Scombine_select"); - - H5E_BEGIN_TRY - { - tmp_sid = H5Smodify_select(single_hyper_sid, H5S_SELECT_AND, non_existent_sid); - } - H5E_END_TRY - VERIFY(tmp_sid, FAIL, "H5Smodify_select"); - - /* Close dataspaces */ - ret = H5Sclose(single_pt_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(single_hyper_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(regular_hyper_sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_select_hyper_valid_combination() */ - -/**************************************************************** -** -** test_select_hyper_and_2d(): Test basic H5S (dataspace) selection code. -** Tests 'and' of hyperslabs in 2-D -** -****************************************************************/ -static void -test_select_hyper_and_2d(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims2[] = {SPACE2A_DIM1}; - hsize_t start[SPACE2_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE2_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE2_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE2_RANK]; /* Block size of hyperslab */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - hssize_t npoints; /* Number of elements in selection */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslab Selection Functions with intersection of 2-D hyperslabs\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE2_DIM1 * SPACE2_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE2_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2A_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 10x10 hyperslab for disk dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 10; - count[1] = 10; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Intersect overlapping 10x10 hyperslab */ - start[0] = 5; - start[1] = 5; - stride[0] = 1; - stride[1] = 1; - count[0] = 10; - count[1] = 10; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_AND, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid1); - VERIFY(npoints, 5 * 5, "H5Sget_select_npoints"); - - /* Select 25 hyperslab for memory dataset */ - start[0] = 0; - stride[0] = 1; - count[0] = 25; - block[0] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid2); - VERIFY(npoints, 5 * 5, "H5Sget_select_npoints"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE2_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read entire dataset from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Initialize write buffer */ - for (i = 0, tbuf = rbuf, tbuf2 = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++, tbuf++) { - if ((i >= 5 && i <= 9) && (j >= 5 && j <= 9)) { - if (*tbuf != *tbuf2) - printf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%d, *tbuf2=%d\n", __LINE__, - i, j, (int)*tbuf, (int)*tbuf2); - tbuf2++; - } /* end if */ - else { - if (*tbuf != 0) - printf("%d: hyperslab element has wrong value!, i=%d, j=%d, *tbuf=%d\n", __LINE__, i, j, - (int)*tbuf); - } /* end else */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_and_2d() */ - -/**************************************************************** -** -** test_select_hyper_xor_2d(): Test basic H5S (dataspace) selection code. -** Tests 'xor' of hyperslabs in 2-D -** -****************************************************************/ -static void -test_select_hyper_xor_2d(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims2[] = {SPACE2A_DIM1}; - hsize_t start[SPACE2_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE2_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE2_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE2_RANK]; /* Block size of hyperslab */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - hssize_t npoints; /* Number of elements in selection */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslab Selection Functions with XOR of 2-D hyperslabs\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE2_DIM1 * SPACE2_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE2_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2A_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 10x10 hyperslab for disk dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 10; - count[1] = 10; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Intersect overlapping 10x10 hyperslab */ - start[0] = 5; - start[1] = 5; - stride[0] = 1; - stride[1] = 1; - count[0] = 10; - count[1] = 10; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_XOR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid1); - VERIFY(npoints, 150, "H5Sget_select_npoints"); - - /* Select 25 hyperslab for memory dataset */ - start[0] = 0; - stride[0] = 1; - count[0] = 150; - block[0] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid2); - VERIFY(npoints, 150, "H5Sget_select_npoints"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE2_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read entire dataset from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Initialize write buffer */ - for (i = 0, tbuf = rbuf, tbuf2 = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++, tbuf++) { - if (((i >= 0 && i <= 4) && (j >= 0 && j <= 9)) || - ((i >= 5 && i <= 9) && ((j >= 0 && j <= 4) || (j >= 10 && j <= 14))) || - ((i >= 10 && i <= 14) && (j >= 5 && j <= 14))) { - if (*tbuf != *tbuf2) - printf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%d, *tbuf2=%d\n", __LINE__, - i, j, (int)*tbuf, (int)*tbuf2); - tbuf2++; - } /* end if */ - else { - if (*tbuf != 0) - printf("%d: hyperslab element has wrong value!, i=%d, j=%d, *tbuf=%d\n", __LINE__, i, j, - (int)*tbuf); - } /* end else */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_xor_2d() */ - -/**************************************************************** -** -** test_select_hyper_notb_2d(): Test basic H5S (dataspace) selection code. -** Tests 'notb' of hyperslabs in 2-D -** -****************************************************************/ -static void -test_select_hyper_notb_2d(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims2[] = {SPACE2A_DIM1}; - hsize_t start[SPACE2_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE2_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE2_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE2_RANK]; /* Block size of hyperslab */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - hssize_t npoints; /* Number of elements in selection */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslab Selection Functions with NOTB of 2-D hyperslabs\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE2_DIM1 * SPACE2_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE2_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2A_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 10x10 hyperslab for disk dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 10; - count[1] = 10; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Intersect overlapping 10x10 hyperslab */ - start[0] = 5; - start[1] = 5; - stride[0] = 1; - stride[1] = 1; - count[0] = 10; - count[1] = 10; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_NOTB, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid1); - VERIFY(npoints, 75, "H5Sget_select_npoints"); - - /* Select 75 hyperslab for memory dataset */ - start[0] = 0; - stride[0] = 1; - count[0] = 75; - block[0] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid2); - VERIFY(npoints, 75, "H5Sget_select_npoints"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE2_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read entire dataset from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Initialize write buffer */ - for (i = 0, tbuf = rbuf, tbuf2 = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++, tbuf++) { - if (((i >= 0 && i <= 4) && (j >= 0 && j <= 9)) || ((i >= 5 && i <= 9) && (j >= 0 && j <= 4))) { - if (*tbuf != *tbuf2) - printf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%d, *tbuf2=%d\n", __LINE__, - i, j, (int)*tbuf, (int)*tbuf2); - tbuf2++; - } /* end if */ - else { - if (*tbuf != 0) - printf("%d: hyperslab element has wrong value!, i=%d, j=%d, *tbuf=%d\n", __LINE__, i, j, - (int)*tbuf); - } /* end else */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_notb_2d() */ - -/**************************************************************** -** -** test_select_hyper_nota_2d(): Test basic H5S (dataspace) selection code. -** Tests 'nota' of hyperslabs in 2-D -** -****************************************************************/ -static void -test_select_hyper_nota_2d(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE2_DIM1, SPACE2_DIM2}; - hsize_t dims2[] = {SPACE2A_DIM1}; - hsize_t start[SPACE2_RANK]; /* Starting location of hyperslab */ - hsize_t stride[SPACE2_RANK]; /* Stride of hyperslab */ - hsize_t count[SPACE2_RANK]; /* Element count of hyperslab */ - hsize_t block[SPACE2_RANK]; /* Block size of hyperslab */ - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf, /* temporary buffer pointer */ - *tbuf2; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - hssize_t npoints; /* Number of elements in selection */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslab Selection Functions with NOTA of 2-D hyperslabs\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), (size_t)(SPACE2_DIM1 * SPACE2_DIM2)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE2_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE2_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE2A_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Select 10x10 hyperslab for disk dataset */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 10; - count[1] = 10; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Intersect overlapping 10x10 hyperslab */ - start[0] = 5; - start[1] = 5; - stride[0] = 1; - stride[1] = 1; - count[0] = 10; - count[1] = 10; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_NOTA, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid1); - VERIFY(npoints, 75, "H5Sget_select_npoints"); - - /* Select 75 hyperslab for memory dataset */ - start[0] = 0; - stride[0] = 1; - count[0] = 75; - block[0] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints = H5Sget_select_npoints(sid2); - VERIFY(npoints, 75, "H5Sget_select_npoints"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE2_NAME, H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read entire dataset from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Initialize write buffer */ - for (i = 0, tbuf = rbuf, tbuf2 = wbuf; i < SPACE2_DIM1; i++) - for (j = 0; j < SPACE2_DIM2; j++, tbuf++) { - if (((i >= 10 && i <= 14) && (j >= 5 && j <= 14)) || - ((i >= 5 && i <= 9) && (j >= 10 && j <= 14))) { - if (*tbuf != *tbuf2) - TestErrPrintf("%d: hyperslab values don't match!, i=%d, j=%d, *tbuf=%d, *tbuf2=%d\n", - __LINE__, i, j, (int)*tbuf, (int)*tbuf2); - tbuf2++; - } /* end if */ - else { - if (*tbuf != 0) - TestErrPrintf("%d: hyperslab element has wrong value!, i=%d, j=%d, *tbuf=%d\n", __LINE__, - i, j, (int)*tbuf); - } /* end else */ - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_nota_2d() */ - -/**************************************************************** -** -** test_select_hyper_iter2(): Iterator for checking hyperslab iteration -** -****************************************************************/ -static herr_t -test_select_hyper_iter2(void *_elem, hid_t H5_ATTR_UNUSED type_id, unsigned ndim, const hsize_t *point, - void *_operator_data) -{ - int *tbuf = (int *)_elem, /* temporary buffer pointer */ - **tbuf2 = (int **)_operator_data; /* temporary buffer handle */ - unsigned u; /* Local counting variable */ - - if (*tbuf != **tbuf2) { - TestErrPrintf("Error in hyperslab iteration!\n"); - printf("location: { "); - for (u = 0; u < ndim; u++) { - printf("%2d", (int)point[u]); - if (u < (ndim - 1)) - printf(", "); - } /* end for */ - printf("}\n"); - printf("*tbuf=%d, **tbuf2=%d\n", *tbuf, **tbuf2); - return (-1); - } /* end if */ - else { - (*tbuf2)++; - return (0); - } -} /* end test_select_hyper_iter2() */ - -/**************************************************************** -** -** test_select_hyper_union_random_5d(): Test basic H5S (dataspace) selection code. -** Tests random unions of 5-D hyperslabs -** -****************************************************************/ -static void -test_select_hyper_union_random_5d(hid_t read_plist) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE5_DIM1, SPACE5_DIM2, SPACE5_DIM3, SPACE5_DIM4, SPACE5_DIM5}; - hsize_t dims2[] = {SPACE6_DIM1}; - hsize_t start[SPACE5_RANK]; /* Starting location of hyperslab */ - hsize_t count[SPACE5_RANK]; /* Element count of hyperslab */ - int *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer read from disk */ - *tbuf; /* temporary buffer pointer */ - int i, j, k, l, m; /* Counters */ - herr_t ret; /* Generic return value */ - hssize_t npoints, /* Number of elements in file selection */ - npoints2; /* Number of elements in memory selection */ - unsigned seed; /* Random number seed for each test */ - unsigned test_num; /* Count of tests being executed */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslab Selection Functions with random unions of 5-D hyperslabs\n")); - - /* Allocate write & read buffers */ - wbuf = (int *)malloc(sizeof(int) * SPACE5_DIM1 * SPACE5_DIM2 * SPACE5_DIM3 * SPACE5_DIM4 * SPACE5_DIM5); - CHECK_PTR(wbuf, "malloc"); - rbuf = (int *)calloc(sizeof(int), - (size_t)(SPACE5_DIM1 * SPACE5_DIM2 * SPACE5_DIM3 * SPACE5_DIM4 * SPACE5_DIM5)); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE5_DIM1; i++) - for (j = 0; j < SPACE5_DIM2; j++) - for (k = 0; k < SPACE5_DIM3; k++) - for (l = 0; l < SPACE5_DIM4; l++) - for (m = 0; m < SPACE5_DIM5; m++) - *tbuf++ = (int)(((((((i * SPACE5_DIM2) + j) * SPACE5_DIM3) + k) * SPACE5_DIM4) + l) * - SPACE5_DIM5) + - m; - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE5_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, SPACE5_NAME, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write entire dataset to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Create dataspace for reading buffer */ - sid2 = H5Screate_simple(SPACE6_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Get initial random # seed */ - seed = (unsigned)HDtime(NULL) + (unsigned)HDclock(); - - /* Crunch through a bunch of random hyperslab reads from the file dataset */ - for (test_num = 0; test_num < NRAND_HYPER; test_num++) { - /* Save random # seed for later use */ - /* (Used in case of errors, to regenerate the hyperslab sequence) */ - seed += (unsigned)HDclock(); - HDsrandom(seed); - - for (i = 0; i < NHYPERSLABS; i++) { - /* Select random hyperslab location & size for selection */ - for (j = 0; j < SPACE5_RANK; j++) { - start[j] = ((hsize_t)HDrandom() % dims1[j]); - count[j] = (((hsize_t)HDrandom() % (dims1[j] - start[j])) + 1); - } /* end for */ - - /* Select hyperslab */ - ret = H5Sselect_hyperslab(sid1, (i == 0 ? H5S_SELECT_SET : H5S_SELECT_OR), start, NULL, count, - NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - if (ret < 0) { - TestErrPrintf("Random hyperslabs for seed %u failed!\n", seed); - break; - } /* end if */ - } /* end for */ - - /* Get the number of elements selected */ - npoints = H5Sget_select_npoints(sid1); - CHECK(npoints, 0, "H5Sget_select_npoints"); - - /* Select linear 1-D hyperslab for memory dataset */ - start[0] = 0; - count[0] = (hsize_t)npoints; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - npoints2 = H5Sget_select_npoints(sid2); - VERIFY(npoints, npoints2, "H5Sget_select_npoints"); - - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_NATIVE_INT, sid2, sid1, read_plist, rbuf); - CHECK(ret, FAIL, "H5Dread"); - if (ret < 0) { - TestErrPrintf("Random hyperslabs for seed %u failed!\n", seed); - break; - } /* end if */ - - /* Compare data read with data written out */ - tbuf = rbuf; - ret = H5Diterate(wbuf, H5T_NATIVE_INT, sid1, test_select_hyper_iter2, &tbuf); - if (ret < 0) { - TestErrPrintf("Random hyperslabs for seed %u failed!\n", seed); - break; - } /* end if */ - - /* Set the read buffer back to all zeroes */ - memset(rbuf, 0, (size_t)SPACE6_DIM1); - } /* end for */ - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_union_random_5d() */ - -/**************************************************************** -** -** test_select_hyper_chunk(): Test basic H5S (dataspace) selection code. -** Tests large hyperslab selection in chunked dataset -** -****************************************************************/ -static void -test_select_hyper_chunk(hid_t fapl_plist, hid_t xfer_plist) -{ - hsize_t dimsf[3]; /* dataset dimensions */ - hsize_t chunk_dimsf[3] = {CHUNK_X, CHUNK_Y, CHUNK_Z}; /* chunk sizes */ - short *data; /* data to write */ - short *tmpdata; /* data to write */ - - /* - * Data and output buffer initialization. - */ - hid_t file, dataset; /* handles */ - hid_t dataspace; - hid_t memspace; - hid_t plist; - hsize_t dimsm[3]; /* memory space dimensions */ - hsize_t dims_out[3]; /* dataset dimensions */ - herr_t status; - - short *data_out; /* output buffer */ - short *tmpdata_out; /* output buffer */ - - hsize_t count[3]; /* size of the hyperslab in the file */ - hsize_t offset[3]; /* hyperslab offset in the file */ - hsize_t count_out[3]; /* size of the hyperslab in memory */ - hsize_t offset_out[3]; /* hyperslab offset in memory */ - int i, j, k, status_n, rank; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Hyperslab I/O on Large Chunks\n")); - - /* Allocate the transfer buffers */ - data = (short *)malloc(sizeof(short) * X * Y * Z); - CHECK_PTR(data, "malloc"); - data_out = (short *)calloc((size_t)(NX * NY * NZ), sizeof(short)); - CHECK_PTR(data_out, "calloc"); - - /* - * Data buffer initialization. - */ - tmpdata = data; - for (j = 0; j < X; j++) - for (i = 0; i < Y; i++) - for (k = 0; k < Z; k++) - *tmpdata++ = (short)((k + 1) % 256); - - /* - * Create a new file using H5F_ACC_TRUNC access, - * the default file creation properties, and the default file - * access properties. - */ - file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_plist); - CHECK(file, FAIL, "H5Fcreate"); - - /* - * Describe the size of the array and create the dataspace for fixed - * size dataset. - */ - dimsf[0] = X; - dimsf[1] = Y; - dimsf[2] = Z; - dataspace = H5Screate_simple(RANK_F, dimsf, NULL); - CHECK(dataspace, FAIL, "H5Screate_simple"); - - /* - * Create a new dataset within the file using defined dataspace and - * chunking properties. - */ - plist = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plist, FAIL, "H5Pcreate"); - status = H5Pset_chunk(plist, RANK_F, chunk_dimsf); - CHECK(status, FAIL, "H5Pset_chunk"); - dataset = H5Dcreate2(file, DATASETNAME, H5T_NATIVE_UCHAR, dataspace, H5P_DEFAULT, plist, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* - * Define hyperslab in the dataset. - */ - offset[0] = 0; - offset[1] = 0; - offset[2] = 0; - count[0] = NX_SUB; - count[1] = NY_SUB; - count[2] = NZ_SUB; - status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, NULL, count, NULL); - CHECK(status, FAIL, "H5Sselect_hyperslab"); - - /* - * Define the memory dataspace. - */ - dimsm[0] = NX; - dimsm[1] = NY; - dimsm[2] = NZ; - memspace = H5Screate_simple(RANK_M, dimsm, NULL); - CHECK(memspace, FAIL, "H5Screate_simple"); - - /* - * Define memory hyperslab. - */ - offset_out[0] = 0; - offset_out[1] = 0; - offset_out[2] = 0; - count_out[0] = NX_SUB; - count_out[1] = NY_SUB; - count_out[2] = NZ_SUB; - status = H5Sselect_hyperslab(memspace, H5S_SELECT_SET, offset_out, NULL, count_out, NULL); - CHECK(status, FAIL, "H5Sselect_hyperslab"); - - /* - * Write the data to the dataset using hyperslabs - */ - status = H5Dwrite(dataset, H5T_NATIVE_SHORT, memspace, dataspace, xfer_plist, data); - CHECK(status, FAIL, "H5Dwrite"); - - /* - * Close/release resources. - */ - status = H5Pclose(plist); - CHECK(status, FAIL, "H5Pclose"); - status = H5Sclose(dataspace); - CHECK(status, FAIL, "H5Sclose"); - status = H5Sclose(memspace); - CHECK(status, FAIL, "H5Sclose"); - status = H5Dclose(dataset); - CHECK(status, FAIL, "H5Dclose"); - status = H5Fclose(file); - CHECK(status, FAIL, "H5Fclose"); - - /************************************************************* - - This reads the hyperslab from the test.h5 file just - created, into a 3-dimensional plane of the 3-dimensional - array. - - ************************************************************/ - - /* - * Open the file and the dataset. - */ - file = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl_plist); - CHECK(file, FAIL, "H5Fopen"); - dataset = H5Dopen2(file, DATASETNAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - dataspace = H5Dget_space(dataset); /* dataspace handle */ - CHECK(dataspace, FAIL, "H5Dget_space"); - rank = H5Sget_simple_extent_ndims(dataspace); - VERIFY(rank, 3, "H5Sget_simple_extent_ndims"); - status_n = H5Sget_simple_extent_dims(dataspace, dims_out, NULL); - CHECK(status_n, FAIL, "H5Sget_simple_extent_dims"); - VERIFY(dims_out[0], dimsf[0], "Dataset dimensions"); - VERIFY(dims_out[1], dimsf[1], "Dataset dimensions"); - VERIFY(dims_out[2], dimsf[2], "Dataset dimensions"); - - /* - * Define hyperslab in the dataset. - */ - offset[0] = 0; - offset[1] = 0; - offset[2] = 0; - count[0] = NX_SUB; - count[1] = NY_SUB; - count[2] = NZ_SUB; - status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, NULL, count, NULL); - CHECK(status, FAIL, "H5Sselect_hyperslab"); - - /* - * Define the memory dataspace. - */ - dimsm[0] = NX; - dimsm[1] = NY; - dimsm[2] = NZ; - memspace = H5Screate_simple(RANK_M, dimsm, NULL); - CHECK(memspace, FAIL, "H5Screate_simple"); - - /* - * Define memory hyperslab. - */ - offset_out[0] = 0; - offset_out[1] = 0; - offset_out[2] = 0; - count_out[0] = NX_SUB; - count_out[1] = NY_SUB; - count_out[2] = NZ_SUB; - status = H5Sselect_hyperslab(memspace, H5S_SELECT_SET, offset_out, NULL, count_out, NULL); - CHECK(status, FAIL, "H5Sselect_hyperslab"); - - /* - * Read data from hyperslab in the file into the hyperslab in - * memory and display. - */ - status = H5Dread(dataset, H5T_NATIVE_SHORT, memspace, dataspace, xfer_plist, data_out); - CHECK(status, FAIL, "H5Dread"); - - /* Compare data written with data read in */ - tmpdata = data; - tmpdata_out = data_out; - for (j = 0; j < X; j++) - for (i = 0; i < Y; i++) - for (k = 0; k < Z; k++, tmpdata++, tmpdata_out++) { - if (*tmpdata != *tmpdata_out) - TestErrPrintf("Line %d: Error! j=%d, i=%d, k=%d, *tmpdata=%x, *tmpdata_out=%x\n", - __LINE__, j, i, k, (unsigned)*tmpdata, (unsigned)*tmpdata_out); - } /* end for */ - - /* - * Close and release resources. - */ - status = H5Dclose(dataset); - CHECK(status, FAIL, "H5Dclose"); - status = H5Sclose(dataspace); - CHECK(status, FAIL, "H5Sclose"); - status = H5Sclose(memspace); - CHECK(status, FAIL, "H5Sclose"); - status = H5Fclose(file); - CHECK(status, FAIL, "H5Fclose"); - free(data); - free(data_out); -} /* test_select_hyper_chunk() */ - -/**************************************************************** -** -** test_select_point_chunk(): Test basic H5S (dataspace) selection code. -** Tests combinations of hyperslab and point selections on -** chunked datasets. -** -****************************************************************/ -static void -test_select_point_chunk(void) -{ - hsize_t dimsf[SPACE7_RANK]; /* dataset dimensions */ - hsize_t chunk_dimsf[SPACE7_RANK] = {SPACE7_CHUNK_DIM1, SPACE7_CHUNK_DIM2}; /* chunk sizes */ - unsigned *data; /* data to write */ - unsigned *tmpdata; /* data to write */ - - /* - * Data and output buffer initialization. - */ - hid_t file, dataset; /* handles */ - hid_t dataspace; - hid_t pnt1_space; /* Dataspace to hold 1st point selection */ - hid_t pnt2_space; /* Dataspace to hold 2nd point selection */ - hid_t hyp1_space; /* Dataspace to hold 1st hyperslab selection */ - hid_t hyp2_space; /* Dataspace to hold 2nd hyperslab selection */ - hid_t dcpl; - herr_t ret; /* Generic return value */ - - unsigned *data_out; /* output buffer */ - - hsize_t start[SPACE7_RANK]; /* hyperslab offset */ - hsize_t count[SPACE7_RANK]; /* size of the hyperslab */ - hsize_t points[SPACE7_NPOINTS][SPACE7_RANK]; /* points for selection */ - unsigned i, j; /* Local index variables */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Point Selections on Chunked Datasets\n")); - - /* Allocate the transfer buffers */ - data = (unsigned *)malloc(sizeof(unsigned) * SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(data, "malloc"); - data_out = (unsigned *)calloc((size_t)(SPACE7_DIM1 * SPACE7_DIM2), sizeof(unsigned)); - CHECK_PTR(data_out, "calloc"); - - /* - * Data buffer initialization. - */ - tmpdata = data; - for (i = 0; i < SPACE7_DIM1; i++) - for (j = 0; j < SPACE7_DIM1; j++) - *tmpdata++ = ((i * SPACE7_DIM2) + j) % 256; - - /* - * Create a new file using H5F_ACC_TRUNC access, - * the default file creation properties and file - * access properties. - */ - file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* Create file dataspace */ - dimsf[0] = SPACE7_DIM1; - dimsf[1] = SPACE7_DIM2; - dataspace = H5Screate_simple(SPACE7_RANK, dimsf, NULL); - CHECK(dataspace, FAIL, "H5Screate_simple"); - - /* - * Create a new dataset within the file using defined dataspace and - * chunking properties. - */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - ret = H5Pset_chunk(dcpl, SPACE7_RANK, chunk_dimsf); - CHECK(ret, FAIL, "H5Pset_chunk"); - dataset = H5Dcreate2(file, DATASETNAME, H5T_NATIVE_UCHAR, dataspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Create 1st point selection */ - pnt1_space = H5Scopy(dataspace); - CHECK(pnt1_space, FAIL, "H5Scopy"); - - points[0][0] = 3; - points[0][1] = 3; - points[1][0] = 3; - points[1][1] = 8; - points[2][0] = 8; - points[2][1] = 3; - points[3][0] = 8; - points[3][1] = 8; - points[4][0] = 1; /* In same chunk as point #0, but "earlier" in chunk */ - points[4][1] = 1; - points[5][0] = 1; /* In same chunk as point #1, but "earlier" in chunk */ - points[5][1] = 6; - points[6][0] = 6; /* In same chunk as point #2, but "earlier" in chunk */ - points[6][1] = 1; - points[7][0] = 6; /* In same chunk as point #3, but "earlier" in chunk */ - points[7][1] = 6; - ret = H5Sselect_elements(pnt1_space, H5S_SELECT_SET, (size_t)SPACE7_NPOINTS, (const hsize_t *)points); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Create 1st hyperslab selection */ - hyp1_space = H5Scopy(dataspace); - CHECK(hyp1_space, FAIL, "H5Scopy"); - - start[0] = 2; - start[1] = 2; - count[0] = 4; - count[1] = 2; - ret = H5Sselect_hyperslab(hyp1_space, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Write out data using 1st point selection for file & hyperslab for memory */ - ret = H5Dwrite(dataset, H5T_NATIVE_UINT, hyp1_space, pnt1_space, H5P_DEFAULT, data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Create 2nd point selection */ - pnt2_space = H5Scopy(dataspace); - CHECK(pnt2_space, FAIL, "H5Scopy"); - - points[0][0] = 4; - points[0][1] = 4; - points[1][0] = 4; - points[1][1] = 9; - points[2][0] = 9; - points[2][1] = 4; - points[3][0] = 9; - points[3][1] = 9; - points[4][0] = 2; /* In same chunk as point #0, but "earlier" in chunk */ - points[4][1] = 2; - points[5][0] = 2; /* In same chunk as point #1, but "earlier" in chunk */ - points[5][1] = 7; - points[6][0] = 7; /* In same chunk as point #2, but "earlier" in chunk */ - points[6][1] = 2; - points[7][0] = 7; /* In same chunk as point #3, but "earlier" in chunk */ - points[7][1] = 7; - ret = H5Sselect_elements(pnt2_space, H5S_SELECT_SET, (size_t)SPACE7_NPOINTS, (const hsize_t *)points); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Create 2nd hyperslab selection */ - hyp2_space = H5Scopy(dataspace); - CHECK(hyp2_space, FAIL, "H5Scopy"); - - start[0] = 2; - start[1] = 4; - count[0] = 4; - count[1] = 2; - ret = H5Sselect_hyperslab(hyp2_space, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Write out data using 2nd hyperslab selection for file & point for memory */ - ret = H5Dwrite(dataset, H5T_NATIVE_UINT, pnt2_space, hyp2_space, H5P_DEFAULT, data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close everything (except selections) */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Sclose(dataspace); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - /* Re-open file & dataset */ - file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fopen"); - dataset = H5Dopen2(file, DATASETNAME, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Read data using 1st point selection for file and hyperslab for memory */ - ret = H5Dread(dataset, H5T_NATIVE_UINT, hyp1_space, pnt1_space, H5P_DEFAULT, data_out); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify data (later) */ - - /* Read data using 2nd hyperslab selection for file and point for memory */ - ret = H5Dread(dataset, H5T_NATIVE_UINT, pnt2_space, hyp2_space, H5P_DEFAULT, data_out); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify data (later) */ - - /* Close everything (including selections) */ - ret = H5Sclose(pnt1_space); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(pnt2_space); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(hyp1_space); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(hyp2_space); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - - free(data); - free(data_out); -} /* test_select_point_chunk() */ - -/**************************************************************** -** -** test_select_sclar_chunk(): Test basic H5S (dataspace) selection code. -** Tests using a scalar dataspace (in memory) to access chunked datasets. -** -****************************************************************/ -static void -test_select_scalar_chunk(void) -{ - hid_t file_id; /* File ID */ - hid_t dcpl; /* Dataset creation property list */ - hid_t dsid; /* Dataset ID */ - hid_t sid; /* Dataspace ID */ - hid_t m_sid; /* Memory dataspace */ - hsize_t dims[] = {2}; /* Dataset dimensions */ - hsize_t maxdims[] = {H5S_UNLIMITED}; /* Dataset maximum dimensions */ - hsize_t offset[] = {0}; /* Hyperslab start */ - hsize_t count[] = {1}; /* Hyperslab count */ - unsigned data = 2; /* Data to write */ - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Scalar Dataspaces and Chunked Datasets\n")); - - file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fcreate"); - - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - dims[0] = 1024U; - ret = H5Pset_chunk(dcpl, 1, dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Create 1-D dataspace */ - sid = H5Screate_simple(1, dims, maxdims); - CHECK(sid, FAIL, "H5Screate_simple"); - - dsid = H5Dcreate2(file_id, "dset", H5T_NATIVE_UINT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dsid, FAIL, "H5Dcreate2"); - - /* Select scalar area (offset 0, count 1) */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, offset, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create scalar memory dataspace */ - m_sid = H5Screate(H5S_SCALAR); - CHECK(m_sid, FAIL, "H5Screate"); - - /* Write out data using scalar dataspace for memory dataspace */ - ret = H5Dwrite(dsid, H5T_NATIVE_UINT, m_sid, sid, H5P_DEFAULT, &data); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close resources */ - ret = H5Sclose(m_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Dclose(dsid); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_select_scalar_chunk() */ - -/**************************************************************** -** -** test_select_valid(): Test basic H5S (dataspace) selection code. -** Tests selection validity -** -****************************************************************/ -static void -test_select_valid(void) -{ - herr_t error; - htri_t valid; - hid_t main_space, sub_space; - hsize_t safe_start[2] = {1, 1}; - hsize_t safe_count[2] = {1, 1}; - hsize_t start[2]; - hsize_t dims[2], maxdims[2], size[2], count[2]; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Selection Validity\n")); - - MESSAGE(8, ("Case 1 : sub_space is not a valid dataspace\n")); - dims[0] = dims[1] = H5S_UNLIMITED; - - H5E_BEGIN_TRY - { - sub_space = H5Screate_simple(2, dims, NULL); - } - H5E_END_TRY - VERIFY(sub_space, FAIL, "H5Screate_simple"); - - H5E_BEGIN_TRY - { - valid = H5Sselect_valid(sub_space); - } - H5E_END_TRY - VERIFY(valid, FAIL, "H5Sselect_valid"); - - /* Set arrays and dataspace for the rest of the cases */ - count[0] = count[1] = 1; - dims[0] = dims[1] = maxdims[0] = maxdims[1] = 10; - - main_space = H5Screate_simple(2, dims, maxdims); - CHECK(main_space, FAIL, "H5Screate_simple"); - - MESSAGE(8, ("Case 2 : sub_space is a valid but closed dataspace\n")); - sub_space = H5Scopy(main_space); - CHECK(sub_space, FAIL, "H5Scopy"); - - error = H5Sclose(sub_space); - CHECK(error, FAIL, "H5Sclose"); - - H5E_BEGIN_TRY - { - valid = H5Sselect_valid(sub_space); - } - H5E_END_TRY - VERIFY(valid, FAIL, "H5Sselect_valid"); - - MESSAGE(8, ("Case 3 : in the dimensions\nTry offset (4,4) and size(6,6), the original space is of size " - "(10,10)\n")); - start[0] = start[1] = 4; - size[0] = size[1] = 6; - - sub_space = H5Scopy(main_space); - CHECK(sub_space, FAIL, "H5Scopy"); - - error = H5Sselect_hyperslab(sub_space, H5S_SELECT_SET, start, size, count, size); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - valid = H5Sselect_valid(sub_space); - VERIFY(valid, true, "H5Sselect_valid"); - - error = H5Sselect_hyperslab(sub_space, H5S_SELECT_OR, safe_start, NULL, safe_count, NULL); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - valid = H5Sselect_valid(sub_space); - VERIFY(valid, true, "H5Sselect_valid"); - - error = H5Sclose(sub_space); - CHECK(error, FAIL, "H5Sclose"); - - MESSAGE(8, ("Case 4 : exceed dimensions by 1\nTry offset (5,5) and size(6,6), the original space is of " - "size (10,10)\n")); - start[0] = start[1] = 5; - size[0] = size[1] = 6; - - sub_space = H5Scopy(main_space); - CHECK(sub_space, FAIL, "H5Scopy"); - - error = H5Sselect_hyperslab(sub_space, H5S_SELECT_SET, start, size, count, size); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - valid = H5Sselect_valid(sub_space); - VERIFY(valid, false, "H5Sselect_valid"); - - error = H5Sselect_hyperslab(sub_space, H5S_SELECT_OR, safe_start, NULL, safe_count, NULL); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - valid = H5Sselect_valid(sub_space); - VERIFY(valid, false, "H5Sselect_valid"); - - error = H5Sclose(sub_space); - CHECK(error, FAIL, "H5Sclose"); - - MESSAGE(8, ("Case 5 : exceed dimensions by 2\nTry offset (6,6) and size(6,6), the original space is of " - "size (10,10)\n")); - start[0] = start[1] = 6; - size[0] = size[1] = 6; - - sub_space = H5Scopy(main_space); - CHECK(sub_space, FAIL, "H5Scopy"); - - error = H5Sselect_hyperslab(sub_space, H5S_SELECT_SET, start, size, count, size); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - valid = H5Sselect_valid(sub_space); - VERIFY(valid, false, "H5Sselect_valid"); - - error = H5Sselect_hyperslab(sub_space, H5S_SELECT_OR, safe_start, NULL, safe_count, NULL); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - valid = H5Sselect_valid(sub_space); - VERIFY(valid, false, "H5Sselect_valid"); - - error = H5Sclose(sub_space); - CHECK(error, FAIL, "H5Sclose"); - error = H5Sclose(main_space); - CHECK(error, FAIL, "H5Sclose"); -} /* test_select_valid() */ - -/**************************************************************** -** -** test_select_combine(): Test basic H5S (dataspace) selection code. -** Tests combining "all" and "none" selections with hyperslab -** operations. -** -****************************************************************/ -static void -test_select_combine(void) -{ - hid_t base_id; /* Base dataspace for test */ - hid_t all_id; /* Dataspace for "all" selection */ - hid_t none_id; /* Dataspace for "none" selection */ - hid_t space1; /* Temporary dataspace #1 */ - hsize_t start[SPACE7_RANK]; /* Hyperslab start */ - hsize_t stride[SPACE7_RANK]; /* Hyperslab stride */ - hsize_t count[SPACE7_RANK]; /* Hyperslab count */ - hsize_t block[SPACE7_RANK]; /* Hyperslab block */ - hsize_t dims[SPACE7_RANK] = {SPACE7_DIM1, SPACE7_DIM2}; /* Dimensions of dataspace */ - H5S_sel_type sel_type; /* Selection type */ - hssize_t nblocks; /* Number of hyperslab blocks */ - hsize_t blocks[16][2][SPACE7_RANK]; /* List of blocks */ - herr_t error; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Selection Combinations\n")); - - /* Create dataspace for dataset on disk */ - base_id = H5Screate_simple(SPACE7_RANK, dims, NULL); - CHECK(base_id, FAIL, "H5Screate_simple"); - - /* Copy base dataspace and set selection to "all" */ - all_id = H5Scopy(base_id); - CHECK(all_id, FAIL, "H5Scopy"); - error = H5Sselect_all(all_id); - CHECK(error, FAIL, "H5Sselect_all"); - sel_type = H5Sget_select_type(all_id); - VERIFY(sel_type, H5S_SEL_ALL, "H5Sget_select_type"); - - /* Copy base dataspace and set selection to "none" */ - none_id = H5Scopy(base_id); - CHECK(none_id, FAIL, "H5Scopy"); - error = H5Sselect_none(none_id); - CHECK(error, FAIL, "H5Sselect_none"); - sel_type = H5Sget_select_type(none_id); - VERIFY(sel_type, H5S_SEL_NONE, "H5Sget_select_type"); - - /* Copy "all" selection & space */ - space1 = H5Scopy(all_id); - CHECK(space1, FAIL, "H5Scopy"); - - /* 'OR' "all" selection with another hyperslab */ - start[0] = start[1] = 0; - stride[0] = stride[1] = 1; - count[0] = count[1] = 1; - block[0] = block[1] = 5; - error = H5Sselect_hyperslab(space1, H5S_SELECT_OR, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Verify that it's still "all" selection */ - sel_type = H5Sget_select_type(space1); - VERIFY(sel_type, H5S_SEL_ALL, "H5Sget_select_type"); - - /* Close temporary dataspace */ - error = H5Sclose(space1); - CHECK(error, FAIL, "H5Sclose"); - - /* Copy "all" selection & space */ - space1 = H5Scopy(all_id); - CHECK(space1, FAIL, "H5Scopy"); - - /* 'AND' "all" selection with another hyperslab */ - start[0] = start[1] = 0; - stride[0] = stride[1] = 1; - count[0] = count[1] = 1; - block[0] = block[1] = 5; - error = H5Sselect_hyperslab(space1, H5S_SELECT_AND, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Verify that the new selection is the same at the original block */ - sel_type = H5Sget_select_type(space1); - VERIFY(sel_type, H5S_SEL_HYPERSLABS, "H5Sget_select_type"); - - /* Verify that there is only one block */ - nblocks = H5Sget_select_hyper_nblocks(space1); - VERIFY(nblocks, 1, "H5Sget_select_hyper_nblocks"); - - /* Retrieve the block defined */ - memset(blocks, -1, sizeof(blocks)); /* Reset block list */ - error = H5Sget_select_hyper_blocklist(space1, (hsize_t)0, (hsize_t)nblocks, (hsize_t *)blocks); - CHECK(error, FAIL, "H5Sget_select_hyper_blocklist"); - - /* Verify that the correct block is defined */ - VERIFY(blocks[0][0][0], (hsize_t)start[0], "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][0][1], (hsize_t)start[1], "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][0], (block[0] - 1), "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][1], (block[1] - 1), "H5Sget_select_hyper_blocklist"); - - /* Close temporary dataspace */ - error = H5Sclose(space1); - CHECK(error, FAIL, "H5Sclose"); - - /* Copy "all" selection & space */ - space1 = H5Scopy(all_id); - CHECK(space1, FAIL, "H5Scopy"); - - /* 'XOR' "all" selection with another hyperslab */ - start[0] = start[1] = 0; - stride[0] = stride[1] = 1; - count[0] = count[1] = 1; - block[0] = block[1] = 5; - error = H5Sselect_hyperslab(space1, H5S_SELECT_XOR, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Verify that the new selection is an inversion of the original block */ - sel_type = H5Sget_select_type(space1); - VERIFY(sel_type, H5S_SEL_HYPERSLABS, "H5Sget_select_type"); - - /* Verify that there are two blocks */ - nblocks = H5Sget_select_hyper_nblocks(space1); - VERIFY(nblocks, 2, "H5Sget_select_hyper_nblocks"); - - /* Retrieve the block defined */ - memset(blocks, -1, sizeof(blocks)); /* Reset block list */ - error = H5Sget_select_hyper_blocklist(space1, (hsize_t)0, (hsize_t)nblocks, (hsize_t *)blocks); - CHECK(error, FAIL, "H5Sget_select_hyper_blocklist"); - - /* Verify that the correct block is defined */ - VERIFY(blocks[0][0][0], 0, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][0][1], 5, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][0], 4, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][1], 9, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[1][0][0], 5, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[1][0][1], 0, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[1][1][0], 9, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[1][1][1], 9, "H5Sget_select_hyper_blocklist"); - - /* Close temporary dataspace */ - error = H5Sclose(space1); - CHECK(error, FAIL, "H5Sclose"); - - /* Copy "all" selection & space */ - space1 = H5Scopy(all_id); - CHECK(space1, FAIL, "H5Scopy"); - - /* 'NOTB' "all" selection with another hyperslab */ - start[0] = start[1] = 0; - stride[0] = stride[1] = 1; - count[0] = count[1] = 1; - block[0] = block[1] = 5; - error = H5Sselect_hyperslab(space1, H5S_SELECT_NOTB, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Verify that the new selection is an inversion of the original block */ - sel_type = H5Sget_select_type(space1); - VERIFY(sel_type, H5S_SEL_HYPERSLABS, "H5Sget_select_type"); - - /* Verify that there are two blocks */ - nblocks = H5Sget_select_hyper_nblocks(space1); - VERIFY(nblocks, 2, "H5Sget_select_hyper_nblocks"); - - /* Retrieve the block defined */ - memset(blocks, -1, sizeof(blocks)); /* Reset block list */ - error = H5Sget_select_hyper_blocklist(space1, (hsize_t)0, (hsize_t)nblocks, (hsize_t *)blocks); - CHECK(error, FAIL, "H5Sget_select_hyper_blocklist"); - - /* Verify that the correct block is defined */ - VERIFY(blocks[0][0][0], 0, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][0][1], 5, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][0], 4, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][1], 9, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[1][0][0], 5, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[1][0][1], 0, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[1][1][0], 9, "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[1][1][1], 9, "H5Sget_select_hyper_blocklist"); - - /* Close temporary dataspace */ - error = H5Sclose(space1); - CHECK(error, FAIL, "H5Sclose"); - - /* Copy "all" selection & space */ - space1 = H5Scopy(all_id); - CHECK(space1, FAIL, "H5Scopy"); - - /* 'NOTA' "all" selection with another hyperslab */ - start[0] = start[1] = 0; - stride[0] = stride[1] = 1; - count[0] = count[1] = 1; - block[0] = block[1] = 5; - error = H5Sselect_hyperslab(space1, H5S_SELECT_NOTA, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Verify that the new selection is the "none" selection */ - sel_type = H5Sget_select_type(space1); - VERIFY(sel_type, H5S_SEL_NONE, "H5Sget_select_type"); - - /* Close temporary dataspace */ - error = H5Sclose(space1); - CHECK(error, FAIL, "H5Sclose"); - - /* Copy "none" selection & space */ - space1 = H5Scopy(none_id); - CHECK(space1, FAIL, "H5Scopy"); - - /* 'OR' "none" selection with another hyperslab */ - start[0] = start[1] = 0; - stride[0] = stride[1] = 1; - count[0] = count[1] = 1; - block[0] = block[1] = 5; - error = H5Sselect_hyperslab(space1, H5S_SELECT_OR, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Verify that the new selection is the same as the original hyperslab */ - sel_type = H5Sget_select_type(space1); - VERIFY(sel_type, H5S_SEL_HYPERSLABS, "H5Sget_select_type"); - - /* Verify that there is only one block */ - nblocks = H5Sget_select_hyper_nblocks(space1); - VERIFY(nblocks, 1, "H5Sget_select_hyper_nblocks"); - - /* Retrieve the block defined */ - memset(blocks, -1, sizeof(blocks)); /* Reset block list */ - error = H5Sget_select_hyper_blocklist(space1, (hsize_t)0, (hsize_t)nblocks, (hsize_t *)blocks); - CHECK(error, FAIL, "H5Sget_select_hyper_blocklist"); - - /* Verify that the correct block is defined */ - VERIFY(blocks[0][0][0], (hsize_t)start[0], "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][0][1], (hsize_t)start[1], "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][0], (block[0] - 1), "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][1], (block[1] - 1), "H5Sget_select_hyper_blocklist"); - - /* Close temporary dataspace */ - error = H5Sclose(space1); - CHECK(error, FAIL, "H5Sclose"); - - /* Copy "none" selection & space */ - space1 = H5Scopy(none_id); - CHECK(space1, FAIL, "H5Scopy"); - - /* 'AND' "none" selection with another hyperslab */ - start[0] = start[1] = 0; - stride[0] = stride[1] = 1; - count[0] = count[1] = 1; - block[0] = block[1] = 5; - error = H5Sselect_hyperslab(space1, H5S_SELECT_AND, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Verify that the new selection is the "none" selection */ - sel_type = H5Sget_select_type(space1); - VERIFY(sel_type, H5S_SEL_NONE, "H5Sget_select_type"); - - /* Close temporary dataspace */ - error = H5Sclose(space1); - CHECK(error, FAIL, "H5Sclose"); - - /* Copy "none" selection & space */ - space1 = H5Scopy(none_id); - CHECK(space1, FAIL, "H5Scopy"); - - /* 'XOR' "none" selection with another hyperslab */ - start[0] = start[1] = 0; - stride[0] = stride[1] = 1; - count[0] = count[1] = 1; - block[0] = block[1] = 5; - error = H5Sselect_hyperslab(space1, H5S_SELECT_XOR, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Verify that the new selection is the same as the original hyperslab */ - sel_type = H5Sget_select_type(space1); - VERIFY(sel_type, H5S_SEL_HYPERSLABS, "H5Sget_select_type"); - - /* Verify that there is only one block */ - nblocks = H5Sget_select_hyper_nblocks(space1); - VERIFY(nblocks, 1, "H5Sget_select_hyper_nblocks"); - - /* Retrieve the block defined */ - memset(blocks, -1, sizeof(blocks)); /* Reset block list */ - error = H5Sget_select_hyper_blocklist(space1, (hsize_t)0, (hsize_t)nblocks, (hsize_t *)blocks); - CHECK(error, FAIL, "H5Sget_select_hyper_blocklist"); - - /* Verify that the correct block is defined */ - VERIFY(blocks[0][0][0], (hsize_t)start[0], "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][0][1], (hsize_t)start[1], "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][0], (block[0] - 1), "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][1], (block[1] - 1), "H5Sget_select_hyper_blocklist"); - - /* Close temporary dataspace */ - error = H5Sclose(space1); - CHECK(error, FAIL, "H5Sclose"); - - /* Copy "none" selection & space */ - space1 = H5Scopy(none_id); - CHECK(space1, FAIL, "H5Scopy"); - - /* 'NOTB' "none" selection with another hyperslab */ - start[0] = start[1] = 0; - stride[0] = stride[1] = 1; - count[0] = count[1] = 1; - block[0] = block[1] = 5; - error = H5Sselect_hyperslab(space1, H5S_SELECT_NOTB, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Verify that the new selection is the "none" selection */ - sel_type = H5Sget_select_type(space1); - VERIFY(sel_type, H5S_SEL_NONE, "H5Sget_select_type"); - - /* Close temporary dataspace */ - error = H5Sclose(space1); - CHECK(error, FAIL, "H5Sclose"); - - /* Copy "none" selection & space */ - space1 = H5Scopy(none_id); - CHECK(space1, FAIL, "H5Scopy"); - - /* 'NOTA' "none" selection with another hyperslab */ - start[0] = start[1] = 0; - stride[0] = stride[1] = 1; - count[0] = count[1] = 1; - block[0] = block[1] = 5; - error = H5Sselect_hyperslab(space1, H5S_SELECT_NOTA, start, stride, count, block); - CHECK(error, FAIL, "H5Sselect_hyperslab"); - - /* Verify that the new selection is the same as the original hyperslab */ - sel_type = H5Sget_select_type(space1); - VERIFY(sel_type, H5S_SEL_HYPERSLABS, "H5Sget_select_type"); - - /* Verify that there is only one block */ - nblocks = H5Sget_select_hyper_nblocks(space1); - VERIFY(nblocks, 1, "H5Sget_select_hyper_nblocks"); - - /* Retrieve the block defined */ - memset(blocks, -1, sizeof(blocks)); /* Reset block list */ - error = H5Sget_select_hyper_blocklist(space1, (hsize_t)0, (hsize_t)nblocks, (hsize_t *)blocks); - CHECK(error, FAIL, "H5Sget_select_hyper_blocklist"); - - /* Verify that the correct block is defined */ - VERIFY(blocks[0][0][0], (hsize_t)start[0], "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][0][1], (hsize_t)start[1], "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][0], (block[0] - 1), "H5Sget_select_hyper_blocklist"); - VERIFY(blocks[0][1][1], (block[1] - 1), "H5Sget_select_hyper_blocklist"); - - /* Close temporary dataspace */ - error = H5Sclose(space1); - CHECK(error, FAIL, "H5Sclose"); - - /* Close dataspaces */ - error = H5Sclose(base_id); - CHECK(error, FAIL, "H5Sclose"); - - error = H5Sclose(all_id); - CHECK(error, FAIL, "H5Sclose"); - - error = H5Sclose(none_id); - CHECK(error, FAIL, "H5Sclose"); -} /* test_select_combine() */ - -/* - * Typedef for iteration structure used in the fill value tests - */ -typedef struct { - unsigned short fill_value; /* The fill value to check */ - size_t curr_coord; /* Current coordinate to examine */ - hsize_t *coords; /* Pointer to selection's coordinates */ -} fill_iter_info; - -/**************************************************************** -** -** test_select_hyper_iter3(): Iterator for checking hyperslab iteration -** -****************************************************************/ -static herr_t -test_select_hyper_iter3(void *_elem, hid_t H5_ATTR_UNUSED type_id, unsigned ndim, const hsize_t *point, - void *_operator_data) -{ - unsigned *tbuf = (unsigned *)_elem; /* temporary buffer pointer */ - fill_iter_info *iter_info = - (fill_iter_info *)_operator_data; /* Get the pointer to the iterator information */ - hsize_t *coord_ptr; /* Pointer to the coordinate information for a point*/ - - /* Check value in current buffer location */ - if (*tbuf != iter_info->fill_value) - return (-1); - else { - /* Check number of dimensions */ - if (ndim != SPACE7_RANK) - return (-1); - else { - /* Check Coordinates */ - coord_ptr = iter_info->coords + (2 * iter_info->curr_coord); - iter_info->curr_coord++; - if (coord_ptr[0] != point[0]) - return (-1); - else if (coord_ptr[1] != point[1]) - return (-1); - else - return (0); - } /* end else */ - } /* end else */ -} /* end test_select_hyper_iter3() */ - -/**************************************************************** -** -** test_select_fill_all(): Test basic H5S (dataspace) selection code. -** Tests filling "all" selections -** -****************************************************************/ -static void -test_select_fill_all(void) -{ - hid_t sid1; /* Dataspace ID */ - hsize_t dims1[] = {SPACE7_DIM1, SPACE7_DIM2}; - unsigned fill_value; /* Fill value */ - fill_iter_info iter_info; /* Iterator information structure */ - hsize_t points[SPACE7_DIM1 * SPACE7_DIM2][SPACE7_RANK]; /* Coordinates of selection */ - unsigned *wbuf, /* buffer to write to disk */ - *tbuf; /* temporary buffer pointer */ - unsigned u, v; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Filling 'all' Selections\n")); - - /* Allocate memory buffer */ - wbuf = (unsigned *)malloc(sizeof(unsigned) * SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(wbuf, "malloc"); - - /* Initialize memory buffer */ - for (u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++) - *tbuf++ = (u * SPACE7_DIM2) + v; - - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE7_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Space defaults to "all" selection */ - - /* Set fill value */ - fill_value = SPACE7_FILL; - - /* Fill selection in memory */ - ret = H5Dfill(&fill_value, H5T_NATIVE_UINT, wbuf, H5T_NATIVE_UINT, sid1); - CHECK(ret, FAIL, "H5Dfill"); - - /* Verify memory buffer the hard way... */ - for (u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++) - if (*tbuf != fill_value) - TestErrPrintf("Error! v=%d, u=%u, *tbuf=%u, fill_value=%u\n", v, u, *tbuf, fill_value); - - /* Set the coordinates of the selection */ - for (u = 0; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++) { - points[(u * SPACE7_DIM2) + v][0] = u; - points[(u * SPACE7_DIM2) + v][1] = v; - } /* end for */ - - /* Initialize the iterator structure */ - iter_info.fill_value = SPACE7_FILL; - iter_info.curr_coord = 0; - iter_info.coords = (hsize_t *)points; - - /* Iterate through selection, verifying correct data */ - ret = H5Diterate(wbuf, H5T_NATIVE_UINT, sid1, test_select_hyper_iter3, &iter_info); - CHECK(ret, FAIL, "H5Diterate"); - - /* Close dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Free memory buffers */ - free(wbuf); -} /* test_select_fill_all() */ - -/**************************************************************** -** -** test_select_fill_point(): Test basic H5S (dataspace) selection code. -** Tests filling "point" selections -** -****************************************************************/ -static void -test_select_fill_point(hssize_t *offset) -{ - hid_t sid1; /* Dataspace ID */ - hsize_t dims1[] = {SPACE7_DIM1, SPACE7_DIM2}; - hssize_t real_offset[SPACE7_RANK]; /* Actual offset to use */ - hsize_t points[5][SPACE7_RANK] = {{2, 4}, {3, 8}, {8, 4}, {7, 5}, {7, 7}}; - size_t num_points = 5; /* Number of points selected */ - int fill_value; /* Fill value */ - fill_iter_info iter_info; /* Iterator information structure */ - unsigned *wbuf, /* buffer to write to disk */ - *tbuf; /* temporary buffer pointer */ - unsigned u, v, w; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Filling 'point' Selections\n")); - - /* Allocate memory buffer */ - wbuf = (unsigned *)malloc(sizeof(unsigned) * SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(wbuf, "malloc"); - - /* Initialize memory buffer */ - for (u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++) - *tbuf++ = (unsigned short)(u * SPACE7_DIM2) + v; - - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE7_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Select "point" selection */ - ret = H5Sselect_elements(sid1, H5S_SELECT_SET, num_points, (const hsize_t *)points); - CHECK(ret, FAIL, "H5Sselect_elements"); - - if (offset != NULL) { - memcpy(real_offset, offset, SPACE7_RANK * sizeof(hssize_t)); - - /* Set offset, if provided */ - ret = H5Soffset_simple(sid1, real_offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - } /* end if */ - else - memset(real_offset, 0, SPACE7_RANK * sizeof(hssize_t)); - - /* Set fill value */ - fill_value = SPACE7_FILL; - - /* Fill selection in memory */ - ret = H5Dfill(&fill_value, H5T_NATIVE_INT, wbuf, H5T_NATIVE_UINT, sid1); - CHECK(ret, FAIL, "H5Dfill"); - - /* Verify memory buffer the hard way... */ - for (u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++, tbuf++) { - for (w = 0; w < (unsigned)num_points; w++) { - if (u == (unsigned)(points[w][0] + (hsize_t)real_offset[0]) && - v == (unsigned)(points[w][1] + (hsize_t)real_offset[1])) { - if (*tbuf != (unsigned)fill_value) - TestErrPrintf("Error! v=%u, u=%u, *tbuf=%u, fill_value=%u\n", v, u, *tbuf, - (unsigned)fill_value); - break; - } /* end if */ - } /* end for */ - if (w == (unsigned)num_points && *tbuf != ((u * SPACE7_DIM2) + v)) - TestErrPrintf("Error! v=%d, u=%d, *tbuf=%u, should be: %u\n", v, u, *tbuf, - ((u * SPACE7_DIM2) + v)); - } /* end for */ - - /* Initialize the iterator structure */ - iter_info.fill_value = SPACE7_FILL; - iter_info.curr_coord = 0; - iter_info.coords = (hsize_t *)points; - - /* Add in the offset */ - for (u = 0; u < (unsigned)num_points; u++) { - points[u][0] = (hsize_t)((hssize_t)points[u][0] + real_offset[0]); - points[u][1] = (hsize_t)((hssize_t)points[u][1] + real_offset[1]); - } /* end for */ - - /* Iterate through selection, verifying correct data */ - ret = H5Diterate(wbuf, H5T_NATIVE_UINT, sid1, test_select_hyper_iter3, &iter_info); - CHECK(ret, FAIL, "H5Diterate"); - - /* Close dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Free memory buffers */ - free(wbuf); -} /* test_select_fill_point() */ - -/**************************************************************** -** -** test_select_fill_hyper_simple(): Test basic H5S (dataspace) selection code. -** Tests filling "simple" (i.e. one block) hyperslab selections -** -****************************************************************/ -static void -test_select_fill_hyper_simple(hssize_t *offset) -{ - hid_t sid1; /* Dataspace ID */ - hsize_t dims1[] = {SPACE7_DIM1, SPACE7_DIM2}; - hssize_t real_offset[SPACE7_RANK]; /* Actual offset to use */ - hsize_t start[SPACE7_RANK]; /* Hyperslab start */ - hsize_t count[SPACE7_RANK]; /* Hyperslab block size */ - size_t num_points; /* Number of points in selection */ - hsize_t points[16][SPACE7_RANK]; /* Coordinates selected */ - int fill_value; /* Fill value */ - fill_iter_info iter_info; /* Iterator information structure */ - unsigned *wbuf, /* buffer to write to disk */ - *tbuf; /* temporary buffer pointer */ - unsigned u, v; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Filling Simple 'hyperslab' Selections\n")); - - /* Allocate memory buffer */ - wbuf = (unsigned *)malloc(sizeof(unsigned) * SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(wbuf, "malloc"); - - /* Initialize memory buffer */ - for (u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++) - *tbuf++ = (unsigned short)(u * SPACE7_DIM2) + v; - - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE7_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Select "hyperslab" selection */ - start[0] = 3; - start[1] = 3; - count[0] = 4; - count[1] = 4; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - if (offset != NULL) { - memcpy(real_offset, offset, SPACE7_RANK * sizeof(hssize_t)); - - /* Set offset, if provided */ - ret = H5Soffset_simple(sid1, real_offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - } /* end if */ - else - memset(real_offset, 0, SPACE7_RANK * sizeof(hssize_t)); - - /* Set fill value */ - fill_value = SPACE7_FILL; - - /* Fill selection in memory */ - ret = H5Dfill(&fill_value, H5T_NATIVE_INT, wbuf, H5T_NATIVE_UINT, sid1); - CHECK(ret, FAIL, "H5Dfill"); - - /* Verify memory buffer the hard way... */ - for (u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++, tbuf++) { - if ((u >= (unsigned)((hssize_t)start[0] + real_offset[0]) && - u < (unsigned)((hssize_t)(start[0] + count[0]) + real_offset[0])) && - (v >= (unsigned)((hssize_t)start[1] + real_offset[1]) && - v < (unsigned)((hssize_t)(start[1] + count[1]) + real_offset[1]))) { - if (*tbuf != (unsigned)fill_value) - TestErrPrintf("Error! v=%u, u=%u, *tbuf=%u, fill_value=%u\n", v, u, *tbuf, - (unsigned)fill_value); - } /* end if */ - else { - if (*tbuf != ((unsigned)(u * SPACE7_DIM2) + v)) - TestErrPrintf("Error! v=%u, u=%u, *tbuf=%u, should be: %u\n", v, u, *tbuf, - ((u * SPACE7_DIM2) + v)); - } /* end else */ - } /* end for */ - - /* Initialize the iterator structure */ - iter_info.fill_value = SPACE7_FILL; - iter_info.curr_coord = 0; - iter_info.coords = (hsize_t *)points; - - /* Set the coordinates of the selection (with the offset) */ - for (u = 0, num_points = 0; u < (unsigned)count[0]; u++) - for (v = 0; v < (unsigned)count[1]; v++, num_points++) { - points[num_points][0] = (hsize_t)((hssize_t)(u + start[0]) + real_offset[0]); - points[num_points][1] = (hsize_t)((hssize_t)(v + start[1]) + real_offset[1]); - } /* end for */ - - /* Iterate through selection, verifying correct data */ - ret = H5Diterate(wbuf, H5T_NATIVE_UINT, sid1, test_select_hyper_iter3, &iter_info); - CHECK(ret, FAIL, "H5Diterate"); - - /* Close dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Free memory buffers */ - free(wbuf); -} /* test_select_fill_hyper_simple() */ - -/**************************************************************** -** -** test_select_fill_hyper_regular(): Test basic H5S (dataspace) selection code. -** Tests filling "regular" (i.e. strided block) hyperslab selections -** -****************************************************************/ -static void -test_select_fill_hyper_regular(hssize_t *offset) -{ - hid_t sid1; /* Dataspace ID */ - hsize_t dims1[] = {SPACE7_DIM1, SPACE7_DIM2}; - hssize_t real_offset[SPACE7_RANK]; /* Actual offset to use */ - hsize_t start[SPACE7_RANK]; /* Hyperslab start */ - hsize_t stride[SPACE7_RANK]; /* Hyperslab stride size */ - hsize_t count[SPACE7_RANK]; /* Hyperslab block count */ - hsize_t block[SPACE7_RANK]; /* Hyperslab block size */ - hsize_t points[16][SPACE7_RANK] = { - {2, 2}, {2, 3}, {2, 6}, {2, 7}, {3, 2}, {3, 3}, {3, 6}, {3, 7}, - {6, 2}, {6, 3}, {6, 6}, {6, 7}, {7, 2}, {7, 3}, {7, 6}, {7, 7}, - }; - size_t num_points = 16; /* Number of points selected */ - int fill_value; /* Fill value */ - fill_iter_info iter_info; /* Iterator information structure */ - unsigned *wbuf, /* buffer to write to disk */ - *tbuf; /* temporary buffer pointer */ - unsigned u, v, w; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Filling Regular 'hyperslab' Selections\n")); - - /* Allocate memory buffer */ - wbuf = (unsigned *)malloc(sizeof(unsigned) * SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(wbuf, "malloc"); - - /* Initialize memory buffer */ - for (u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++) - *tbuf++ = (u * SPACE7_DIM2) + v; - - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE7_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Select "hyperslab" selection */ - start[0] = 2; - start[1] = 2; - stride[0] = 4; - stride[1] = 4; - count[0] = 2; - count[1] = 2; - block[0] = 2; - block[1] = 2; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - if (offset != NULL) { - memcpy(real_offset, offset, SPACE7_RANK * sizeof(hssize_t)); - - /* Set offset, if provided */ - ret = H5Soffset_simple(sid1, real_offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - } /* end if */ - else - memset(real_offset, 0, SPACE7_RANK * sizeof(hssize_t)); - - /* Set fill value */ - fill_value = SPACE7_FILL; - - /* Fill selection in memory */ - ret = H5Dfill(&fill_value, H5T_NATIVE_INT, wbuf, H5T_NATIVE_UINT, sid1); - CHECK(ret, FAIL, "H5Dfill"); - - /* Verify memory buffer the hard way... */ - for (u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++, tbuf++) { - for (w = 0; w < (unsigned)num_points; w++) { - if (u == (unsigned)((hssize_t)points[w][0] + real_offset[0]) && - v == (unsigned)((hssize_t)points[w][1] + real_offset[1])) { - if (*tbuf != (unsigned)fill_value) - TestErrPrintf("Error! v=%u, u=%u, *tbuf=%u, fill_value=%u\n", v, u, *tbuf, - (unsigned)fill_value); - break; - } /* end if */ - } /* end for */ - if (w == (unsigned)num_points && *tbuf != ((u * SPACE7_DIM2) + v)) - TestErrPrintf("Error! v=%d, u=%d, *tbuf=%u, should be: %u\n", v, u, *tbuf, - ((u * SPACE7_DIM2) + v)); - } /* end for */ - - /* Initialize the iterator structure */ - iter_info.fill_value = SPACE7_FILL; - iter_info.curr_coord = 0; - iter_info.coords = (hsize_t *)points; - - /* Add in the offset */ - for (u = 0; u < (unsigned)num_points; u++) { - points[u][0] = (hsize_t)((hssize_t)points[u][0] + real_offset[0]); - points[u][1] = (hsize_t)((hssize_t)points[u][1] + real_offset[1]); - } /* end for */ - - /* Iterate through selection, verifying correct data */ - ret = H5Diterate(wbuf, H5T_NATIVE_UINT, sid1, test_select_hyper_iter3, &iter_info); - CHECK(ret, FAIL, "H5Diterate"); - - /* Close dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Free memory buffers */ - free(wbuf); -} /* test_select_fill_hyper_regular() */ - -/**************************************************************** -** -** test_select_fill_hyper_irregular(): Test basic H5S (dataspace) selection code. -** Tests filling "irregular" (i.e. combined blocks) hyperslab selections -** -****************************************************************/ -static void -test_select_fill_hyper_irregular(hssize_t *offset) -{ - hid_t sid1; /* Dataspace ID */ - hsize_t dims1[] = {SPACE7_DIM1, SPACE7_DIM2}; - hssize_t real_offset[SPACE7_RANK]; /* Actual offset to use */ - hsize_t start[SPACE7_RANK]; /* Hyperslab start */ - hsize_t count[SPACE7_RANK]; /* Hyperslab block count */ - hsize_t points[32][SPACE7_RANK] = { - /* Yes, some of the are duplicated.. */ - {2, 2}, {2, 3}, {2, 4}, {2, 5}, {3, 2}, {3, 3}, {3, 4}, {3, 5}, {4, 2}, {4, 3}, {4, 4}, - {4, 5}, {5, 2}, {5, 3}, {5, 4}, {5, 5}, {4, 4}, {4, 5}, {4, 6}, {4, 7}, {5, 4}, {5, 5}, - {5, 6}, {5, 7}, {6, 4}, {6, 5}, {6, 6}, {6, 7}, {7, 4}, {7, 5}, {7, 6}, {7, 7}, - }; - hsize_t iter_points[28][SPACE7_RANK] = { - /* Coordinates, as iterated through */ - {2, 2}, {2, 3}, {2, 4}, {2, 5}, {3, 2}, {3, 3}, {3, 4}, {3, 5}, {4, 2}, {4, 3}, - {4, 4}, {4, 5}, {4, 6}, {4, 7}, {5, 2}, {5, 3}, {5, 4}, {5, 5}, {5, 6}, {5, 7}, - {6, 4}, {6, 5}, {6, 6}, {6, 7}, {7, 4}, {7, 5}, {7, 6}, {7, 7}, - }; - size_t num_points = 32; /* Number of points selected */ - size_t num_iter_points = 28; /* Number of resulting points */ - int fill_value; /* Fill value */ - fill_iter_info iter_info; /* Iterator information structure */ - unsigned *wbuf, /* buffer to write to disk */ - *tbuf; /* temporary buffer pointer */ - unsigned u, v, w; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Filling Irregular 'hyperslab' Selections\n")); - - /* Allocate memory buffer */ - wbuf = (unsigned *)malloc(sizeof(unsigned) * SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(wbuf, "malloc"); - - /* Initialize memory buffer */ - for (u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++) - *tbuf++ = (u * SPACE7_DIM2) + v; - - /* Create dataspace for dataset on disk */ - sid1 = H5Screate_simple(SPACE7_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Select first "hyperslab" selection */ - start[0] = 2; - start[1] = 2; - count[0] = 4; - count[1] = 4; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Combine with second "hyperslab" selection */ - start[0] = 4; - start[1] = 4; - count[0] = 4; - count[1] = 4; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_OR, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - if (offset != NULL) { - memcpy(real_offset, offset, SPACE7_RANK * sizeof(hssize_t)); - - /* Set offset, if provided */ - ret = H5Soffset_simple(sid1, real_offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - } /* end if */ - else - memset(real_offset, 0, SPACE7_RANK * sizeof(hssize_t)); - - /* Set fill value */ - fill_value = SPACE7_FILL; - - /* Fill selection in memory */ - ret = H5Dfill(&fill_value, H5T_NATIVE_INT, wbuf, H5T_NATIVE_UINT, sid1); - CHECK(ret, FAIL, "H5Dfill"); - - /* Verify memory buffer the hard way... */ - for (u = 0, tbuf = wbuf; u < SPACE7_DIM1; u++) - for (v = 0; v < SPACE7_DIM2; v++, tbuf++) { - for (w = 0; w < (unsigned)num_points; w++) { - if (u == (unsigned)((hssize_t)points[w][0] + real_offset[0]) && - v == (unsigned)((hssize_t)points[w][1] + real_offset[1])) { - if (*tbuf != (unsigned)fill_value) - TestErrPrintf("Error! v=%u, u=%u, *tbuf=%u, fill_value=%u\n", v, u, *tbuf, - (unsigned)fill_value); - break; - } /* end if */ - } /* end for */ - if (w == (unsigned)num_points && *tbuf != ((u * SPACE7_DIM2) + v)) - TestErrPrintf("Error! v=%u, u=%u, *tbuf=%u, should be: %u\n", v, u, *tbuf, - ((u * SPACE7_DIM2) + v)); - } /* end for */ - - /* Initialize the iterator structure */ - iter_info.fill_value = SPACE7_FILL; - iter_info.curr_coord = 0; - iter_info.coords = (hsize_t *)iter_points; - - /* Add in the offset */ - for (u = 0; u < (unsigned)num_iter_points; u++) { - iter_points[u][0] = (hsize_t)((hssize_t)iter_points[u][0] + real_offset[0]); - iter_points[u][1] = (hsize_t)((hssize_t)iter_points[u][1] + real_offset[1]); - } /* end for */ - - /* Iterate through selection, verifying correct data */ - ret = H5Diterate(wbuf, H5T_NATIVE_UINT, sid1, test_select_hyper_iter3, &iter_info); - CHECK(ret, FAIL, "H5Diterate"); - - /* Close dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Free memory buffers */ - free(wbuf); -} /* test_select_fill_hyper_irregular() */ - -/**************************************************************** -** -** test_select_none(): Test basic H5S (dataspace) selection code. -** Tests I/O on 0-sized point selections -** -****************************************************************/ -static void -test_select_none(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims1[] = {SPACE7_DIM1, SPACE7_DIM2}; - hsize_t dims2[] = {SPACE7_DIM1, SPACE7_DIM2}; - uint8_t *wbuf, /* buffer to write to disk */ - *rbuf, /* buffer to read from disk */ - *tbuf; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing I/O on 0-sized Selections\n")); - - /* Allocate write & read buffers */ - wbuf = (uint8_t *)malloc(sizeof(uint8_t) * SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(wbuf, "malloc"); - rbuf = (uint8_t *)calloc(sizeof(uint8_t), SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize write buffer */ - for (i = 0, tbuf = wbuf; i < SPACE7_DIM1; i++) - for (j = 0; j < SPACE7_DIM2; j++) - *tbuf++ = (uint8_t)((i * SPACE7_DIM2) + j); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE7_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE7_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Make "none" selection in both disk and memory datasets */ - ret = H5Sselect_none(sid1); - CHECK(ret, FAIL, "H5Sselect_none"); - - ret = H5Sselect_none(sid2); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Attempt to read "nothing" from disk (before space is allocated) */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Write "nothing" to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Write "nothing" to disk (with a datatype conversion :-) */ - ret = H5Dwrite(dataset, H5T_NATIVE_INT, sid2, sid1, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Write "nothing" to disk (with NULL buffer argument) */ - ret = H5Dwrite(dataset, H5T_NATIVE_INT, sid2, sid1, H5P_DEFAULT, NULL); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read "nothing" from disk (with NULL buffer argument) */ - ret = H5Dread(dataset, H5T_NATIVE_INT, sid2, sid1, H5P_DEFAULT, NULL); - CHECK(ret, FAIL, "H5Dread"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf); - free(rbuf); -} /* test_select_none() */ - -/**************************************************************** -** -** test_scalar_select(): Test basic H5S (dataspace) selection code. -** Tests selections on scalar dataspaces -** -****************************************************************/ -static void -test_scalar_select(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims2[] = {SPACE7_DIM1, SPACE7_DIM2}; - hsize_t coord1[SPACE7_RANK]; /* Coordinates for point selection */ - hsize_t start[SPACE7_RANK]; /* Hyperslab start */ - hsize_t count[SPACE7_RANK]; /* Hyperslab block count */ - uint8_t *wbuf_uint8, /* buffer to write to disk */ - rval_uint8, /* value read back in */ - *tbuf_uint8; /* temporary buffer pointer */ - unsigned short *wbuf_ushort, /* another buffer to write to disk */ - rval_ushort, /* value read back in */ - *tbuf_ushort; /* temporary buffer pointer */ - int i, j; /* Counters */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing I/O on Selections in Scalar Dataspaces\n")); - - /* Allocate write & read buffers */ - wbuf_uint8 = (uint8_t *)malloc(sizeof(uint8_t) * SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(wbuf_uint8, "malloc"); - wbuf_ushort = (unsigned short *)malloc(sizeof(unsigned short) * SPACE7_DIM1 * SPACE7_DIM2); - CHECK_PTR(wbuf_ushort, "malloc"); - - /* Initialize write buffers */ - for (i = 0, tbuf_uint8 = wbuf_uint8, tbuf_ushort = wbuf_ushort; i < SPACE7_DIM1; i++) - for (j = 0; j < SPACE7_DIM2; j++) { - *tbuf_uint8++ = (uint8_t)((i * SPACE7_DIM2) + j); - *tbuf_ushort++ = (unsigned short)((j * SPACE7_DIM2) + i); - } /* end for */ - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate(H5S_SCALAR); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate_simple(SPACE7_RANK, dims2, NULL); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Select one element in memory with a point selection */ - coord1[0] = 0; - coord1[1] = 2; - ret = H5Sselect_elements(sid2, H5S_SELECT_SET, (size_t)1, (const hsize_t *)&coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Write single point to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf_uint8); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read scalar element from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid1, sid1, H5P_DEFAULT, &rval_uint8); - CHECK(ret, FAIL, "H5Dread"); - - /* Check value read back in */ - if (rval_uint8 != *(wbuf_uint8 + 2)) - TestErrPrintf("Error! rval=%u, should be: *(wbuf+2)=%u\n", (unsigned)rval_uint8, - (unsigned)*(wbuf_uint8 + 2)); - - /* Write single point to disk (with a datatype conversion) */ - ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, sid1, H5P_DEFAULT, wbuf_ushort); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read scalar element from disk */ - ret = H5Dread(dataset, H5T_NATIVE_USHORT, sid1, sid1, H5P_DEFAULT, &rval_ushort); - CHECK(ret, FAIL, "H5Dread"); - - /* Check value read back in */ - if (rval_ushort != *(wbuf_ushort + 2)) - TestErrPrintf("Error! rval=%u, should be: *(wbuf+2)=%u\n", (unsigned)rval_ushort, - (unsigned)*(wbuf_ushort + 2)); - - /* Select one element in memory with a hyperslab selection */ - start[0] = 4; - start[1] = 3; - count[0] = 1; - count[1] = 1; - ret = H5Sselect_hyperslab(sid2, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Write single hyperslab element to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf_uint8); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read scalar element from disk */ - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid1, sid1, H5P_DEFAULT, &rval_uint8); - CHECK(ret, FAIL, "H5Dread"); - - /* Check value read back in */ - if (rval_uint8 != *(wbuf_uint8 + (SPACE7_DIM2 * 4) + 3)) - TestErrPrintf("Error! rval=%u, should be: *(wbuf+(SPACE7_DIM2*4)+3)=%u\n", (unsigned)rval_uint8, - (unsigned)*(wbuf_uint8 + (SPACE7_DIM2 * 4) + 3)); - - /* Write single hyperslab element to disk (with a datatype conversion) */ - ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, sid1, H5P_DEFAULT, wbuf_ushort); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read scalar element from disk */ - ret = H5Dread(dataset, H5T_NATIVE_USHORT, sid1, sid1, H5P_DEFAULT, &rval_ushort); - CHECK(ret, FAIL, "H5Dread"); - - /* Check value read back in */ - if (rval_ushort != *(wbuf_ushort + (SPACE7_DIM2 * 4) + 3)) - TestErrPrintf("Error! rval=%u, should be: *(wbuf+(SPACE7_DIM2*4)+3)=%u\n", (unsigned)rval_ushort, - (unsigned)*(wbuf_ushort + (SPACE7_DIM2 * 4) + 3)); - - /* Select no elements in memory & file with "none" selections */ - ret = H5Sselect_none(sid1); - CHECK(ret, FAIL, "H5Sselect_none"); - - ret = H5Sselect_none(sid2); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Write no data to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, wbuf_uint8); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Write no data to disk (with a datatype conversion) */ - ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, sid1, H5P_DEFAULT, wbuf_ushort); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free memory buffers */ - free(wbuf_uint8); - free(wbuf_ushort); -} /* test_scalar_select() */ - -/**************************************************************** -** -** test_scalar_select2(): Tests selections on scalar dataspace, -** verify H5Sselect_hyperslab and H5Sselect_elements fails for -** scalar dataspace. -** -****************************************************************/ -static void -test_scalar_select2(void) -{ - hid_t sid; /* Dataspace ID */ - hsize_t coord1[1]; /* Coordinates for point selection */ - hsize_t start[1]; /* Hyperslab start */ - hsize_t count[1]; /* Hyperslab block count */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing Selections in Scalar Dataspaces\n")); - - /* Create dataspace for dataset */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Select one element in memory with a point selection */ - coord1[0] = 0; - H5E_BEGIN_TRY - { - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)1, (const hsize_t *)&coord1); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sselect_elements"); - - /* Select one element in memory with a hyperslab selection */ - start[0] = 0; - count[0] = 0; - H5E_BEGIN_TRY - { - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, NULL, count, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select no elements in memory & file with "none" selection */ - ret = H5Sselect_none(sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Select all elements in memory & file with "all" selection */ - ret = H5Sselect_all(sid); - CHECK(ret, FAIL, "H5Sselect_all"); - - /* Close disk dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_scalar_select2() */ - -/**************************************************************** -** -** test_scalar_select3(): Test basic H5S (dataspace) selection code. -** Tests selections on scalar dataspaces in memory -** -****************************************************************/ -static void -test_scalar_select3(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1, sid2; /* Dataspace ID */ - hsize_t dims2[] = {SPACE7_DIM1, SPACE7_DIM2}; - hsize_t coord1[SPACE7_RANK]; /* Coordinates for point selection */ - hsize_t start[SPACE7_RANK]; /* Hyperslab start */ - hsize_t count[SPACE7_RANK]; /* Hyperslab block count */ - uint8_t wval_uint8, /* Value written out */ - rval_uint8; /* Value read in */ - unsigned short wval_ushort, /* Another value written out */ - rval_ushort; /* Another value read in */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing I/O on Selections in Scalar Dataspaces in Memory\n")); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid1 = H5Screate_simple(SPACE7_RANK, dims2, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create dataspace for writing buffer */ - sid2 = H5Screate(H5S_SCALAR); - CHECK(sid2, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", H5T_NATIVE_UCHAR, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Select one element in file with a point selection */ - coord1[0] = 0; - coord1[1] = 2; - ret = H5Sselect_elements(sid1, H5S_SELECT_SET, (size_t)1, (const hsize_t *)&coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Write single point to disk */ - wval_uint8 = 12; - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, &wval_uint8); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read scalar element from disk */ - rval_uint8 = 0; - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, &rval_uint8); - CHECK(ret, FAIL, "H5Dread"); - - /* Check value read back in */ - if (rval_uint8 != wval_uint8) - TestErrPrintf("%u: Error! rval=%u, should be: wval=%u\n", (unsigned)__LINE__, (unsigned)rval_uint8, - (unsigned)wval_uint8); - - /* Write single point to disk (with a datatype conversion) */ - wval_ushort = 23; - ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, sid1, H5P_DEFAULT, &wval_ushort); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read scalar element from disk */ - rval_ushort = 0; - ret = H5Dread(dataset, H5T_NATIVE_USHORT, sid2, sid1, H5P_DEFAULT, &rval_ushort); - CHECK(ret, FAIL, "H5Dread"); - - /* Check value read back in */ - if (rval_ushort != wval_ushort) - TestErrPrintf("%u: Error! rval=%u, should be: wval=%u\n", (unsigned)__LINE__, (unsigned)rval_ushort, - (unsigned)wval_ushort); - - /* Select one element in file with a hyperslab selection */ - start[0] = 4; - start[1] = 3; - count[0] = 1; - count[1] = 1; - ret = H5Sselect_hyperslab(sid1, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Write single hyperslab element to disk */ - wval_uint8 = 92; - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, &wval_uint8); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read scalar element from disk */ - rval_uint8 = 0; - ret = H5Dread(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, &rval_uint8); - CHECK(ret, FAIL, "H5Dread"); - - /* Check value read back in */ - if (rval_uint8 != wval_uint8) - TestErrPrintf("%u: Error! rval=%u, should be: wval=%u\n", (unsigned)__LINE__, (unsigned)rval_uint8, - (unsigned)wval_uint8); - - /* Write single hyperslab element to disk (with a datatype conversion) */ - wval_ushort = 107; - ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, sid1, H5P_DEFAULT, &wval_ushort); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read scalar element from disk */ - rval_ushort = 0; - ret = H5Dread(dataset, H5T_NATIVE_USHORT, sid2, sid1, H5P_DEFAULT, &rval_ushort); - CHECK(ret, FAIL, "H5Dread"); - - /* Check value read back in */ - if (rval_ushort != wval_ushort) - TestErrPrintf("%u: Error! rval=%u, should be: wval=%u\n", (unsigned)__LINE__, (unsigned)rval_ushort, - (unsigned)wval_ushort); - - /* Select no elements in memory & file with "none" selections */ - ret = H5Sselect_none(sid1); - CHECK(ret, FAIL, "H5Sselect_none"); - - ret = H5Sselect_none(sid2); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Write no data to disk */ - ret = H5Dwrite(dataset, H5T_NATIVE_UCHAR, sid2, sid1, H5P_DEFAULT, &wval_uint8); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Write no data to disk (with a datatype conversion) */ - ret = H5Dwrite(dataset, H5T_NATIVE_USHORT, sid2, sid1, H5P_DEFAULT, &wval_ushort); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close memory dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_scalar_select3() */ - -/**************************************************************** -** -** test_shape_same(): Tests selections on dataspace, verify that -** "shape same" routine is working correctly. -** -****************************************************************/ -static void -test_shape_same(void) -{ - hid_t all_sid; /* Dataspace ID with "all" selection */ - hid_t none_sid; /* Dataspace ID with "none" selection */ - hid_t single_pt_sid; /* Dataspace ID with single point selection */ - hid_t mult_pt_sid; /* Dataspace ID with multiple point selection */ - hid_t single_hyper_sid; /* Dataspace ID with single block hyperslab selection */ - hid_t single_hyper_all_sid; /* Dataspace ID with single block hyperslab - * selection that is the entire dataspace - */ - hid_t single_hyper_pt_sid; /* Dataspace ID with single block hyperslab - * selection that is the same as the single - * point selection - */ - hid_t regular_hyper_sid; /* Dataspace ID with regular hyperslab selection */ - hid_t irreg_hyper_sid; /* Dataspace ID with irregular hyperslab selection */ - hid_t none_hyper_sid; /* Dataspace ID with "no hyperslabs" selection */ - hid_t scalar_all_sid; /* ID for scalar dataspace with "all" selection */ - hid_t scalar_none_sid; /* ID for scalar dataspace with "none" selection */ - hid_t tmp_sid; /* Temporary dataspace ID */ - hsize_t dims[] = {SPACE9_DIM1, SPACE9_DIM2}; - hsize_t coord1[1][SPACE2_RANK]; /* Coordinates for single point selection */ - hsize_t coord2[SPACE9_DIM2][SPACE9_RANK]; /* Coordinates for multiple point selection */ - hsize_t start[SPACE9_RANK]; /* Hyperslab start */ - hsize_t stride[SPACE9_RANK]; /* Hyperslab stride */ - hsize_t count[SPACE9_RANK]; /* Hyperslab block count */ - hsize_t block[SPACE9_RANK]; /* Hyperslab block size */ - unsigned u, v; /* Local index variables */ - htri_t check; /* Shape comparison return value */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing Same Shape Comparisons\n")); - assert(SPACE9_DIM2 >= POINT1_NPOINTS); - - /* Create dataspace for "all" selection */ - all_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(all_sid, FAIL, "H5Screate_simple"); - - /* Select entire extent for dataspace */ - ret = H5Sselect_all(all_sid); - CHECK(ret, FAIL, "H5Sselect_all"); - - /* Create dataspace for "none" selection */ - none_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(none_sid, FAIL, "H5Screate_simple"); - - /* Un-Select entire extent for dataspace */ - ret = H5Sselect_none(none_sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Create dataspace for single point selection */ - single_pt_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(single_pt_sid, FAIL, "H5Screate_simple"); - - /* Select sequence of ten points for multiple point selection */ - coord1[0][0] = 2; - coord1[0][1] = 2; - ret = H5Sselect_elements(single_pt_sid, H5S_SELECT_SET, (size_t)1, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Create dataspace for multiple point selection */ - mult_pt_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(mult_pt_sid, FAIL, "H5Screate_simple"); - - /* Select sequence of ten points for multiple point selection */ - coord2[0][0] = 2; - coord2[0][1] = 2; - coord2[1][0] = 7; - coord2[1][1] = 2; - coord2[2][0] = 1; - coord2[2][1] = 4; - coord2[3][0] = 2; - coord2[3][1] = 6; - coord2[4][0] = 0; - coord2[4][1] = 8; - coord2[5][0] = 3; - coord2[5][1] = 2; - coord2[6][0] = 4; - coord2[6][1] = 4; - coord2[7][0] = 1; - coord2[7][1] = 0; - coord2[8][0] = 5; - coord2[8][1] = 1; - coord2[9][0] = 9; - coord2[9][1] = 3; - ret = H5Sselect_elements(mult_pt_sid, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord2); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Create dataspace for single hyperslab selection */ - single_hyper_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(single_hyper_sid, FAIL, "H5Screate_simple"); - - /* Select 10x10 hyperslab for single hyperslab selection */ - start[0] = 1; - start[1] = 1; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = (SPACE9_DIM1 - 2); - block[1] = (SPACE9_DIM2 - 2); - ret = H5Sselect_hyperslab(single_hyper_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for single hyperslab selection with entire extent selected */ - single_hyper_all_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(single_hyper_all_sid, FAIL, "H5Screate_simple"); - - /* Select entire extent for hyperslab selection */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = SPACE9_DIM1; - block[1] = SPACE9_DIM2; - ret = H5Sselect_hyperslab(single_hyper_all_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for single hyperslab selection with single point selected */ - single_hyper_pt_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(single_hyper_pt_sid, FAIL, "H5Screate_simple"); - - /* Select entire extent for hyperslab selection */ - start[0] = 2; - start[1] = 2; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(single_hyper_pt_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for regular hyperslab selection */ - regular_hyper_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(regular_hyper_sid, FAIL, "H5Screate_simple"); - - /* Select regular, strided hyperslab selection */ - start[0] = 2; - start[1] = 2; - stride[0] = 2; - stride[1] = 2; - count[0] = 5; - count[1] = 2; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(regular_hyper_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for irregular hyperslab selection */ - irreg_hyper_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(irreg_hyper_sid, FAIL, "H5Screate_simple"); - - /* Create irregular hyperslab selection by OR'ing two blocks together */ - start[0] = 2; - start[1] = 2; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(irreg_hyper_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 4; - start[1] = 4; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 3; - block[1] = 3; - ret = H5Sselect_hyperslab(irreg_hyper_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for "no" hyperslab selection */ - none_hyper_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(none_hyper_sid, FAIL, "H5Screate_simple"); - - /* Create "no" hyperslab selection by XOR'ing same blocks together */ - start[0] = 2; - start[1] = 2; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(none_hyper_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - ret = H5Sselect_hyperslab(none_hyper_sid, H5S_SELECT_XOR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create scalar dataspace for "all" selection */ - scalar_all_sid = H5Screate(H5S_SCALAR); - CHECK(scalar_all_sid, FAIL, "H5Screate"); - - /* Create scalar dataspace for "none" selection */ - scalar_none_sid = H5Screate(H5S_SCALAR); - CHECK(scalar_none_sid, FAIL, "H5Screate"); - - /* Un-Select entire extent for dataspace */ - ret = H5Sselect_none(scalar_none_sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Compare "all" selection to all the selections created */ - /* Compare against itself */ - check = H5Sselect_shape_same(all_sid, all_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(all_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(all_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "none" selection */ - check = H5Sselect_shape_same(all_sid, none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against single point selection */ - check = H5Sselect_shape_same(all_sid, single_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against multiple point selection */ - check = H5Sselect_shape_same(all_sid, mult_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "plain" single hyperslab selection */ - check = H5Sselect_shape_same(all_sid, single_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "all" single hyperslab selection */ - check = H5Sselect_shape_same(all_sid, single_hyper_all_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against "single point" single hyperslab selection */ - check = H5Sselect_shape_same(all_sid, single_hyper_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against regular, strided hyperslab selection */ - check = H5Sselect_shape_same(all_sid, regular_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against irregular hyperslab selection */ - check = H5Sselect_shape_same(all_sid, irreg_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(all_sid, none_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "all" hyperslab selection */ - check = H5Sselect_shape_same(all_sid, scalar_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "none" hyperslab selection */ - check = H5Sselect_shape_same(all_sid, scalar_none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare "none" selection to all the selections created */ - /* Compare against itself */ - check = H5Sselect_shape_same(none_sid, none_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(none_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(none_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "all" selection */ - check = H5Sselect_shape_same(none_sid, all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against single point selection */ - check = H5Sselect_shape_same(none_sid, single_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against multiple point selection */ - check = H5Sselect_shape_same(none_sid, mult_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "plain" single hyperslab selection */ - check = H5Sselect_shape_same(none_sid, single_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "all" single hyperslab selection */ - check = H5Sselect_shape_same(none_sid, single_hyper_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "single point" single hyperslab selection */ - check = H5Sselect_shape_same(none_sid, single_hyper_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against regular, strided hyperslab selection */ - check = H5Sselect_shape_same(none_sid, regular_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against irregular hyperslab selection */ - check = H5Sselect_shape_same(none_sid, irreg_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(none_sid, none_hyper_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against scalar "all" hyperslab selection */ - check = H5Sselect_shape_same(none_sid, scalar_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "none" hyperslab selection */ - check = H5Sselect_shape_same(none_sid, scalar_none_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare single point selection to all the selections created */ - /* Compare against itself */ - check = H5Sselect_shape_same(single_pt_sid, single_pt_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(single_pt_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(single_pt_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "all" selection */ - check = H5Sselect_shape_same(single_pt_sid, all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "none" selection */ - check = H5Sselect_shape_same(single_pt_sid, none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against multiple point selection */ - check = H5Sselect_shape_same(single_pt_sid, mult_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "plain" single hyperslab selection */ - check = H5Sselect_shape_same(single_pt_sid, single_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "all" single hyperslab selection */ - check = H5Sselect_shape_same(single_pt_sid, single_hyper_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "single point" single hyperslab selection */ - check = H5Sselect_shape_same(single_pt_sid, single_hyper_pt_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against regular, strided hyperslab selection */ - check = H5Sselect_shape_same(single_pt_sid, regular_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against irregular hyperslab selection */ - check = H5Sselect_shape_same(single_pt_sid, irreg_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(single_pt_sid, none_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "all" hyperslab selection */ - check = H5Sselect_shape_same(single_pt_sid, scalar_all_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against scalar "none" hyperslab selection */ - check = H5Sselect_shape_same(single_pt_sid, scalar_none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare multiple point selection to all the selections created */ - /* Compare against itself */ - check = H5Sselect_shape_same(mult_pt_sid, mult_pt_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(mult_pt_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(mult_pt_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "all" selection */ - check = H5Sselect_shape_same(mult_pt_sid, all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "none" selection */ - check = H5Sselect_shape_same(mult_pt_sid, none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against single point selection */ - check = H5Sselect_shape_same(mult_pt_sid, single_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "plain" single hyperslab selection */ - check = H5Sselect_shape_same(mult_pt_sid, single_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "all" single hyperslab selection */ - check = H5Sselect_shape_same(mult_pt_sid, single_hyper_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "single point" single hyperslab selection */ - check = H5Sselect_shape_same(mult_pt_sid, single_hyper_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against regular, strided hyperslab selection */ - check = H5Sselect_shape_same(mult_pt_sid, regular_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against irregular hyperslab selection */ - check = H5Sselect_shape_same(mult_pt_sid, irreg_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(mult_pt_sid, none_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "all" hyperslab selection */ - check = H5Sselect_shape_same(mult_pt_sid, scalar_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "none" hyperslab selection */ - check = H5Sselect_shape_same(mult_pt_sid, scalar_none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare single "normal" hyperslab selection to all the selections created */ - /* Compare against itself */ - check = H5Sselect_shape_same(single_hyper_sid, single_hyper_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(single_hyper_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(single_hyper_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "all" selection */ - check = H5Sselect_shape_same(single_hyper_sid, all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "none" selection */ - check = H5Sselect_shape_same(single_hyper_sid, none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against single point selection */ - check = H5Sselect_shape_same(single_hyper_sid, single_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against multiple point selection */ - check = H5Sselect_shape_same(single_hyper_sid, mult_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "all" single hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_sid, single_hyper_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "single point" single hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_sid, single_hyper_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against regular, strided hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_sid, regular_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against irregular hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_sid, irreg_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_sid, none_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - -#ifdef NOT_YET - /* In theory, these two selections are the same shape, but the - * H5Sselect_shape_same() routine is just not this sophisticated yet and it - * would take too much effort to make this work. The worst case is that the - * non-optimized chunk mapping routines will be invoked instead of the more - * optimized routines, so this only hurts performance, not correctness - */ - /* Construct point selection which matches "plain" hyperslab selection */ - /* Create dataspace for point selection */ - tmp_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(tmp_sid, FAIL, "H5Screate_simple"); - - /* Select sequence of points for point selection */ - for (u = 1; u < (SPACE9_DIM1 - 1); u++) { - for (v = 1; v < (SPACE9_DIM2 - 1); v++) { - coord2[v - 1][0] = u; - coord2[v - 1][1] = v; - } /* end for */ - - ret = H5Sselect_elements(tmp_sid, H5S_SELECT_APPEND, (SPACE9_DIM2 - 2), coord2); - CHECK(ret, FAIL, "H5Sselect_elements"); - } /* end for */ - - /* Compare against hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); -#endif /* NOT_YET */ - - /* Construct hyperslab selection which matches "plain" hyperslab selection */ - /* Create dataspace for hyperslab selection */ - tmp_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(tmp_sid, FAIL, "H5Screate_simple"); - - /* Un-select entire extent */ - ret = H5Sselect_none(tmp_sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Select sequence of rows for hyperslab selection */ - for (u = 1; u < (SPACE9_DIM1 - 1); u++) { - start[0] = u; - start[1] = 1; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 1; - block[1] = (SPACE9_DIM2 - 2); - ret = H5Sselect_hyperslab(tmp_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - } /* end for */ - - /* Compare against hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against scalar "all" hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_sid, scalar_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "none" hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_sid, scalar_none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare single "all" hyperslab selection to all the selections created */ - /* Compare against itself */ - check = H5Sselect_shape_same(single_hyper_all_sid, single_hyper_all_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(single_hyper_all_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(single_hyper_all_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "all" selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, all_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against "none" selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against single point selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, single_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against multiple point selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, mult_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "plain" single hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, single_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "single point" single hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, single_hyper_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against regular, strided hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, regular_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against irregular hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, irreg_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, none_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - -#ifdef NOT_YET - /* In theory, these two selections are the same shape, but the - * H5S_select_shape_same() routine is just not this sophisticated yet and it - * would take too much effort to make this work. The worst case is that the - * non-optimized chunk mapping routines will be invoked instead of the more - * optimized routines, so this only hurts performance, not correctness - */ - /* Construct point selection which matches "all" hyperslab selection */ - /* Create dataspace for point selection */ - tmp_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(tmp_sid, FAIL, "H5Screate_simple"); - - /* Select sequence of points for point selection */ - for (u = 0; u < SPACE9_DIM1; u++) { - for (v = 0; v < SPACE9_DIM2; v++) { - coord2[v][0] = u; - coord2[v][1] = v; - } /* end for */ - ret = H5Sselect_elements(tmp_sid, H5S_SELECT_APPEND, SPACE9_DIM2, coord2); - CHECK(ret, FAIL, "H5Sselect_elements"); - } /* end for */ - - /* Compare against hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); -#endif /* NOT_YET */ - - /* Construct hyperslab selection which matches "all" hyperslab selection */ - /* Create dataspace for hyperslab selection */ - tmp_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(tmp_sid, FAIL, "H5Screate_simple"); - - /* Un-select entire extent */ - ret = H5Sselect_none(tmp_sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Select sequence of rows for hyperslab selection */ - for (u = 0; u < SPACE9_DIM2; u++) { - start[0] = u; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 1; - block[1] = SPACE9_DIM2; - ret = H5Sselect_hyperslab(tmp_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - } /* end for */ - - /* Compare against hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against scalar "all" hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, scalar_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "none" hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_all_sid, scalar_none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare single "point" hyperslab selection to all the selections created */ - /* Compare against itself */ - check = H5Sselect_shape_same(single_hyper_pt_sid, single_hyper_pt_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(single_hyper_pt_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(single_hyper_pt_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "all" selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "none" selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against single point selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, single_pt_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against multiple point selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, mult_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "plain" single hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, single_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "all" single hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, single_hyper_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against regular, strided hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, regular_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against irregular hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, irreg_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, none_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "all" hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, scalar_all_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against scalar "none" hyperslab selection */ - check = H5Sselect_shape_same(single_hyper_pt_sid, scalar_none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare regular, strided hyperslab selection to all the selections created */ - /* Compare against itself */ - check = H5Sselect_shape_same(regular_hyper_sid, regular_hyper_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(regular_hyper_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(regular_hyper_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "all" selection */ - check = H5Sselect_shape_same(regular_hyper_sid, all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "none" selection */ - check = H5Sselect_shape_same(regular_hyper_sid, none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against single point selection */ - check = H5Sselect_shape_same(regular_hyper_sid, single_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against multiple point selection */ - check = H5Sselect_shape_same(regular_hyper_sid, mult_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "plain" single hyperslab selection */ - check = H5Sselect_shape_same(regular_hyper_sid, single_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "all" single hyperslab selection */ - check = H5Sselect_shape_same(regular_hyper_sid, single_hyper_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "single point" single hyperslab selection */ - check = H5Sselect_shape_same(regular_hyper_sid, single_hyper_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against irregular hyperslab selection */ - check = H5Sselect_shape_same(regular_hyper_sid, irreg_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(regular_hyper_sid, none_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Construct point selection which matches regular, strided hyperslab selection */ - /* Create dataspace for point selection */ - tmp_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(tmp_sid, FAIL, "H5Screate_simple"); - - /* Select sequence of points for point selection */ - for (u = 2; u < 11; u += 2) { - for (v = 0; v < 2; v++) { - coord2[v][0] = u; - coord2[v][1] = (v * 2) + 2; - } /* end for */ - ret = H5Sselect_elements(tmp_sid, H5S_SELECT_APPEND, (size_t)2, (const hsize_t *)coord2); - CHECK(ret, FAIL, "H5Sselect_elements"); - } /* end for */ - - /* Compare against hyperslab selection */ - check = H5Sselect_shape_same(regular_hyper_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Construct hyperslab selection which matches regular, strided hyperslab selection */ - /* Create dataspace for hyperslab selection */ - tmp_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(tmp_sid, FAIL, "H5Screate_simple"); - - /* Un-select entire extent */ - ret = H5Sselect_none(tmp_sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Select sequence of rows for hyperslab selection */ - for (u = 2; u < 11; u += 2) { - start[0] = u; - start[1] = 3; - stride[0] = 1; - stride[1] = 2; - count[0] = 1; - count[1] = 2; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(tmp_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - } /* end for */ - - /* Compare against hyperslab selection */ - check = H5Sselect_shape_same(regular_hyper_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Construct regular hyperslab selection with an offset which matches regular, strided hyperslab selection - */ - /* Create dataspace for hyperslab selection */ - tmp_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(tmp_sid, FAIL, "H5Screate_simple"); - - /* Select regular, strided hyperslab selection at an offset */ - start[0] = 1; - start[1] = 1; - stride[0] = 2; - stride[1] = 2; - count[0] = 5; - count[1] = 2; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(tmp_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Compare against hyperslab selection */ - check = H5Sselect_shape_same(regular_hyper_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against scalar "all" hyperslab selection */ - check = H5Sselect_shape_same(regular_hyper_sid, scalar_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "none" hyperslab selection */ - check = H5Sselect_shape_same(regular_hyper_sid, scalar_none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare irregular hyperslab selection to all the selections created */ - /* Compare against itself */ - check = H5Sselect_shape_same(irreg_hyper_sid, irreg_hyper_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(irreg_hyper_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(irreg_hyper_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "all" selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "none" selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against single point selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, single_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against multiple point selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, mult_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "plain" single hyperslab selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, single_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "all" single hyperslab selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, single_hyper_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "single point" single hyperslab selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, single_hyper_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against regular, strided hyperslab selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, regular_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, none_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Construct hyperslab selection which matches irregular hyperslab selection */ - /* Create dataspace for hyperslab selection */ - tmp_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(tmp_sid, FAIL, "H5Screate_simple"); - - start[0] = 2; - start[1] = 2; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(tmp_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Select sequence of columns for hyperslab selection */ - for (u = 0; u < 3; u++) { - start[0] = 4; - start[1] = u + 4; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 3; - block[1] = 1; - ret = H5Sselect_hyperslab(tmp_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - } /* end for */ - - /* Compare against hyperslab selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against scalar "all" hyperslab selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, scalar_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "none" hyperslab selection */ - check = H5Sselect_shape_same(irreg_hyper_sid, scalar_none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare scalar "all" dataspace with all selections created */ - - /* Compare against itself */ - check = H5Sselect_shape_same(scalar_all_sid, scalar_all_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(scalar_all_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(scalar_all_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "all" selection */ - check = H5Sselect_shape_same(scalar_all_sid, all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "none" selection */ - check = H5Sselect_shape_same(scalar_all_sid, none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against single point selection */ - check = H5Sselect_shape_same(scalar_all_sid, single_pt_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against multiple point selection */ - check = H5Sselect_shape_same(scalar_all_sid, mult_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "plain" single hyperslab selection */ - check = H5Sselect_shape_same(scalar_all_sid, single_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "all" single hyperslab selection */ - check = H5Sselect_shape_same(scalar_all_sid, single_hyper_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "single point" single hyperslab selection */ - check = H5Sselect_shape_same(scalar_all_sid, single_hyper_pt_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against regular, strided hyperslab selection */ - check = H5Sselect_shape_same(scalar_all_sid, regular_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against irregular hyperslab selection */ - check = H5Sselect_shape_same(scalar_all_sid, irreg_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(scalar_all_sid, none_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against scalar "none" hyperslab selection */ - check = H5Sselect_shape_same(scalar_all_sid, scalar_none_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare scalar "none" dataspace with all selections created */ - - /* Compare against itself */ - check = H5Sselect_shape_same(scalar_none_sid, scalar_none_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against copy of itself */ - tmp_sid = H5Scopy(scalar_none_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); - - check = H5Sselect_shape_same(scalar_none_sid, tmp_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Compare against "all" selection */ - check = H5Sselect_shape_same(scalar_none_sid, all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "none" selection */ - check = H5Sselect_shape_same(scalar_none_sid, none_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against single point selection */ - check = H5Sselect_shape_same(scalar_none_sid, single_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against multiple point selection */ - check = H5Sselect_shape_same(scalar_none_sid, mult_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "plain" single hyperslab selection */ - check = H5Sselect_shape_same(scalar_none_sid, single_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "all" single hyperslab selection */ - check = H5Sselect_shape_same(scalar_none_sid, single_hyper_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "single point" single hyperslab selection */ - check = H5Sselect_shape_same(scalar_none_sid, single_hyper_pt_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against regular, strided hyperslab selection */ - check = H5Sselect_shape_same(scalar_none_sid, regular_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against irregular hyperslab selection */ - check = H5Sselect_shape_same(scalar_none_sid, irreg_hyper_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "no" hyperslab selection */ - check = H5Sselect_shape_same(scalar_none_sid, none_hyper_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Compare against scalar "all" hyperslab selection */ - check = H5Sselect_shape_same(scalar_none_sid, scalar_all_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Close dataspaces */ - ret = H5Sclose(all_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(none_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(single_pt_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(mult_pt_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(single_hyper_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(single_hyper_all_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(single_hyper_pt_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(regular_hyper_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(irreg_hyper_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(none_hyper_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(scalar_all_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(scalar_none_sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_shape_same() */ - -/**************************************************************** -** -** test_shape_same_dr__smoke_check_1(): -** -** Create a square, 2-D dataspace (10 X 10), and select -** all of it. -** -** Similarly, create nine, 3-D dataspaces (10 X 10 X 10), -** and select (10 X 10 X 1) hyperslabs in each, three with -** the slab parallel to the xy plane, three parallel to the -** xz plane, and three parallel to the yz plane. -** -** Assuming that z is the fastest changing dimension, -** H5Sselect_shape_same() should return true when comparing -** the full 2-D space against any hyperslab parallel to the -** yz plane in the 3-D space, and false when comparing the -** full 2-D space against the other two hyperslabs. -** -** Also create two additional 3-D dataspaces (10 X 10 X 10), -** and select a (10 X 10 X 2) hyperslab parallel to the yz -** axis in one of them, and two parallel (10 X 10 X 1) hyper -** slabs parallel to the yz axis in the other. -** H5Sselect_shape_same() should return false when comparing -** each to the 2-D selection. -** -****************************************************************/ -static void -test_shape_same_dr__smoke_check_1(void) -{ - hid_t small_square_sid; - hid_t small_cube_xy_slice_0_sid; - hid_t small_cube_xy_slice_1_sid; - hid_t small_cube_xy_slice_2_sid; - hid_t small_cube_xz_slice_0_sid; - hid_t small_cube_xz_slice_1_sid; - hid_t small_cube_xz_slice_2_sid; - hid_t small_cube_yz_slice_0_sid; - hid_t small_cube_yz_slice_1_sid; - hid_t small_cube_yz_slice_2_sid; - hid_t small_cube_yz_slice_3_sid; - hid_t small_cube_yz_slice_4_sid; - hsize_t small_cube_dims[] = {10, 10, 10}; - hsize_t start[3]; - hsize_t stride[3]; - hsize_t count[3]; - hsize_t block[3]; - htri_t check; /* Shape comparison return value */ - herr_t ret; /* Generic return value */ - - MESSAGE(7, (" Smoke check 1: Slices through a cube.\n")); - - /* Create the 10 x 10 dataspace */ - small_square_sid = H5Screate_simple(2, small_cube_dims, NULL); - CHECK(small_square_sid, FAIL, "H5Screate_simple"); - - /* Create the 10 X 10 X 10 dataspaces for the hyperslab parallel to the xy axis */ - small_cube_xy_slice_0_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xy_slice_0_sid, FAIL, "H5Screate_simple"); - - small_cube_xy_slice_1_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xy_slice_1_sid, FAIL, "H5Screate_simple"); - - small_cube_xy_slice_2_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xy_slice_2_sid, FAIL, "H5Screate_simple"); - - start[0] = 0; /* x */ - start[1] = 0; /* y */ - start[2] = 0; /* z */ - - /* stride is a bit silly here, since we are only selecting a single */ - /* contiguous plane, but include it anyway, with values large enough */ - /* to ensure that we will only get the single block selected. */ - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 10; /* x */ - block[1] = 10; /* y */ - block[2] = 1; /* z */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_0_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[2] = 5; - ret = H5Sselect_hyperslab(small_cube_xy_slice_1_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[2] = 9; - ret = H5Sselect_hyperslab(small_cube_xy_slice_2_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create the 10 X 10 X 10 dataspaces for the hyperslab parallel to the xz axis */ - small_cube_xz_slice_0_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xz_slice_0_sid, FAIL, "H5Screate_simple"); - - small_cube_xz_slice_1_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xz_slice_1_sid, FAIL, "H5Screate_simple"); - - small_cube_xz_slice_2_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xz_slice_2_sid, FAIL, "H5Screate_simple"); - - start[0] = 0; /* x */ - start[1] = 0; /* y */ - start[2] = 0; /* z */ - - /* stride is a bit silly here, since we are only selecting a single */ - /* contiguous chunk, but include it anyway, with values large enough */ - /* to ensure that we will only get the single chunk. */ - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 10; /* x */ - block[1] = 1; /* y */ - block[2] = 10; /* z */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_0_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[1] = 4; - ret = H5Sselect_hyperslab(small_cube_xz_slice_1_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[1] = 9; - ret = H5Sselect_hyperslab(small_cube_xz_slice_2_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create the 10 X 10 X 10 dataspaces for the hyperslabs parallel to the yz axis */ - small_cube_yz_slice_0_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_0_sid, FAIL, "H5Screate_simple"); - - small_cube_yz_slice_1_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_1_sid, FAIL, "H5Screate_simple"); - - small_cube_yz_slice_2_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_2_sid, FAIL, "H5Screate_simple"); - - small_cube_yz_slice_3_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_3_sid, FAIL, "H5Screate_simple"); - - small_cube_yz_slice_4_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_4_sid, FAIL, "H5Screate_simple"); - - start[0] = 0; /* x */ - start[1] = 0; /* y */ - start[2] = 0; /* z */ - - /* stride is a bit silly here, since we are only selecting a single */ - /* contiguous chunk, but include it anyway, with values large enough */ - /* to ensure that we will only get the single chunk. */ - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 1; /* x */ - block[1] = 10; /* y */ - block[2] = 10; /* z */ - - ret = H5Sselect_hyperslab(small_cube_yz_slice_0_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 4; - ret = H5Sselect_hyperslab(small_cube_yz_slice_1_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 9; - ret = H5Sselect_hyperslab(small_cube_yz_slice_2_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 4; - block[0] = 2; - ret = H5Sselect_hyperslab(small_cube_yz_slice_3_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 3; - block[0] = 1; - ret = H5Sselect_hyperslab(small_cube_yz_slice_4_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 6; - ret = H5Sselect_hyperslab(small_cube_yz_slice_4_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* setup is done -- run the tests: */ - - /* Compare against "xy" selection */ - check = H5Sselect_shape_same(small_cube_xy_slice_0_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xy_slice_1_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xy_slice_2_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "xz" selection */ - check = H5Sselect_shape_same(small_cube_xz_slice_0_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xz_slice_1_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xz_slice_2_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "yz" selection */ - check = H5Sselect_shape_same(small_cube_yz_slice_0_sid, small_square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_yz_slice_1_sid, small_square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_yz_slice_2_sid, small_square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_yz_slice_3_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_yz_slice_4_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Close dataspaces */ - ret = H5Sclose(small_square_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xy_slice_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xy_slice_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xy_slice_2_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xz_slice_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xz_slice_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xz_slice_2_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_2_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_3_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_4_sid); - CHECK(ret, FAIL, "H5Sclose"); - -} /* test_shape_same_dr__smoke_check_1() */ - -/**************************************************************** -** -** test_shape_same_dr__smoke_check_2(): -** -** Create a square, 2-D dataspace (10 X 10), and select -** a "checker board" hyperslab as follows: -** -** * * - - * * - - * * -** * * - - * * - - * * -** - - * * - - * * - - -** - - * * - - * * - - -** * * - - * * - - * * -** * * - - * * - - * * -** - - * * - - * * - - -** - - * * - - * * - - -** * * - - * * - - * * -** * * - - * * - - * * -** -** where asterisks indicate selected elements, and dashes -** indicate unselected elements. -** -** Similarly, create nine, 3-D dataspaces (10 X 10 X 10), -** and select similar (10 X 10 X 1) checker board hyper -** slabs in each, three with the slab parallel to the xy -** plane, three parallel to the xz plane, and three parallel -** to the yz plane. -** -** Assuming that z is the fastest changing dimension, -** H5Sselect_shape_same() should return true when comparing -** the 2-D space checker board selection against a checker -** board hyperslab parallel to the yz plane in the 3-D -** space, and false when comparing the 2-D checkerboard -** selection against two hyperslabs parallel to the xy -** or xz planes. -** -** Also create an additional 3-D dataspaces (10 X 10 X 10), -** and select a checker board parallel with the yz axis, -** save with some squares being on different planes. -** H5Sselect_shape_same() should return false when -** comparing this selection to the 2-D selection. -** -****************************************************************/ -static void -test_shape_same_dr__smoke_check_2(void) -{ - hid_t small_square_sid; - hid_t small_cube_xy_slice_0_sid; - hid_t small_cube_xy_slice_1_sid; - hid_t small_cube_xy_slice_2_sid; - hid_t small_cube_xz_slice_0_sid; - hid_t small_cube_xz_slice_1_sid; - hid_t small_cube_xz_slice_2_sid; - hid_t small_cube_yz_slice_0_sid; - hid_t small_cube_yz_slice_1_sid; - hid_t small_cube_yz_slice_2_sid; - hid_t small_cube_yz_slice_3_sid; - hsize_t small_cube_dims[] = {10, 10, 10}; - hsize_t start[3]; - hsize_t stride[3]; - hsize_t count[3]; - hsize_t block[3]; - htri_t check; /* Shape comparison return value */ - herr_t ret; /* Generic return value */ - - MESSAGE(7, (" Smoke check 2: Checker board slices through a cube.\n")); - - /* Create the 10 x 10 dataspace */ - small_square_sid = H5Screate_simple(2, small_cube_dims, NULL); - CHECK(small_square_sid, FAIL, "H5Screate_simple"); - - start[0] = 0; /* x */ - start[1] = 0; /* y */ - - stride[0] = 4; /* x */ - stride[1] = 4; /* y */ - - count[0] = 3; /* x */ - count[1] = 3; /* y */ - - block[0] = 2; /* x */ - block[1] = 2; /* y */ - ret = H5Sselect_hyperslab(small_square_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 2; /* x */ - start[1] = 2; /* y */ - - stride[0] = 4; /* x */ - stride[1] = 4; /* y */ - - count[0] = 2; /* x */ - count[1] = 2; /* y */ - - block[0] = 2; /* x */ - block[1] = 2; /* y */ - ret = H5Sselect_hyperslab(small_square_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create the 10 X 10 X 10 dataspaces for the hyperslab parallel to the xy axis */ - small_cube_xy_slice_0_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xy_slice_0_sid, FAIL, "H5Screate_simple"); - - small_cube_xy_slice_1_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xy_slice_1_sid, FAIL, "H5Screate_simple"); - - small_cube_xy_slice_2_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xy_slice_2_sid, FAIL, "H5Screate_simple"); - - start[0] = 0; /* x */ - start[1] = 0; /* y */ - start[2] = 0; /* z */ - - stride[0] = 4; /* x */ - stride[1] = 4; /* y */ - stride[2] = 20; /* z -- large enough that there will only be one slice */ - - count[0] = 3; /* x */ - count[1] = 3; /* y */ - count[2] = 1; /* z */ - - block[0] = 2; /* x */ - block[1] = 2; /* y */ - block[2] = 1; /* z */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_0_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[2] = 3; - ret = H5Sselect_hyperslab(small_cube_xy_slice_1_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[2] = 9; - ret = H5Sselect_hyperslab(small_cube_xy_slice_2_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 2; /* x */ - start[1] = 2; /* y */ - start[2] = 0; /* z */ - - stride[0] = 4; /* x */ - stride[1] = 4; /* y */ - stride[2] = 20; /* z -- large enough that there will only be one slice */ - - count[0] = 2; /* x */ - count[1] = 2; /* y */ - count[2] = 1; /* z */ - - block[0] = 2; /* x */ - block[1] = 2; /* y */ - block[2] = 1; /* z */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_0_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[2] = 3; - ret = H5Sselect_hyperslab(small_cube_xy_slice_1_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[2] = 9; - ret = H5Sselect_hyperslab(small_cube_xy_slice_2_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create the 10 X 10 X 10 dataspaces for the hyperslab parallel to the xz axis */ - small_cube_xz_slice_0_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xz_slice_0_sid, FAIL, "H5Screate_simple"); - - small_cube_xz_slice_1_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xz_slice_1_sid, FAIL, "H5Screate_simple"); - - small_cube_xz_slice_2_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xz_slice_2_sid, FAIL, "H5Screate_simple"); - - start[0] = 0; /* x */ - start[1] = 0; /* y */ - start[2] = 0; /* z */ - - stride[0] = 4; /* x */ - stride[1] = 20; /* y -- large enough that there will only be one slice */ - stride[2] = 4; /* z */ - - count[0] = 3; /* x */ - count[1] = 1; /* y */ - count[2] = 3; /* z */ - - block[0] = 2; /* x */ - block[1] = 1; /* y */ - block[2] = 2; /* z */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_0_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[1] = 5; - ret = H5Sselect_hyperslab(small_cube_xz_slice_1_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[1] = 9; - ret = H5Sselect_hyperslab(small_cube_xz_slice_2_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 2; /* x */ - start[1] = 0; /* y */ - start[2] = 2; /* z */ - - stride[0] = 4; /* x */ - stride[1] = 20; /* y -- large enough that there will only be one slice */ - stride[2] = 4; /* z */ - - count[0] = 2; /* x */ - count[1] = 1; /* y */ - count[2] = 2; /* z */ - - block[0] = 2; /* x */ - block[1] = 1; /* y */ - block[2] = 2; /* z */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_0_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[1] = 5; - ret = H5Sselect_hyperslab(small_cube_xz_slice_1_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[1] = 9; - ret = H5Sselect_hyperslab(small_cube_xz_slice_2_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create the 10 X 10 X 10 dataspaces for the hyperslabs parallel to the yz axis */ - small_cube_yz_slice_0_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_0_sid, FAIL, "H5Screate_simple"); - - small_cube_yz_slice_1_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_1_sid, FAIL, "H5Screate_simple"); - - small_cube_yz_slice_2_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_2_sid, FAIL, "H5Screate_simple"); - - small_cube_yz_slice_3_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_3_sid, FAIL, "H5Screate_simple"); - - start[0] = 0; /* x */ - start[1] = 0; /* y */ - start[2] = 0; /* z */ - - stride[0] = 20; /* x -- large enough that there will only be one slice */ - stride[1] = 4; /* y */ - stride[2] = 4; /* z */ - - count[0] = 1; /* x */ - count[1] = 3; /* y */ - count[2] = 3; /* z */ - - block[0] = 1; /* x */ - block[1] = 2; /* y */ - block[2] = 2; /* z */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_0_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 8; - ret = H5Sselect_hyperslab(small_cube_yz_slice_1_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 9; - ret = H5Sselect_hyperslab(small_cube_yz_slice_2_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 3; - ret = H5Sselect_hyperslab(small_cube_yz_slice_3_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 0; /* x */ - start[1] = 2; /* y */ - start[2] = 2; /* z */ - - stride[0] = 20; /* x -- large enough that there will only be one slice */ - stride[1] = 4; /* y */ - stride[2] = 4; /* z */ - - count[0] = 1; /* x */ - count[1] = 2; /* y */ - count[2] = 2; /* z */ - - block[0] = 1; /* x */ - block[1] = 2; /* y */ - block[2] = 2; /* z */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_0_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 8; - ret = H5Sselect_hyperslab(small_cube_yz_slice_1_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 9; - ret = H5Sselect_hyperslab(small_cube_yz_slice_2_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 4; - /* This test gets the right answer, but it fails the shape same - * test in an unexpected point. Bring this up with Quincey, as - * the oddness looks like it is not related to my code. - * -- JRM - */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_3_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* setup is done -- run the tests: */ - - /* Compare against "xy" selection */ - check = H5Sselect_shape_same(small_cube_xy_slice_0_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xy_slice_1_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xy_slice_2_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "xz" selection */ - check = H5Sselect_shape_same(small_cube_xz_slice_0_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xz_slice_1_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xz_slice_2_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "yz" selection */ - check = H5Sselect_shape_same(small_cube_yz_slice_0_sid, small_square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_yz_slice_1_sid, small_square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_yz_slice_2_sid, small_square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_yz_slice_3_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Close dataspaces */ - ret = H5Sclose(small_square_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xy_slice_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xy_slice_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xy_slice_2_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xz_slice_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xz_slice_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xz_slice_2_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_2_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_3_sid); - CHECK(ret, FAIL, "H5Sclose"); - -} /* test_shape_same_dr__smoke_check_2() */ - -/**************************************************************** -** -** test_shape_same_dr__smoke_check_3(): -** -** Create a square, 2-D dataspace (10 X 10), and select an -** irregular hyperslab as follows: -** -** y -** 9 - - - - - - - - - - -** 8 - - - - - - - - - - -** 7 - - - * * * * - - - -** 6 - - * * * * * - - - -** 5 - - * * - - - - - - -** 4 - - * * - * * - - - -** 3 - - * * - * * - - - -** 2 - - - - - - - - - - -** 1 - - - - - - - - - - -** 0 - - - - - - - - - - -** 0 1 2 3 4 5 6 7 8 9 x -** -** where asterisks indicate selected elements, and dashes -** indicate unselected elements. -** -** Similarly, create nine, 3-D dataspaces (10 X 10 X 10), -** and select similar irregular hyperslabs in each, three -** with the slab parallel to the xy plane, three parallel -** to the xz plane, and three parallel to the yz plane. -** Further, translate the irregular slab in 2/3rds of the -** cases. -** -** Assuming that z is the fastest changing dimension, -** H5Sselect_shape_same() should return true when -** comparing the 2-D irregular hyperslab selection -** against the irregular hyperslab selections parallel -** to the yz plane in the 3-D space, and false when -** comparing it against the irregular hyperslabs -** selections parallel to the xy or xz planes. -** -****************************************************************/ -static void -test_shape_same_dr__smoke_check_3(void) -{ - hid_t small_square_sid; - hid_t small_cube_xy_slice_0_sid; - hid_t small_cube_xy_slice_1_sid; - hid_t small_cube_xy_slice_2_sid; - hid_t small_cube_xz_slice_0_sid; - hid_t small_cube_xz_slice_1_sid; - hid_t small_cube_xz_slice_2_sid; - hid_t small_cube_yz_slice_0_sid; - hid_t small_cube_yz_slice_1_sid; - hid_t small_cube_yz_slice_2_sid; - hsize_t small_cube_dims[] = {10, 10, 10}; - hsize_t start[3]; - hsize_t stride[3]; - hsize_t count[3]; - hsize_t block[3]; - htri_t check; /* Shape comparison return value */ - herr_t ret; /* Generic return value */ - - MESSAGE(7, (" Smoke check 3: Offset subsets of slices through a cube.\n")); - - /* Create the 10 x 10 dataspace */ - small_square_sid = H5Screate_simple(2, small_cube_dims, NULL); - CHECK(small_square_sid, FAIL, "H5Screate_simple"); - - start[0] = 2; /* x */ - start[1] = 3; /* y */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - - block[0] = 2; /* x */ - block[1] = 4; /* y */ - ret = H5Sselect_hyperslab(small_square_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 3; /* x */ - start[1] = 6; /* y */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - - block[0] = 4; /* x */ - block[1] = 2; /* y */ - ret = H5Sselect_hyperslab(small_square_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 5; /* x */ - start[1] = 3; /* y */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - - block[0] = 2; /* x */ - block[1] = 2; /* y */ - ret = H5Sselect_hyperslab(small_square_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create the 10 X 10 X 10 dataspaces for the hyperslab parallel to the xy axis */ - small_cube_xy_slice_0_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xy_slice_0_sid, FAIL, "H5Screate_simple"); - - small_cube_xy_slice_1_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xy_slice_1_sid, FAIL, "H5Screate_simple"); - - small_cube_xy_slice_2_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xy_slice_2_sid, FAIL, "H5Screate_simple"); - - start[0] = 2; /* x */ - start[1] = 3; /* y */ - start[2] = 5; /* z */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 2; /* x */ - block[1] = 4; /* y */ - block[2] = 1; /* z */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_0_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the starting point to the origin */ - start[0] -= 1; /* x */ - start[1] -= 2; /* y */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_1_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the irregular selection to the upper right hand corner */ - start[0] += 5; /* x */ - start[1] += 5; /* y */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_2_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 3; /* x */ - start[1] = 6; /* y */ - start[2] = 5; /* z */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 4; /* x */ - block[1] = 2; /* y */ - block[2] = 1; /* z */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_0_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the starting point to the origin */ - start[0] -= 1; /* x */ - start[1] -= 2; /* y */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_1_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the irregular selection to the upper right hand corner */ - start[0] += 5; /* x */ - start[1] += 5; /* y */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_2_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 5; /* x */ - start[1] = 3; /* y */ - start[2] = 5; /* z */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 2; /* x */ - block[1] = 2; /* y */ - block[2] = 1; /* z */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_0_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the starting point to the origin */ - start[0] -= 1; /* x */ - start[1] -= 2; /* y */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_1_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the irregular selection to the upper right hand corner */ - start[0] += 5; /* x */ - start[1] += 5; /* y */ - ret = H5Sselect_hyperslab(small_cube_xy_slice_2_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create the 10 X 10 X 10 dataspaces for the hyperslab parallel to the xz axis */ - small_cube_xz_slice_0_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xz_slice_0_sid, FAIL, "H5Screate_simple"); - - small_cube_xz_slice_1_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xz_slice_1_sid, FAIL, "H5Screate_simple"); - - small_cube_xz_slice_2_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_xz_slice_2_sid, FAIL, "H5Screate_simple"); - - start[0] = 2; /* x */ - start[1] = 5; /* y */ - start[2] = 3; /* z */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 2; /* x */ - block[1] = 1; /* y */ - block[2] = 4; /* z */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_0_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the starting point to the origin */ - start[0] -= 1; /* x */ - start[2] -= 2; /* y */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_1_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the irregular selection to the upper right hand corner */ - start[0] += 5; /* x */ - start[2] += 5; /* y */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_2_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 3; /* x */ - start[1] = 5; /* y */ - start[2] = 6; /* z */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 4; /* x */ - block[1] = 1; /* y */ - block[2] = 2; /* z */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_0_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the starting point to the origin */ - start[0] -= 1; /* x */ - start[2] -= 2; /* y */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_1_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the irregular selection to the upper right hand corner */ - start[0] += 5; /* x */ - start[2] += 5; /* y */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_2_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 5; /* x */ - start[1] = 5; /* y */ - start[2] = 3; /* z */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 2; /* x */ - block[1] = 1; /* y */ - block[2] = 2; /* z */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_0_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the starting point to the origin */ - start[0] -= 1; /* x */ - start[2] -= 2; /* y */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_1_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the irregular selection to the upper right hand corner */ - start[0] += 5; /* x */ - start[2] += 5; /* y */ - ret = H5Sselect_hyperslab(small_cube_xz_slice_2_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* QAK: Start here. - */ - /* Create the 10 X 10 X 10 dataspaces for the hyperslabs parallel to the yz axis */ - small_cube_yz_slice_0_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_0_sid, FAIL, "H5Screate_simple"); - - small_cube_yz_slice_1_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_1_sid, FAIL, "H5Screate_simple"); - - small_cube_yz_slice_2_sid = H5Screate_simple(3, small_cube_dims, NULL); - CHECK(small_cube_yz_slice_2_sid, FAIL, "H5Screate_simple"); - - start[0] = 8; /* x */ - start[1] = 2; /* y */ - start[2] = 3; /* z */ - - stride[0] = 20; /* x -- large enough that there will only be one slice */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 1; /* x */ - block[1] = 2; /* y */ - block[2] = 4; /* z */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_0_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the starting point to the origin */ - start[1] -= 1; /* x */ - start[2] -= 2; /* y */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_1_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the irregular selection to the upper right hand corner */ - start[0] += 5; /* x */ - start[2] += 5; /* y */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_2_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 8; /* x */ - start[1] = 3; /* y */ - start[2] = 6; /* z */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 1; /* x */ - block[1] = 4; /* y */ - block[2] = 2; /* z */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_0_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the starting point to the origin */ - start[1] -= 1; /* x */ - start[2] -= 2; /* y */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_1_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the irregular selection to the upper right hand corner */ - start[0] += 5; /* x */ - start[2] += 5; /* y */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_2_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 8; /* x */ - start[1] = 5; /* y */ - start[2] = 3; /* z */ - - stride[0] = 20; /* x */ - stride[1] = 20; /* y */ - stride[2] = 20; /* z */ - - count[0] = 1; /* x */ - count[1] = 1; /* y */ - count[2] = 1; /* z */ - - block[0] = 1; /* x */ - block[1] = 2; /* y */ - block[2] = 2; /* z */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_0_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the starting point to the origin */ - start[1] -= 1; /* x */ - start[2] -= 2; /* y */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_1_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* move the irregular selection to the upper right hand corner */ - start[0] += 5; /* x */ - start[2] += 5; /* y */ - ret = H5Sselect_hyperslab(small_cube_yz_slice_2_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* setup is done -- run the tests: */ - - /* Compare against "xy" selection */ - check = H5Sselect_shape_same(small_cube_xy_slice_0_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xy_slice_1_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xy_slice_2_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "xz" selection */ - check = H5Sselect_shape_same(small_cube_xz_slice_0_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xz_slice_1_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_xz_slice_2_sid, small_square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Compare against "yz" selection */ - check = H5Sselect_shape_same(small_cube_yz_slice_0_sid, small_square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_yz_slice_1_sid, small_square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(small_cube_yz_slice_2_sid, small_square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - /* Close dataspaces */ - ret = H5Sclose(small_square_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xy_slice_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xy_slice_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xy_slice_2_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xz_slice_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xz_slice_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_xz_slice_2_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_cube_yz_slice_2_sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_shape_same_dr__smoke_check_3() */ - -/**************************************************************** -** -** test_shape_same_dr__smoke_check_4(): -** -** Create a square, 2-D dataspace (10 X 10), and select -** the entire space. -** -** Similarly, create 3-D and 4-D dataspaces: -** -** (1 X 10 X 10) -** (10 X 1 X 10) -** (10 X 10 X 1) -** (10 X 10 X 10) -** -** (1 X 1 X 10 X 10) -** (1 X 10 X 1 X 10) -** (1 X 10 X 10 X 1) -** (10 X 1 X 1 X 10) -** (10 X 1 X 10 X 1) -** (10 X 10 X 1 X 1) -** (10 X 1 X 10 X 10) -** -** And select these entire spaces as well. -** -** Compare the 2-D space against all the other spaces -** with H5Sselect_shape_same(). The (1 X 10 X 10) & -** (1 X 1 X 10 X 10) should return true. All others -** should return false. -** -****************************************************************/ -static void -test_shape_same_dr__smoke_check_4(void) -{ - hid_t square_sid; - hid_t three_d_space_0_sid; - hid_t three_d_space_1_sid; - hid_t three_d_space_2_sid; - hid_t three_d_space_3_sid; - hid_t four_d_space_0_sid; - hid_t four_d_space_1_sid; - hid_t four_d_space_2_sid; - hid_t four_d_space_3_sid; - hid_t four_d_space_4_sid; - hid_t four_d_space_5_sid; - hid_t four_d_space_6_sid; - hsize_t dims[] = {10, 10, 10, 10}; - htri_t check; /* Shape comparison return value */ - herr_t ret; /* Generic return value */ - - MESSAGE(7, (" Smoke check 4: Spaces of different dimension but same size.\n")); - - /* Create the 10 x 10 dataspace */ - square_sid = H5Screate_simple(2, dims, NULL); - CHECK(square_sid, FAIL, "H5Screate_simple"); - - /* create (1 X 10 X 10) dataspace */ - dims[0] = 1; - dims[1] = 10; - dims[2] = 10; - three_d_space_0_sid = H5Screate_simple(3, dims, NULL); - CHECK(three_d_space_0_sid, FAIL, "H5Screate_simple"); - - /* create (10 X 1 X 10) dataspace */ - dims[0] = 10; - dims[1] = 1; - dims[2] = 10; - three_d_space_1_sid = H5Screate_simple(3, dims, NULL); - CHECK(three_d_space_1_sid, FAIL, "H5Screate_simple"); - - /* create (10 X 10 X 1) dataspace */ - dims[0] = 10; - dims[1] = 10; - dims[2] = 1; - three_d_space_2_sid = H5Screate_simple(3, dims, NULL); - CHECK(three_d_space_2_sid, FAIL, "H5Screate_simple"); - - /* create (10 X 10 X 10) dataspace */ - dims[0] = 10; - dims[1] = 10; - dims[2] = 10; - three_d_space_3_sid = H5Screate_simple(3, dims, NULL); - CHECK(three_d_space_3_sid, FAIL, "H5Screate_simple"); - - /* create (1 X 1 X 10 X 10) dataspace */ - dims[0] = 1; - dims[1] = 1; - dims[2] = 10; - dims[3] = 10; - four_d_space_0_sid = H5Screate_simple(4, dims, NULL); - CHECK(four_d_space_0_sid, FAIL, "H5Screate_simple"); - - /* create (1 X 10 X 1 X 10) dataspace */ - dims[0] = 1; - dims[1] = 10; - dims[2] = 1; - dims[3] = 10; - four_d_space_1_sid = H5Screate_simple(4, dims, NULL); - CHECK(four_d_space_1_sid, FAIL, "H5Screate_simple"); - - /* create (1 X 10 X 10 X 1) dataspace */ - dims[0] = 1; - dims[1] = 10; - dims[2] = 10; - dims[3] = 1; - four_d_space_2_sid = H5Screate_simple(4, dims, NULL); - CHECK(four_d_space_2_sid, FAIL, "H5Screate_simple"); - - /* create (10 X 1 X 1 X 10) dataspace */ - dims[0] = 10; - dims[1] = 1; - dims[2] = 1; - dims[3] = 10; - four_d_space_3_sid = H5Screate_simple(4, dims, NULL); - CHECK(four_d_space_3_sid, FAIL, "H5Screate_simple"); - - /* create (10 X 1 X 10 X 1) dataspace */ - dims[0] = 10; - dims[1] = 1; - dims[2] = 10; - dims[3] = 1; - four_d_space_4_sid = H5Screate_simple(4, dims, NULL); - CHECK(four_d_space_4_sid, FAIL, "H5Screate_simple"); - - /* create (10 X 10 X 1 X 1) dataspace */ - dims[0] = 10; - dims[1] = 10; - dims[2] = 1; - dims[3] = 1; - four_d_space_5_sid = H5Screate_simple(4, dims, NULL); - CHECK(four_d_space_5_sid, FAIL, "H5Screate_simple"); - - /* create (10 X 1 X 10 X 10) dataspace */ - dims[0] = 10; - dims[1] = 1; - dims[2] = 10; - dims[3] = 10; - four_d_space_6_sid = H5Screate_simple(4, dims, NULL); - CHECK(four_d_space_6_sid, FAIL, "H5Screate_simple"); - - /* setup is done -- run the tests: */ - - check = H5Sselect_shape_same(three_d_space_0_sid, square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(three_d_space_1_sid, square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(three_d_space_2_sid, square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(three_d_space_3_sid, square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(four_d_space_0_sid, square_sid); - VERIFY(check, true, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(four_d_space_1_sid, square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(four_d_space_2_sid, square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(four_d_space_3_sid, square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(four_d_space_4_sid, square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(four_d_space_5_sid, square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - check = H5Sselect_shape_same(four_d_space_6_sid, square_sid); - VERIFY(check, false, "H5Sselect_shape_same"); - - /* Close dataspaces */ - ret = H5Sclose(square_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(three_d_space_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(three_d_space_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(three_d_space_2_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(three_d_space_3_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(four_d_space_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(four_d_space_1_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(four_d_space_2_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(four_d_space_3_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(four_d_space_4_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(four_d_space_5_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(four_d_space_6_sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_shape_same_dr__smoke_check_4() */ - -/**************************************************************** -** -** test_shape_same_dr__full_space_vs_slice(): Tests selection -** of a full n-cube dataspace vs an n-dimensional slice of -** of an m-cube (m > n) in a call to H5Sselect_shape_same(). -** Note that this test does not require the n-cube and the -** n-dimensional slice to have the same rank (although -** H5Sselect_shape_same() should always return false if -** they don't). -** -** Per Quincey's suggestion, only test up to 5 dimensional -** spaces. -** -****************************************************************/ -static void -test_shape_same_dr__full_space_vs_slice(int test_num, int small_rank, int large_rank, int offset, - hsize_t edge_size, bool dim_selected[], bool expected_result) -{ - char test_desc_0[128]; - char test_desc_1[256]; - int i; - hid_t n_cube_0_sid; /* the fully selected hyper cube */ - hid_t n_cube_1_sid; /* the hyper cube in which a slice is selected */ - hsize_t dims[SS_DR_MAX_RANK]; - hsize_t start[SS_DR_MAX_RANK]; - hsize_t *start_ptr; - hsize_t stride[SS_DR_MAX_RANK]; - hsize_t *stride_ptr; - hsize_t count[SS_DR_MAX_RANK]; - hsize_t *count_ptr; - hsize_t block[SS_DR_MAX_RANK]; - hsize_t *block_ptr; - htri_t check; /* Shape comparison return value */ - herr_t ret; /* Generic return value */ - - assert(0 < small_rank); - assert(small_rank <= large_rank); - assert(large_rank <= SS_DR_MAX_RANK); - assert(0 <= offset); - assert(offset < large_rank); - assert(edge_size > 0); - assert(edge_size <= 1000); - - snprintf(test_desc_0, sizeof(test_desc_0), "\tn-cube slice through m-cube (n <= m) test %d.\n", test_num); - MESSAGE(7, ("%s", test_desc_0)); - - /* This statement must be updated if SS_DR_MAX_RANK is changed */ - snprintf(test_desc_1, sizeof(test_desc_1), "\t\tranks: %d/%d offset: %d dim_selected: %d/%d/%d/%d/%d.\n", - small_rank, large_rank, offset, (int)dim_selected[0], (int)dim_selected[1], (int)dim_selected[2], - (int)dim_selected[3], (int)dim_selected[4]); - MESSAGE(7, ("%s", test_desc_1)); - - /* copy the edge size into the dims array */ - for (i = 0; i < SS_DR_MAX_RANK; i++) - dims[i] = edge_size; - - /* Create the small n-cube */ - n_cube_0_sid = H5Screate_simple(small_rank, dims, NULL); - CHECK(n_cube_0_sid, FAIL, "H5Screate_simple"); - - /* Create the large n-cube */ - n_cube_1_sid = H5Screate_simple(large_rank, dims, NULL); - CHECK(n_cube_1_sid, FAIL, "H5Screate_simple"); - - /* set up start, stride, count, and block for the hyperslab selection */ - for (i = 0; i < SS_DR_MAX_RANK; i++) { - stride[i] = 2 * edge_size; /* a bit silly in this case */ - count[i] = 1; - if (dim_selected[i]) { - start[i] = 0; - block[i] = edge_size; - } - else { - start[i] = (hsize_t)offset; - block[i] = 1; - } - } - - /* since large rank may be less than SS_DR_MAX_RANK, we may not - * use the entire start, stride, count, and block arrays. This - * is a problem, since it is inconvenient to set up the dim_selected - * array to reflect the large rank, and thus if large_rank < - * SS_DR_MAX_RANK, we need to hide the lower index entries - * from H5Sselect_hyperslab(). - * - * Do this by setting up pointers to the first valid entry in start, - * stride, count, and block below, and pass these pointers in - * to H5Sselect_hyperslab() instead of the array base addresses. - */ - - i = SS_DR_MAX_RANK - large_rank; - assert(i >= 0); - - start_ptr = &(start[i]); - stride_ptr = &(stride[i]); - count_ptr = &(count[i]); - block_ptr = &(block[i]); - - /* select the hyperslab */ - ret = H5Sselect_hyperslab(n_cube_1_sid, H5S_SELECT_SET, start_ptr, stride_ptr, count_ptr, block_ptr); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* setup is done -- run the test: */ - check = H5Sselect_shape_same(n_cube_0_sid, n_cube_1_sid); - VERIFY(check, expected_result, "H5Sselect_shape_same"); - - /* Close dataspaces */ - ret = H5Sclose(n_cube_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(n_cube_1_sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_shape_same_dr__full_space_vs_slice() */ - -/**************************************************************** -** -** test_shape_same_dr__run_full_space_vs_slice_tests(): -** -** Run the test_shape_same_dr__full_space_vs_slice() test -** over a variety of ranks and offsets. -** -** At present, we test H5Sselect_shape_same() with -** fully selected 1, 2, 3, and 4 cubes as one parameter, and -** 1, 2, 3, and 4 dimensional slices through a n-cube of rank -** no more than 5 (and at least the rank of the slice). -** We stop at rank 5, as Quincey suggested that it would be -** sufficient. -** -** All the n-cubes will have lengths of the same size, so -** H5Sselect_shape_same() should return true iff: -** -** 1) the rank for the fully selected n cube equals the -** number of dimensions selected in the slice through the -** m-cube (m >= n). -** -** 2) The dimensions selected in the slice through the m-cube -** are the dimensions with the most quickly changing -** indices. -** -****************************************************************/ -static void -test_shape_same_dr__run_full_space_vs_slice_tests(void) -{ - bool dim_selected[5]; - bool expected_result; - int i, j; - int v, w, x, y, z; - int test_num = 0; - int small_rank; - int large_rank; - hsize_t edge_size = 10; - - for (large_rank = 1; large_rank <= 5; large_rank++) { - for (small_rank = 1; small_rank <= large_rank; small_rank++) { - v = 0; - do { - if (v == 0) - dim_selected[0] = false; - else - dim_selected[0] = true; - - w = 0; - do { - if (w == 0) - dim_selected[1] = false; - else - dim_selected[1] = true; - - x = 0; - do { - if (x == 0) - dim_selected[2] = false; - else - dim_selected[2] = true; - - y = 0; - do { - if (y == 0) - dim_selected[3] = false; - else - dim_selected[3] = true; - - z = 0; - do { - if (z == 0) - dim_selected[4] = false; - else - dim_selected[4] = true; - - /* compute the expected result: */ - i = 0; - j = 4; - expected_result = true; - while ((i < small_rank) && expected_result) { - if (!dim_selected[j]) - expected_result = false; - i++; - j--; - } - - while ((i < large_rank) && expected_result) { - if (dim_selected[j]) - expected_result = false; - i++; - j--; - } - - /* everything is set up -- run the tests */ - - test_shape_same_dr__full_space_vs_slice(test_num++, small_rank, large_rank, 0, - edge_size, dim_selected, - expected_result); - - test_shape_same_dr__full_space_vs_slice(test_num++, small_rank, large_rank, - large_rank / 2, edge_size, - dim_selected, expected_result); - - test_shape_same_dr__full_space_vs_slice(test_num++, small_rank, large_rank, - large_rank - 1, edge_size, - dim_selected, expected_result); - - z++; - } while ((z < 2) && (large_rank >= 1)); - - y++; - } while ((y < 2) && (large_rank >= 2)); - - x++; - } while ((x < 2) && (large_rank >= 3)); - - w++; - } while ((w < 2) && (large_rank >= 4)); - - v++; - } while ((v < 2) && (large_rank >= 5)); - } /* end for */ - } /* end for */ -} /* test_shape_same_dr__run_full_space_vs_slice_tests() */ - -/**************************************************************** -** -** test_shape_same_dr__checkerboard(): Tests selection of a -** "checker board" subset of a full n-cube dataspace vs -** a "checker board" n-dimensional slice of an m-cube (m > n). -** in a call to H5Sselect_shape_same(). -** -** Note that this test does not require the n-cube and the -** n-dimensional slice to have the same rank (although -** H5Sselect_shape_same() should always return false if -** they don't). -** -** Per Quincey's suggestion, only test up to 5 dimensional -** spaces. -** -****************************************************************/ -static void -test_shape_same_dr__checkerboard(int test_num, int small_rank, int large_rank, int offset, hsize_t edge_size, - hsize_t checker_size, bool dim_selected[], bool expected_result) -{ - char test_desc_0[128]; - char test_desc_1[256]; - int i; - int dims_selected = 0; - hid_t n_cube_0_sid; /* the checker board selected - * hyper cube - */ - hid_t n_cube_1_sid; /* the hyper cube in which a - * checkerboard slice is selected - */ - hsize_t dims[SS_DR_MAX_RANK]; - hsize_t base_start[2]; - hsize_t start[SS_DR_MAX_RANK]; - hsize_t *start_ptr; - hsize_t base_stride[2]; - hsize_t stride[SS_DR_MAX_RANK]; - hsize_t *stride_ptr; - hsize_t base_count[2]; - hsize_t count[SS_DR_MAX_RANK]; - hsize_t *count_ptr; - hsize_t base_block[2]; - hsize_t block[SS_DR_MAX_RANK]; - hsize_t *block_ptr; - htri_t check; /* Shape comparison return value */ - herr_t ret; /* Generic return value */ - - assert(0 < small_rank); - assert(small_rank <= large_rank); - assert(large_rank <= SS_DR_MAX_RANK); - assert(0 < checker_size); - assert(checker_size <= edge_size); - assert(edge_size <= 1000); - assert(0 <= offset); - assert(offset < (int)edge_size); - - for (i = SS_DR_MAX_RANK - large_rank; i < SS_DR_MAX_RANK; i++) - if (dim_selected[i] == true) - dims_selected++; - - assert(dims_selected >= 0); - assert(dims_selected <= large_rank); - - snprintf(test_desc_0, sizeof(test_desc_0), - "\tcheckerboard n-cube slice through m-cube (n <= m) test %d.\n", test_num); - MESSAGE(7, ("%s", test_desc_0)); - - /* This statement must be updated if SS_DR_MAX_RANK is changed */ - snprintf(test_desc_1, sizeof(test_desc_1), - "\tranks: %d/%d edge/chkr size: %d/%d offset: %d dim_selected: %d/%d/%d/%d/%d:%d.\n", small_rank, - large_rank, (int)edge_size, (int)checker_size, offset, (int)dim_selected[0], - (int)dim_selected[1], (int)dim_selected[2], (int)dim_selected[3], (int)dim_selected[4], - dims_selected); - MESSAGE(7, ("%s", test_desc_1)); - - /* copy the edge size into the dims array */ - for (i = 0; i < SS_DR_MAX_RANK; i++) - dims[i] = edge_size; - - /* Create the small n-cube */ - n_cube_0_sid = H5Screate_simple(small_rank, dims, NULL); - CHECK(n_cube_0_sid, FAIL, "H5Screate_simple"); - - /* Select a "checkerboard" pattern in the small n-cube. - * - * In the 1-D case, the "checkerboard" would look like this: - * - * * * - - * * - - * * - * - * and in the 2-D case, it would look like this: - * - * * * - - * * - - * * - * * * - - * * - - * * - * - - * * - - * * - - - * - - * * - - * * - - - * * * - - * * - - * * - * * * - - * * - - * * - * - - * * - - * * - - - * - - * * - - * * - - - * * * - - * * - - * * - * * * - - * * - - * * - * - * In both cases, asterisks indicate selected elements, - * and dashes indicate unselected elements. - * - * 3-D and 4-D ascii art is somewhat painful, so I'll - * leave those selections to your imagination. :-) - * - * Note, that since the edge_size and checker_size are - * parameters that are passed in, the selection need - * not look exactly like the selection shown above. - * At present, the function allows checker sizes that - * are not even divisors of the edge size -- thus - * something like the following is also possible: - * - * * * * - - - * * * - - * * * * - - - * * * - - * * * * - - - * * * - - * - - - * * * - - - * - * - - - * * * - - - * - * - - - * * * - - - * - * * * * - - - * * * - - * * * * - - - * * * - - * * * * - - - * * * - - * - - - * * * - - - * - * - * As the above pattern can't be selected in one - * call to H5Sselect_hyperslab(), and since the - * values in the start, stride, count, and block - * arrays will be repeated over all entries in - * the selected space case, and over all selected - * dimensions in the selected hyperslab case, we - * compute these values first and store them in - * in the base_start, base_stride, base_count, - * and base_block arrays. - */ - - base_start[0] = 0; - base_start[1] = checker_size; - - base_stride[0] = 2 * checker_size; - base_stride[1] = 2 * checker_size; - - /* Note that the following computation depends on the C99 - * requirement that integer division discard any fraction - * (truncation towards zero) to function correctly. As we - * now require C99, this shouldn't be a problem, but noting - * it may save us some pain if we are ever obliged to support - * pre-C99 compilers again. - */ - - base_count[0] = edge_size / (checker_size * 2); - if ((edge_size % (checker_size * 2)) > 0) - base_count[0]++; - - base_count[1] = (edge_size - checker_size) / (checker_size * 2); - if (((edge_size - checker_size) % (checker_size * 2)) > 0) - base_count[1]++; - - base_block[0] = checker_size; - base_block[1] = checker_size; - - /* now setup start, stride, count, and block arrays for - * the first call to H5Sselect_hyperslab(). - */ - for (i = 0; i < SS_DR_MAX_RANK; i++) { - start[i] = base_start[0]; - stride[i] = base_stride[0]; - count[i] = base_count[0]; - block[i] = base_block[0]; - } /* end for */ - - ret = H5Sselect_hyperslab(n_cube_0_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* if small_rank == 1, or if edge_size == checker_size, we - * are done, as either there is no added dimension in which - * to place offset selected "checkers". - * - * Otherwise, set up start, stride, count and block, and - * make the additional selection. - */ - - if ((small_rank > 1) && (checker_size < edge_size)) { - for (i = 0; i < SS_DR_MAX_RANK; i++) { - start[i] = base_start[1]; - stride[i] = base_stride[1]; - count[i] = base_count[1]; - block[i] = base_block[1]; - } /* end for */ - - ret = H5Sselect_hyperslab(n_cube_0_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - } /* end if */ - - /* Weirdness alert: - * - * Some how, it seems that selections can extend beyond the - * boundaries of the target dataspace -- hence the following - * code to manually clip the selection back to the dataspace - * proper. - */ - for (i = 0; i < SS_DR_MAX_RANK; i++) { - start[i] = 0; - stride[i] = edge_size; - count[i] = 1; - block[i] = edge_size; - } /* end for */ - - ret = H5Sselect_hyperslab(n_cube_0_sid, H5S_SELECT_AND, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create the large n-cube */ - n_cube_1_sid = H5Screate_simple(large_rank, dims, NULL); - CHECK(n_cube_1_sid, FAIL, "H5Screate_simple"); - - /* Now select the checkerboard selection in the (possibly larger) n-cube. - * - * Since we have already calculated the base start, stride, count, - * and block, reuse the values in setting up start, stride, count, - * and block. - */ - for (i = 0; i < SS_DR_MAX_RANK; i++) { - if (dim_selected[i]) { - start[i] = base_start[0]; - stride[i] = base_stride[0]; - count[i] = base_count[0]; - block[i] = base_block[0]; - } /* end if */ - else { - start[i] = (hsize_t)offset; - stride[i] = (hsize_t)(2 * edge_size); - count[i] = 1; - block[i] = 1; - } /* end else */ - } /* end for */ - - /* Since large rank may be less than SS_DR_MAX_RANK, we may not - * use the entire start, stride, count, and block arrays. This - * is a problem, since it is inconvenient to set up the dim_selected - * array to reflect the large rank, and thus if large_rank < - * SS_DR_MAX_RANK, we need to hide the lower index entries - * from H5Sselect_hyperslab(). - * - * Do this by setting up pointers to the first valid entry in start, - * stride, count, and block below, and pass these pointers in - * to H5Sselect_hyperslab() instead of the array base addresses. - */ - - i = SS_DR_MAX_RANK - large_rank; - assert(i >= 0); - - start_ptr = &(start[i]); - stride_ptr = &(stride[i]); - count_ptr = &(count[i]); - block_ptr = &(block[i]); - - /* select the hyperslab */ - ret = H5Sselect_hyperslab(n_cube_1_sid, H5S_SELECT_SET, start_ptr, stride_ptr, count_ptr, block_ptr); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* As before, if the number of dimensions selected is less than or - * equal to 1, or if edge_size == checker_size, we are done, as - * either there is no added dimension in which to place offset selected - * "checkers", or the hyperslab is completely occupied by one - * "checker". - * - * Otherwise, set up start, stride, count and block, and - * make the additional selection. - */ - if ((dims_selected > 1) && (checker_size < edge_size)) { - for (i = 0; i < SS_DR_MAX_RANK; i++) { - if (dim_selected[i]) { - start[i] = base_start[1]; - stride[i] = base_stride[1]; - count[i] = base_count[1]; - block[i] = base_block[1]; - } /* end if */ - else { - start[i] = (hsize_t)offset; - stride[i] = (hsize_t)(2 * edge_size); - count[i] = 1; - block[i] = 1; - } /* end else */ - } /* end for */ - - ret = H5Sselect_hyperslab(n_cube_1_sid, H5S_SELECT_OR, start_ptr, stride_ptr, count_ptr, block_ptr); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - } /* end if */ - - /* Weirdness alert: - * - * Again, it seems that selections can extend beyond the - * boundaries of the target dataspace -- hence the following - * code to manually clip the selection back to the dataspace - * proper. - */ - for (i = 0; i < SS_DR_MAX_RANK; i++) { - start[i] = 0; - stride[i] = edge_size; - count[i] = 1; - block[i] = edge_size; - } /* end for */ - - ret = H5Sselect_hyperslab(n_cube_1_sid, H5S_SELECT_AND, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* setup is done -- run the test: */ - check = H5Sselect_shape_same(n_cube_0_sid, n_cube_1_sid); - VERIFY(check, expected_result, "H5Sselect_shape_same"); - - /* Close dataspaces */ - ret = H5Sclose(n_cube_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(n_cube_1_sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_shape_same_dr__checkerboard() */ - -/**************************************************************** -** -** test_shape_same_dr__run_checkerboard_tests(): -** -** In this set of tests, we test H5Sselect_shape_same() -** with a "checkerboard" selection of 1, 2, 3, and 4 cubes as -** one parameter, and 1, 2, 3, and 4 dimensional checkerboard -** slices through a n-cube of rank no more than 5 (and at -** least the rank of the slice). -** -** All the n-cubes will have lengths of the same size, so -** H5Sselect_shape_same() should return true iff: -** -** 1) the rank of the n cube equals the number of dimensions -** selected in the checker board slice through the m-cube -** (m >= n). -** -** 2) The dimensions selected in the checkerboard slice -** through the m-cube are the dimensions with the most -** quickly changing indices. -** -****************************************************************/ -static void -test_shape_same_dr__run_checkerboard_tests(void) -{ - bool dim_selected[5]; - bool expected_result; - int i, j; - int v, w, x, y, z; - int test_num = 0; - int small_rank; - int large_rank; - - for (large_rank = 1; large_rank <= 5; large_rank++) { - for (small_rank = 1; small_rank <= large_rank; small_rank++) { - v = 0; - do { - if (v == 0) - dim_selected[0] = false; - else - dim_selected[0] = true; - - w = 0; - do { - if (w == 0) - dim_selected[1] = false; - else - dim_selected[1] = true; - - x = 0; - do { - if (x == 0) - dim_selected[2] = false; - else - dim_selected[2] = true; - - y = 0; - do { - if (y == 0) - dim_selected[3] = false; - else - dim_selected[3] = true; - - z = 0; - do { - if (z == 0) - dim_selected[4] = false; - else - dim_selected[4] = true; - - /* compute the expected result: */ - i = 0; - j = 4; - expected_result = true; - while ((i < small_rank) && expected_result) { - if (!dim_selected[j]) - expected_result = false; - i++; - j--; - } /* end while */ - - while ((i < large_rank) && expected_result) { - if (dim_selected[j]) - expected_result = false; - i++; - j--; - } /* end while */ - - /* everything is set up -- run the tests */ - - /* run test with edge size 16, checker - * size 1, and a variety of offsets - */ - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 0, - /* edge_size */ 16, - /* checker_size */ 1, dim_selected, - expected_result); - - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 5, - /* edge_size */ 16, - /* checker_size */ 1, dim_selected, - expected_result); - - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 15, - /* edge_size */ 16, - /* checker_size */ 1, dim_selected, - expected_result); - - /* run test with edge size 10, checker - * size 2, and a variety of offsets - */ - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 0, - /* edge_size */ 10, - /* checker_size */ 2, dim_selected, - expected_result); - - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 5, - /* edge_size */ 10, - /* checker_size */ 2, dim_selected, - expected_result); - - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 9, - /* edge_size */ 10, - /* checker_size */ 2, dim_selected, - expected_result); - - /* run test with edge size 10, checker - * size 3, and a variety of offsets - */ - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 0, - /* edge_size */ 10, - /* checker_size */ 3, dim_selected, - expected_result); - - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 5, - /* edge_size */ 10, - /* checker_size */ 3, dim_selected, - expected_result); - - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 9, - /* edge_size */ 10, - /* checker_size */ 3, dim_selected, - expected_result); - - /* run test with edge size 8, checker - * size 8, and a variety of offsets - */ - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 0, - /* edge_size */ 8, - /* checker_size */ 8, dim_selected, - expected_result); - - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 4, - /* edge_size */ 8, - /* checker_size */ 8, dim_selected, - expected_result); - - test_shape_same_dr__checkerboard(test_num++, small_rank, large_rank, - /* offset */ 7, - /* edge_size */ 8, - /* checker_size */ 8, dim_selected, - expected_result); - - z++; - } while ((z < 2) && (large_rank >= 1)); - - y++; - } while ((y < 2) && (large_rank >= 2)); - - x++; - } while ((x < 2) && (large_rank >= 3)); - - w++; - } while ((w < 2) && (large_rank >= 4)); - - v++; - } while ((v < 2) && (large_rank >= 5)); - } /* end for */ - } /* end for */ -} /* test_shape_same_dr__run_checkerboard_tests() */ - -/**************************************************************** -** -** test_shape_same_dr__irregular(): -** -** Tests selection of an "irregular" subset of a full -** n-cube dataspace vs an identical "irregular" subset -** of an n-dimensional slice of an m-cube (m > n). -** in a call to H5Sselect_shape_same(). -** -** Note that this test does not require the n-cube and the -** n-dimensional slice to have the same rank (although -** H5Sselect_shape_same() should always return false if -** they don't). -** -****************************************************************/ -static void -test_shape_same_dr__irregular(int test_num, int small_rank, int large_rank, int pattern_offset, - int slice_offset, bool dim_selected[], bool expected_result) -{ - char test_desc_0[128]; - char test_desc_1[256]; - int edge_size = 10; - int i; - int j; - int k; - int dims_selected = 0; - hid_t n_cube_0_sid; /* the hyper cube containing - * an irregular selection - */ - hid_t n_cube_1_sid; /* the hyper cube in which a - * slice contains an irregular - * selection. - */ - hsize_t dims[SS_DR_MAX_RANK]; - hsize_t start_0[SS_DR_MAX_RANK] = {2, 2, 2, 2, 5}; - hsize_t stride_0[SS_DR_MAX_RANK] = {10, 10, 10, 10, 10}; - hsize_t count_0[SS_DR_MAX_RANK] = {1, 1, 1, 1, 1}; - hsize_t block_0[SS_DR_MAX_RANK] = {2, 2, 2, 2, 3}; - - hsize_t start_1[SS_DR_MAX_RANK] = {2, 2, 2, 5, 2}; - hsize_t stride_1[SS_DR_MAX_RANK] = {10, 10, 10, 10, 10}; - hsize_t count_1[SS_DR_MAX_RANK] = {1, 1, 1, 1, 1}; - hsize_t block_1[SS_DR_MAX_RANK] = {2, 2, 2, 3, 2}; - - hsize_t start_2[SS_DR_MAX_RANK] = {2, 2, 5, 2, 2}; - hsize_t stride_2[SS_DR_MAX_RANK] = {10, 10, 10, 10, 10}; - hsize_t count_2[SS_DR_MAX_RANK] = {1, 1, 1, 1, 1}; - hsize_t block_2[SS_DR_MAX_RANK] = {2, 2, 3, 2, 2}; - - hsize_t start_3[SS_DR_MAX_RANK] = {2, 5, 2, 2, 2}; - hsize_t stride_3[SS_DR_MAX_RANK] = {10, 10, 10, 10, 10}; - hsize_t count_3[SS_DR_MAX_RANK] = {1, 1, 1, 1, 1}; - hsize_t block_3[SS_DR_MAX_RANK] = {2, 3, 2, 2, 2}; - - hsize_t start_4[SS_DR_MAX_RANK] = {5, 2, 2, 2, 2}; - hsize_t stride_4[SS_DR_MAX_RANK] = {10, 10, 10, 10, 10}; - hsize_t count_4[SS_DR_MAX_RANK] = {1, 1, 1, 1, 1}; - hsize_t block_4[SS_DR_MAX_RANK] = {3, 2, 2, 2, 2}; - - hsize_t clip_start[SS_DR_MAX_RANK] = {0, 0, 0, 0, 0}; - hsize_t clip_stride[SS_DR_MAX_RANK] = {10, 10, 10, 10, 10}; - hsize_t clip_count[SS_DR_MAX_RANK] = {1, 1, 1, 1, 1}; - hsize_t clip_block[SS_DR_MAX_RANK] = {10, 10, 10, 10, 10}; - - hsize_t *(starts[SS_DR_MAX_RANK]) = {start_0, start_1, start_2, start_3, start_4}; - hsize_t *(strides[SS_DR_MAX_RANK]) = {stride_0, stride_1, stride_2, stride_3, stride_4}; - hsize_t *(counts[SS_DR_MAX_RANK]) = {count_0, count_1, count_2, count_3, count_4}; - hsize_t *(blocks[SS_DR_MAX_RANK]) = {block_0, block_1, block_2, block_3, block_4}; - - hsize_t start[SS_DR_MAX_RANK]; - hsize_t *start_ptr; - hsize_t stride[SS_DR_MAX_RANK]; - hsize_t *stride_ptr; - hsize_t count[SS_DR_MAX_RANK]; - hsize_t *count_ptr; - hsize_t block[SS_DR_MAX_RANK]; - hsize_t *block_ptr; - htri_t check; /* Shape comparison return value */ - herr_t ret; /* Generic return value */ - - assert(0 < small_rank); - assert(small_rank <= large_rank); - assert(large_rank <= SS_DR_MAX_RANK); - assert(9 <= edge_size); - assert(edge_size <= 1000); - assert(0 <= slice_offset); - assert(slice_offset < edge_size); - assert(-2 <= pattern_offset); - assert(pattern_offset <= 2); - - for (i = SS_DR_MAX_RANK - large_rank; i < SS_DR_MAX_RANK; i++) - if (dim_selected[i] == true) - dims_selected++; - - assert(dims_selected >= 0); - assert(dims_selected <= large_rank); - - snprintf(test_desc_0, sizeof(test_desc_0), - "\tirregular sub set of n-cube slice through m-cube (n <= m) test %d.\n", test_num); - MESSAGE(7, ("%s", test_desc_0)); - - /* This statement must be updated if SS_DR_MAX_RANK is changed */ - snprintf(test_desc_1, sizeof(test_desc_1), - "\tranks: %d/%d edge: %d s/p offset: %d/%d dim_selected: %d/%d/%d/%d/%d:%d.\n", small_rank, - large_rank, edge_size, slice_offset, pattern_offset, (int)dim_selected[0], (int)dim_selected[1], - (int)dim_selected[2], (int)dim_selected[3], (int)dim_selected[4], dims_selected); - MESSAGE(7, ("%s", test_desc_1)); - - /* copy the edge size into the dims array */ - for (i = 0; i < SS_DR_MAX_RANK; i++) - dims[i] = (hsize_t)edge_size; - - /* Create the small n-cube */ - n_cube_0_sid = H5Screate_simple(small_rank, dims, NULL); - CHECK(n_cube_0_sid, FAIL, "H5Screate_simple"); - - /* Select an "irregular" pattern in the small n-cube. This - * pattern can be though of a set of four 3 x 2 x 2 X 2 - * four dimensional prisims, each parallel to one of the - * axies and none of them intersecting with the other. - * - * In the lesser dimensional cases, this 4D pattern is - * projected onto the lower dimensional space. - * - * In the 1-D case, the projection of the pattern looks - * like this: - * - * - - * * - * * * - - - * 0 1 2 3 4 5 6 7 8 9 x - * - * and in the 2-D case, it would look like this: - * - * - * y - * 9 - - - - - - - - - - - * 8 - - - - - - - - - - - * 7 - - * * - - - - - - - * 6 - - * * - - - - - - - * 5 - - * * - - - - - - - * 4 - - - - - - - - - - - * 3 - - * * - * * * - - - * 2 - - * * - * * * - - - * 1 - - - - - - - - - - - * 0 - - - - - - - - - - - * 0 1 2 3 4 5 6 7 8 9 x - * - * In both cases, asterisks indicate selected elements, - * and dashes indicate unselected elements. - * - * Note that is this case, since the edge size is fixed, - * the pattern does not change. However, we do use the - * displacement parameter to allow it to be moved around - * within the n-cube or hyperslab. - */ - - /* first, ensure that the small n-cube has no selection */ - ret = H5Sselect_none(n_cube_0_sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* now, select the irregular pattern */ - for (i = 0; i < SS_DR_MAX_RANK; i++) { - ret = H5Sselect_hyperslab(n_cube_0_sid, H5S_SELECT_OR, starts[i], strides[i], counts[i], blocks[i]); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - } /* end for */ - - /* finally, clip the selection to ensure that it lies fully - * within the n-cube. - */ - ret = H5Sselect_hyperslab(n_cube_0_sid, H5S_SELECT_AND, clip_start, clip_stride, clip_count, clip_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create the large n-cube */ - n_cube_1_sid = H5Screate_simple(large_rank, dims, NULL); - CHECK(n_cube_1_sid, FAIL, "H5Screate_simple"); - - /* Ensure that the large n-cube has no selection */ - H5Sselect_none(n_cube_1_sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Since large rank may be less than SS_DR_MAX_RANK, we may not - * use the entire start, stride, count, and block arrays. This - * is a problem, since it is inconvenient to set up the dim_selected - * array to reflect the large rank, and thus if large_rank < - * SS_DR_MAX_RANK, we need to hide the lower index entries - * from H5Sselect_hyperslab(). - * - * Do this by setting up pointers to the first valid entry in start, - * stride, count, and block below, and pass these pointers in - * to H5Sselect_hyperslab() instead of the array base addresses. - */ - - i = SS_DR_MAX_RANK - large_rank; - assert(i >= 0); - - start_ptr = &(start[i]); - stride_ptr = &(stride[i]); - count_ptr = &(count[i]); - block_ptr = &(block[i]); - - /* Now select the irregular selection in the (possibly larger) n-cube. - * - * Basic idea is to project the pattern used in the smaller n-cube - * onto the dimensions selected in the larger n-cube, with the displacement - * specified. - */ - for (i = 0; i < SS_DR_MAX_RANK; i++) { - j = 0; - for (k = 0; k < SS_DR_MAX_RANK; k++) { - if (dim_selected[k]) { - start[k] = (starts[i])[j] + (hsize_t)pattern_offset; - stride[k] = (strides[i])[j]; - count[k] = (counts[i])[j]; - block[k] = (blocks[i])[j]; - j++; - } /* end if */ - else { - start[k] = (hsize_t)slice_offset; - stride[k] = (hsize_t)(2 * edge_size); - count[k] = 1; - block[k] = 1; - } /* end else */ - } /* end for */ - - /* select the hyperslab */ - ret = H5Sselect_hyperslab(n_cube_1_sid, H5S_SELECT_OR, start_ptr, stride_ptr, count_ptr, block_ptr); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - } /* end for */ - - /* it is possible that the selection extends beyond the dataspace. - * clip the selection to ensure that it doesn't. - */ - ret = H5Sselect_hyperslab(n_cube_1_sid, H5S_SELECT_AND, clip_start, clip_stride, clip_count, clip_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* setup is done -- run the test: */ - check = H5Sselect_shape_same(n_cube_0_sid, n_cube_1_sid); - VERIFY(check, expected_result, "H5Sselect_shape_same"); - - /* Close dataspaces */ - ret = H5Sclose(n_cube_0_sid); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(n_cube_1_sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_shape_same_dr__irregular() */ - -/**************************************************************** -** -** test_shape_same_dr__run_irregular_tests(): -** -** In this set of tests, we test H5Sselect_shape_same() -** with an "irregular" subselection of 1, 2, 3, and 4 cubes as -** one parameter, and irregular subselections of 1, 2, 3, -** and 4 dimensional slices through a n-cube of rank no more -** than 5 (and at least the rank of the slice) as the other. -** Note that the "irregular" selection may be offset between -** the n-cube and the slice. -** -** All the irregular selections will be identical (modulo rank) -** so H5Sselect_shape_same() should return true iff: -** -** 1) the rank of the n cube equals the number of dimensions -** selected in the irregular slice through the m-cube -** (m >= n). -** -** 2) The dimensions selected in the irregular slice -** through the m-cube are the dimensions with the most -** quickly changing indices. -** -****************************************************************/ -static void -test_shape_same_dr__run_irregular_tests(void) -{ - bool dim_selected[5]; - bool expected_result; - int i, j; - int v, w, x, y, z; - int test_num = 0; - int small_rank; - int large_rank; - - for (large_rank = 1; large_rank <= 5; large_rank++) { - for (small_rank = 1; small_rank <= large_rank; small_rank++) { - v = 0; - do { - if (v == 0) - dim_selected[0] = false; - else - dim_selected[0] = true; - - w = 0; - do { - if (w == 0) - dim_selected[1] = false; - else - dim_selected[1] = true; - - x = 0; - do { - if (x == 0) - dim_selected[2] = false; - else - dim_selected[2] = true; - - y = 0; - do { - if (y == 0) - dim_selected[3] = false; - else - dim_selected[3] = true; - - z = 0; - do { - if (z == 0) - dim_selected[4] = false; - else - dim_selected[4] = true; - - /* compute the expected result: */ - i = 0; - j = 4; - expected_result = true; - while ((i < small_rank) && expected_result) { - if (!dim_selected[j]) - expected_result = false; - i++; - j--; - } /* end while */ - - while ((i < large_rank) && expected_result) { - if (dim_selected[j]) - expected_result = false; - i++; - j--; - } /* end while */ - - /* everything is set up -- run the tests */ - - test_shape_same_dr__irregular(test_num++, small_rank, large_rank, - /* pattern_offset */ -2, - /* slice_offset */ 0, dim_selected, - expected_result); - - test_shape_same_dr__irregular(test_num++, small_rank, large_rank, - /* pattern_offset */ -2, - /* slice_offset */ 4, dim_selected, - expected_result); - - test_shape_same_dr__irregular(test_num++, small_rank, large_rank, - /* pattern_offset */ -2, - /* slice_offset */ 9, dim_selected, - expected_result); - - test_shape_same_dr__irregular(test_num++, small_rank, large_rank, - /* pattern_offset */ 0, - /* slice_offset */ 0, dim_selected, - expected_result); - - test_shape_same_dr__irregular(test_num++, small_rank, large_rank, - /* pattern_offset */ 0, - /* slice_offset */ 6, dim_selected, - expected_result); - - test_shape_same_dr__irregular(test_num++, small_rank, large_rank, - /* pattern_offset */ 0, - /* slice_offset */ 9, dim_selected, - expected_result); - - test_shape_same_dr__irregular(test_num++, small_rank, large_rank, - /* pattern_offset */ 2, - /* slice_offset */ 0, dim_selected, - expected_result); - - test_shape_same_dr__irregular(test_num++, small_rank, large_rank, - /* pattern_offset */ 2, - /* slice_offset */ 5, dim_selected, - expected_result); - - test_shape_same_dr__irregular(test_num++, small_rank, large_rank, - /* pattern_offset */ 2, - /* slice_offset */ 9, dim_selected, - expected_result); - - z++; - } while ((z < 2) && (large_rank >= 1)); - - y++; - } while ((y < 2) && (large_rank >= 2)); - - x++; - } while ((x < 2) && (large_rank >= 3)); - - w++; - } while ((w < 2) && (large_rank >= 4)); - - v++; - } while ((v < 2) && (large_rank >= 5)); - } /* end for */ - } /* end for */ -} /* test_shape_same_dr__run_irregular_tests() */ - -/**************************************************************** -** -** test_shape_same_dr(): Tests selections on dataspace with -** different ranks, to verify that "shape same" routine -** is now handling this case correctly. -** -****************************************************************/ -static void -test_shape_same_dr(void) -{ - /* Output message about test being performed */ - MESSAGE(6, ("Testing Same Shape/Different Rank Comparisons\n")); - - /* first run some smoke checks */ - test_shape_same_dr__smoke_check_1(); - test_shape_same_dr__smoke_check_2(); - test_shape_same_dr__smoke_check_3(); - test_shape_same_dr__smoke_check_4(); - - /* now run more intensive tests. */ - test_shape_same_dr__run_full_space_vs_slice_tests(); - test_shape_same_dr__run_checkerboard_tests(); - test_shape_same_dr__run_irregular_tests(); -} /* test_shape_same_dr() */ - -/**************************************************************** -** -** test_space_rebuild(): Tests selection rebuild routine, -** We will test whether selection in span-tree form can be rebuilt -** into a regular selection. -** -** -****************************************************************/ -static void -test_space_rebuild(void) -{ - /* regular space IDs in span-tree form */ - hid_t sid_reg1, sid_reg2, sid_reg3, sid_reg4, sid_reg5; - - /* Original regular Space IDs */ - hid_t sid_reg_ori1, sid_reg_ori2, sid_reg_ori3, sid_reg_ori4, sid_reg_ori5; - - /* Irregular space IDs */ - hid_t sid_irreg1, sid_irreg2, sid_irreg3, sid_irreg4, sid_irreg5; - - /* rebuild status state */ -#if 0 - H5S_diminfo_valid_t rebuild_stat1, rebuild_stat2; - htri_t rebuild_check; -#endif - herr_t ret; - - /* dimensions of rank 1 to rank 5 */ - hsize_t dims1[] = {SPACERE1_DIM0}; - hsize_t dims2[] = {SPACERE2_DIM0, SPACERE2_DIM1}; - hsize_t dims3[] = {SPACERE3_DIM0, SPACERE3_DIM1, SPACERE3_DIM2}; - hsize_t dims4[] = {SPACERE4_DIM0, SPACERE4_DIM1, SPACERE4_DIM2, SPACERE4_DIM3}; - hsize_t dims5[] = {SPACERE5_DIM0, SPACERE5_DIM1, SPACERE5_DIM2, SPACERE5_DIM3, SPACERE5_DIM4}; - - /* The start of the hyperslab */ - hsize_t start1[SPACERE1_RANK], start2[SPACERE2_RANK], start3[SPACERE3_RANK], start4[SPACERE4_RANK], - start5[SPACERE5_RANK]; - - /* The stride of the hyperslab */ - hsize_t stride1[SPACERE1_RANK], stride2[SPACERE2_RANK], stride3[SPACERE3_RANK], stride4[SPACERE4_RANK], - stride5[SPACERE5_RANK]; - - /* The number of blocks for the hyperslab */ - hsize_t count1[SPACERE1_RANK], count2[SPACERE2_RANK], count3[SPACERE3_RANK], count4[SPACERE4_RANK], - count5[SPACERE5_RANK]; - - /* The size of each block for the hyperslab */ - hsize_t block1[SPACERE1_RANK], block2[SPACERE2_RANK], block3[SPACERE3_RANK], block4[SPACERE4_RANK], - block5[SPACERE5_RANK]; - - /* Declarations for special test of rebuild */ - hid_t sid_spec; - - /* Output message about test being performed */ - MESSAGE(6, ("Testing functionality to rebuild regular hyperslab selection\n")); - - MESSAGE(7, ("Testing functionality to rebuild 1-D hyperslab selection\n")); - - /* Create 1-D dataspace */ - sid_reg1 = H5Screate_simple(SPACERE1_RANK, dims1, NULL); - sid_reg_ori1 = H5Screate_simple(SPACERE1_RANK, dims1, NULL); - - /* Build up the original one dimensional regular selection */ - start1[0] = 1; - count1[0] = 3; - stride1[0] = 5; - block1[0] = 4; - ret = H5Sselect_hyperslab(sid_reg_ori1, H5S_SELECT_SET, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Build up one dimensional regular selection with H5_SELECT_OR, - inside HDF5, it will be treated as an irregular selection. */ - - start1[0] = 1; - count1[0] = 2; - stride1[0] = 5; - block1[0] = 4; - ret = H5Sselect_hyperslab(sid_reg1, H5S_SELECT_SET, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start1[0] = 11; - count1[0] = 1; - stride1[0] = 5; - block1[0] = 4; - ret = H5Sselect_hyperslab(sid_reg1, H5S_SELECT_OR, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_reg1, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 and rebuild_stat2 should be - * H5S_DIMINFO_VALID_YES. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (ret != FAIL) { - /* In this case, rebuild_check should be true. */ - rebuild_check = H5Sselect_shape_same(sid_reg1, sid_reg_ori1); - CHECK(rebuild_check, false, "H5Sselect_shape_same"); - } -#endif - /* For irregular hyperslab */ - sid_irreg1 = H5Screate_simple(SPACERE1_RANK, dims1, NULL); - - /* Build up one dimensional irregular selection with H5_SELECT_OR */ - start1[0] = 1; - count1[0] = 2; - stride1[0] = 5; - block1[0] = 4; - ret = H5Sselect_hyperslab(sid_irreg1, H5S_SELECT_SET, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start1[0] = 12; /* Just one position switch */ - count1[0] = 1; - stride1[0] = 5; - block1[0] = 4; - ret = H5Sselect_hyperslab(sid_irreg1, H5S_SELECT_OR, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_irreg1, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 should be H5S_DIMINFO_VALID_NO and - * rebuild_stat2 should be H5S_DIMINFO_VALID_IMPOSSIBLE. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_IMPOSSIBLE) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - /* No need to do shape comparison */ -#endif - - MESSAGE(7, ("Testing functionality to rebuild 2-D hyperslab selection\n")); - /* Create 2-D dataspace */ - sid_reg2 = H5Screate_simple(SPACERE2_RANK, dims2, NULL); - sid_reg_ori2 = H5Screate_simple(SPACERE2_RANK, dims2, NULL); - - /* Build up the original two dimensional regular selection */ - start2[0] = 2; - count2[0] = 2; - stride2[0] = 7; - block2[0] = 5; - start2[1] = 1; - count2[1] = 3; - stride2[1] = 3; - block2[1] = 2; - - ret = H5Sselect_hyperslab(sid_reg_ori2, H5S_SELECT_SET, start2, stride2, count2, block2); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Build up two dimensional regular selection with H5_SELECT_OR, inside HDF5, - it will be treated as an irregular selection. */ - - start2[1] = 1; - count2[1] = 2; - stride2[1] = 3; - block2[1] = 2; - - ret = H5Sselect_hyperslab(sid_reg2, H5S_SELECT_SET, start2, stride2, count2, block2); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start2[1] = 7; /* 7 = start(1) + count(2) * stride(3) */ - count2[1] = 1; - stride2[1] = 3; - block2[1] = 2; - - ret = H5Sselect_hyperslab(sid_reg2, H5S_SELECT_OR, start2, stride2, count2, block2); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_reg2, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 and rebuild_stat2 should be - * H5S_DIMINFO_VALID_YES. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } /* end if */ - if (ret != FAIL) { - /* In this case, rebuild_check should be true. */ - rebuild_check = H5Sselect_shape_same(sid_reg2, sid_reg_ori2); - CHECK(rebuild_check, false, "H5Sselect_shape_same"); - } -#endif - /* 2-D irregular case */ - sid_irreg2 = H5Screate_simple(SPACERE2_RANK, dims2, NULL); - /* Build up two dimensional irregular selection with H5_SELECT_OR */ - - start2[0] = 2; - count2[0] = 2; - stride2[0] = 7; - block2[0] = 5; - start2[1] = 1; - count2[1] = 1; - stride2[1] = 3; - block2[1] = 2; - ret = H5Sselect_hyperslab(sid_irreg2, H5S_SELECT_SET, start2, stride2, count2, block2); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start2[1] = 4; - count2[1] = 2; - stride2[1] = 4; - block2[1] = 3; /* Just add one element for the block */ - - ret = H5Sselect_hyperslab(sid_irreg2, H5S_SELECT_OR, start2, stride2, count2, block2); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_irreg2, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 should be H5S_DIMINFO_VALID_NO and - * rebuild_stat2 should be H5S_DIMINFO_VALID_IMPOSSIBLE. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_IMPOSSIBLE) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - /* No need to do shape comparison */ -#endif - - MESSAGE(7, ("Testing functionality to rebuild 3-D hyperslab selection\n")); - - /* Create 3-D dataspace */ - sid_reg3 = H5Screate_simple(SPACERE3_RANK, dims3, NULL); - sid_reg_ori3 = H5Screate_simple(SPACERE3_RANK, dims3, NULL); - - /* Build up the original three dimensional regular selection */ - start3[0] = 2; - count3[0] = 2; - stride3[0] = 3; - block3[0] = 2; - start3[1] = 1; - count3[1] = 3; - stride3[1] = 3; - block3[1] = 2; - - start3[2] = 1; - count3[2] = 2; - stride3[2] = 4; - block3[2] = 2; - - ret = H5Sselect_hyperslab(sid_reg_ori3, H5S_SELECT_SET, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Build up three dimensional regular selection with H5_SELECT_OR, inside HDF5, - it will be treated as an irregular selection. */ - start3[2] = 1; - count3[2] = 1; - stride3[2] = 4; - block3[2] = 2; - - ret = H5Sselect_hyperslab(sid_reg3, H5S_SELECT_SET, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start3[2] = 5; - count3[2] = 1; - stride3[2] = 4; - block3[2] = 2; - - ret = H5Sselect_hyperslab(sid_reg3, H5S_SELECT_OR, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_reg3, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 and rebuild_stat2 should be - * H5S_DIMINFO_VALID_YES. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (ret != FAIL) { - /* In this case, rebuild_check should be true. */ - rebuild_check = H5Sselect_shape_same(sid_reg3, sid_reg_ori3); - CHECK(rebuild_check, false, "H5Sselect_shape_same"); - } -#endif - - sid_irreg3 = H5Screate_simple(SPACERE3_RANK, dims3, NULL); - - /* Build up three dimensional irregular selection with H5_SELECT_OR */ - start3[0] = 2; - count3[0] = 2; - stride3[0] = 3; - block3[0] = 2; - start3[1] = 1; - count3[1] = 3; - stride3[1] = 3; - block3[1] = 2; - - start3[2] = 1; - count3[2] = 2; - stride3[2] = 2; - block3[2] = 1; - - ret = H5Sselect_hyperslab(sid_irreg3, H5S_SELECT_SET, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start3[2] = 3; - count3[2] = 2; - stride3[2] = 3; /* Just add one element for the stride */ - block3[2] = 1; - - ret = H5Sselect_hyperslab(sid_irreg3, H5S_SELECT_OR, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_irreg3, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 should be H5S_DIMINFO_VALID_NO and - * rebuild_stat2 should be H5S_DIMINFO_VALID_IMPOSSIBLE. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_IMPOSSIBLE) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - /* No need to do shape comparison */ -#endif - - MESSAGE(7, ("Testing functionality to rebuild 4-D hyperslab selection\n")); - - /* Create 4-D dataspace */ - sid_reg4 = H5Screate_simple(SPACERE4_RANK, dims4, NULL); - sid_reg_ori4 = H5Screate_simple(SPACERE4_RANK, dims4, NULL); - - /* Build up the original four dimensional regular selection */ - start4[0] = 2; - count4[0] = 2; - stride4[0] = 3; - block4[0] = 2; - - start4[1] = 1; - count4[1] = 3; - stride4[1] = 3; - block4[1] = 2; - - start4[2] = 1; - count4[2] = 2; - stride4[2] = 4; - block4[2] = 2; - - start4[3] = 1; - count4[3] = 2; - stride4[3] = 4; - block4[3] = 2; - - ret = H5Sselect_hyperslab(sid_reg_ori4, H5S_SELECT_SET, start4, stride4, count4, block4); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Build up four dimensional regular selection with H5_SELECT_OR, inside HDF5, - it will be treated as an irregular selection. */ - start4[3] = 1; - count4[3] = 1; - stride4[3] = 4; - block4[3] = 2; - - ret = H5Sselect_hyperslab(sid_reg4, H5S_SELECT_SET, start4, stride4, count4, block4); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start4[3] = 5; - count4[3] = 1; - stride4[3] = 4; - block4[3] = 2; - - ret = H5Sselect_hyperslab(sid_reg4, H5S_SELECT_OR, start4, stride4, count4, block4); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - -#if 0 - ret = H5S__get_rebuild_status_test(sid_reg4, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 and rebuild_stat2 should be - * H5S_DIMINFO_VALID_YES. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (ret != FAIL) { - /* In this case, rebuild_check should be true. */ - rebuild_check = H5Sselect_shape_same(sid_reg4, sid_reg_ori4); - CHECK(rebuild_check, false, "H5Sselect_shape_same"); - } -#endif - - /* Testing irregular selection */ - sid_irreg4 = H5Screate_simple(SPACERE4_RANK, dims4, NULL); - - /* Build up four dimensional irregular selection with H5_SELECT_OR */ - start4[0] = 2; - count4[0] = 2; - stride4[0] = 3; - block4[0] = 2; - start4[1] = 1; - count4[1] = 3; - stride4[1] = 3; - block4[1] = 2; - - start4[2] = 1; - count4[2] = 1; - stride4[2] = 4; - block4[2] = 2; - - start4[3] = 1; - count4[3] = 2; - stride4[3] = 4; - block4[3] = 2; /* sub-block is one element difference */ - - ret = H5Sselect_hyperslab(sid_irreg4, H5S_SELECT_SET, start4, stride4, count4, block4); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start4[2] = 5; - count4[2] = 1; - stride4[2] = 4; - block4[2] = 2; - - start4[3] = 1; - count4[3] = 2; - stride4[3] = 4; - block4[3] = 3; /* sub-block is one element difference */ - - ret = H5Sselect_hyperslab(sid_irreg4, H5S_SELECT_OR, start4, stride4, count4, block4); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_irreg4, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 should be H5S_DIMINFO_VALID_NO and - * rebuild_stat2 should be H5S_DIMINFO_VALID_IMPOSSIBLE. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_IMPOSSIBLE) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - /* No need to do shape comparison */ -#endif - - MESSAGE(7, ("Testing functionality to rebuild 5-D hyperslab selection\n")); - - /* Create 5-D dataspace */ - sid_reg5 = H5Screate_simple(SPACERE5_RANK, dims5, NULL); - sid_reg_ori5 = H5Screate_simple(SPACERE5_RANK, dims5, NULL); - - /* Build up the original five dimensional regular selection */ - start5[0] = 2; - count5[0] = 2; - stride5[0] = 3; - block5[0] = 2; - - start5[1] = 1; - count5[1] = 3; - stride5[1] = 3; - block5[1] = 2; - - start5[2] = 1; - count5[2] = 2; - stride5[2] = 4; - block5[2] = 2; - - start5[3] = 1; - count5[3] = 2; - stride5[3] = 4; - block5[3] = 2; - - start5[4] = 1; - count5[4] = 2; - stride5[4] = 4; - block5[4] = 2; - - ret = H5Sselect_hyperslab(sid_reg_ori5, H5S_SELECT_SET, start5, stride5, count5, block5); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Build up five dimensional regular selection with H5_SELECT_OR, inside HDF5, - it will be treated as an irregular selection. */ - start5[4] = 1; - count5[4] = 1; - stride5[4] = 4; - block5[4] = 2; - - ret = H5Sselect_hyperslab(sid_reg5, H5S_SELECT_SET, start5, stride5, count5, block5); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start5[4] = 5; - count5[4] = 1; - stride5[4] = 4; - block5[4] = 2; - - ret = H5Sselect_hyperslab(sid_reg5, H5S_SELECT_OR, start5, stride5, count5, block5); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - -#if 0 - ret = H5S__get_rebuild_status_test(sid_reg5, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 and rebuild_stat2 should be - * H5S_DIMINFO_VALID_YES. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (ret != FAIL) { - /* In this case, rebuild_check should be true. */ - rebuild_check = H5Sselect_shape_same(sid_reg5, sid_reg_ori5); - CHECK(rebuild_check, false, "H5Sselect_shape_same"); - } -#endif - - sid_irreg5 = H5Screate_simple(SPACERE5_RANK, dims5, NULL); - - /* Build up five dimensional irregular selection with H5_SELECT_OR */ - start5[0] = 2; - count5[0] = 2; - stride5[0] = 3; - block5[0] = 2; - - start5[1] = 1; - count5[1] = 3; - stride5[1] = 3; - block5[1] = 2; - - start5[2] = 1; - count5[2] = 2; - stride5[2] = 4; - block5[2] = 2; - - start5[3] = 1; - count5[3] = 1; - stride5[3] = 4; - block5[3] = 2; - - start5[4] = 2; /* One element difference */ - count5[4] = 1; - stride5[4] = 4; - block5[4] = 2; - - ret = H5Sselect_hyperslab(sid_irreg5, H5S_SELECT_SET, start5, stride5, count5, block5); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start5[3] = 5; - count5[3] = 1; - stride5[3] = 4; - block5[3] = 2; - - start5[4] = 1; /* One element difference */ - count5[4] = 2; - stride5[4] = 4; - block5[4] = 2; - - ret = H5Sselect_hyperslab(sid_irreg5, H5S_SELECT_OR, start5, stride5, count5, block5); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_irreg5, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 should be H5S_DIMINFO_VALID_NO and - * rebuild_stat2 should be H5S_DIMINFO_VALID_IMPOSSIBLE. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_IMPOSSIBLE) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - /* No need to do shape comparison */ -#endif - - /* We use 5-D to test a special case with - rebuilding routine true, false and true */ - sid_spec = H5Screate_simple(SPACERE5_RANK, dims5, NULL); - - /* Build up the original five dimensional regular selection */ - start5[0] = 2; - count5[0] = 2; - stride5[0] = 3; - block5[0] = 2; - - start5[1] = 1; - count5[1] = 3; - stride5[1] = 3; - block5[1] = 2; - - start5[2] = 1; - count5[2] = 2; - stride5[2] = 4; - block5[2] = 2; - - start5[3] = 1; - count5[3] = 2; - stride5[3] = 4; - block5[3] = 2; - - start5[4] = 1; - count5[4] = 1; - stride5[4] = 4; - block5[4] = 2; - - ret = H5Sselect_hyperslab(sid_spec, H5S_SELECT_SET, start5, stride5, count5, block5); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_spec, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 and rebuild_stat2 should both be - * H5S_DIMINFO_VALID_YES. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - /* No need to do shape comparison */ -#endif - - /* Adding some selections to make it real irregular */ - start5[3] = 1; - count5[3] = 1; - stride5[3] = 4; - block5[3] = 2; - - start5[4] = 5; - count5[4] = 1; - stride5[4] = 4; - block5[4] = 2; - - ret = H5Sselect_hyperslab(sid_spec, H5S_SELECT_OR, start5, stride5, count5, block5); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_spec, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 should be H5S_DIMINFO_VALID_NO and - * rebuild_stat2 should be H5S_DIMINFO_VALID_IMPOSSIBLE. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_IMPOSSIBLE) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - /* No need to do shape comparison */ -#endif - - /* Add more selections to make it regular again */ - start5[3] = 5; - count5[3] = 1; - stride5[3] = 4; - block5[3] = 2; - - start5[4] = 5; - count5[4] = 1; - stride5[4] = 4; - block5[4] = 2; - - ret = H5Sselect_hyperslab(sid_spec, H5S_SELECT_OR, start5, stride5, count5, block5); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - ret = H5S__get_rebuild_status_test(sid_spec, &rebuild_stat1, &rebuild_stat2); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - /* In this case, rebuild_stat1 should be H5S_DIMINFO_VALID_NO and - * rebuild_stat2 should be H5S_DIMINFO_VALID_YES. */ - if (rebuild_stat1 != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - if (rebuild_stat2 != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } - /* No need to do shape comparison */ -#endif - - H5Sclose(sid_reg1); - CHECK(ret, FAIL, "H5Sclose"); - H5Sclose(sid_irreg1); - CHECK(ret, FAIL, "H5Sclose"); - - H5Sclose(sid_reg2); - CHECK(ret, FAIL, "H5Sclose"); - H5Sclose(sid_irreg2); - CHECK(ret, FAIL, "H5Sclose"); - - H5Sclose(sid_reg3); - CHECK(ret, FAIL, "H5Sclose"); - H5Sclose(sid_irreg3); - CHECK(ret, FAIL, "H5Sclose"); - - H5Sclose(sid_reg4); - CHECK(ret, FAIL, "H5Sclose"); - H5Sclose(sid_irreg4); - CHECK(ret, FAIL, "H5Sclose"); - - H5Sclose(sid_reg5); - CHECK(ret, FAIL, "H5Sclose"); - H5Sclose(sid_irreg5); - CHECK(ret, FAIL, "H5Sclose"); - - H5Sclose(sid_spec); - CHECK(ret, FAIL, "H5Sclose"); -} - -/**************************************************************** -** -** test_space_update_diminfo(): Tests selection diminfo update -** routine. We will test whether regular selections can be -** quickly updated when the selection is modified. -** -** -****************************************************************/ -static void -test_space_update_diminfo(void) -{ - hid_t space_id; /* Dataspace id */ -#if 0 - H5S_diminfo_valid_t diminfo_valid; /* Diminfo status */ - H5S_diminfo_valid_t rebuild_status; /* Diminfo status after rebuild */ -#endif - H5S_sel_type sel_type; /* Selection type */ - herr_t ret; /* Return value */ - - /* dimensions of rank 1 to rank 5 */ - hsize_t dims1[] = {SPACEUD1_DIM0}; - hsize_t dims3[] = {SPACEUD3_DIM0, SPACEUD3_DIM1, SPACEUD3_DIM2}; - - /* The start of the hyperslab */ - hsize_t start1[1], start3[3]; - - /* The stride of the hyperslab */ - hsize_t stride1[1], stride3[3]; - - /* The number of blocks for the hyperslab */ - hsize_t count1[1], count3[3]; - - /* The size of each block for the hyperslab */ - hsize_t block1[1], block3[3]; - - /* Output message about test being performed */ - MESSAGE(6, ("Testing functionality to update hyperslab dimension info\n")); - - MESSAGE(7, ("Testing functionality to update 1-D hyperslab dimension info\n")); - - /* - * Test adding regularly spaced distinct blocks - */ - - /* Create 1-D dataspace */ - space_id = H5Screate_simple(1, dims1, NULL); - - /* Create single block */ - start1[0] = 3; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add block after first, with OR */ - start1[0] = 6; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add block before first, this time with XOR */ - start1[0] = 0; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_XOR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add two blocks after current block */ - start1[0] = 9; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add two blocks overlapping current block, with OR */ - start1[0] = 9; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add two blocks partially overlapping current block, with OR */ - start1[0] = 12; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add two blocks partially overlapping current block, with XOR */ - start1[0] = 15; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_XOR, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO, after rebuild it should be IMPOSSIBLE */ - ret = H5S__get_rebuild_status_test(space_id, &diminfo_valid, &rebuild_status); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ - if (rebuild_status != H5S_DIMINFO_VALID_IMPOSSIBLE) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } /* end if */ -#endif - - /* Fill in missing block */ - start1[0] = 15; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_XOR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO, after rebuild it should be YES */ - ret = H5S__get_rebuild_status_test(space_id, &diminfo_valid, &rebuild_status); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ - if (rebuild_status != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } /* end if */ -#endif - /* - * Test adding contiguous blocks - */ - - /* Create single block */ - start1[0] = 3; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add block immediately after first, with OR */ - start1[0] = 5; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add block immediately before first, with XOR */ - start1[0] = 1; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add differently size block immediately after current, with OR */ - start1[0] = 7; - count1[0] = 1; - block1[0] = 7; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* - * Test adding overlapping blocks - */ - - /* Create single block */ - start1[0] = 3; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add block completely overlapping first, with OR */ - start1[0] = 3; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add block partially overlapping first, with OR */ - start1[0] = 4; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add block completely enclosing current, with OR */ - start1[0] = 2; - count1[0] = 1; - block1[0] = 5; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add block completely enclosed by current, with OR */ - start1[0] = 3; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add equally sized block partially overlapping current, with XOR */ - start1[0] = 3; - count1[0] = 1; - block1[0] = 5; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_XOR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Fill in hole in block */ - start1[0] = 3; - count1[0] = 1; - block1[0] = 4; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO, after rebuild it should be YES */ - ret = H5S__get_rebuild_status_test(space_id, &diminfo_valid, &rebuild_status); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ - if (rebuild_status != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } /* end if */ -#endif - - /* Add differently sized block partially overlapping current, with XOR */ - start1[0] = 4; - count1[0] = 1; - block1[0] = 5; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_XOR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Fill in hole in block */ - start1[0] = 4; - count1[0] = 1; - block1[0] = 4; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO, after rebuild it should be YES */ - ret = H5S__get_rebuild_status_test(space_id, &diminfo_valid, &rebuild_status); - CHECK(ret, FAIL, "H5S__get_rebuild_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ - if (rebuild_status != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_rebuild"); - } /* end if */ -#endif - - /* Add block completely overlapping current, with XOR */ - start1[0] = 2; - count1[0] = 1; - block1[0] = 7; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_XOR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - sel_type = H5Sget_select_type(space_id); - VERIFY(sel_type, H5S_SEL_NONE, "H5Sget_select_type"); - - /* - * Test various conditions that break the fast algorithm - */ - - /* Create multiple blocks */ - start1[0] = 3; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create single block with start out of phase */ - start1[0] = 8; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create multiple blocks */ - start1[0] = 3; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create multiple blocks with start out of phase */ - start1[0] = 8; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create multiple blocks */ - start1[0] = 3; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create multiple blocks with wrong stride */ - start1[0] = 9; - stride1[0] = 4; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create single block */ - start1[0] = 3; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create single block with wrong size */ - start1[0] = 6; - count1[0] = 1; - block1[0] = 1; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create single block */ - start1[0] = 3; - count1[0] = 1; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create multiple blocks with wrong size */ - start1[0] = 6; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 1; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create multiple blocks */ - start1[0] = 3; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create single block with wrong size */ - start1[0] = 9; - count1[0] = 1; - block1[0] = 1; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, NULL, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create multiple blocks */ - start1[0] = 3; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create multiple blocks with wrong size */ - start1[0] = 9; - stride1[0] = 3; - count1[0] = 2; - block1[0] = 1; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start1, stride1, count1, block1); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - - MESSAGE(7, ("Testing functionality to update 3-D hyperslab dimension info\n")); - - /* Create 3-D dataspace */ - space_id = H5Screate_simple(3, dims3, NULL); - - /* Create multiple blocks */ - start3[0] = 0; - start3[1] = 1; - start3[2] = 2; - stride3[0] = 2; - stride3[1] = 3; - stride3[2] = 4; - count3[0] = 4; - count3[1] = 3; - count3[2] = 2; - block3[0] = 1; - block3[1] = 2; - block3[2] = 3; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add blocks with same values in all dimensions */ - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add blocks with same values in two dimensions */ - start3[0] = 8; - stride3[0] = 1; - count3[0] = 1; - block3[0] = 1; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create multiple blocks */ - start3[0] = 0; - start3[1] = 1; - start3[2] = 2; - stride3[0] = 2; - stride3[1] = 3; - stride3[2] = 4; - count3[0] = 4; - count3[1] = 3; - count3[2] = 2; - block3[0] = 1; - block3[1] = 2; - block3[2] = 3; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add blocks with same values in one dimension */ - start3[0] = 8; - start3[1] = 10; - stride3[0] = 1; - stride3[1] = 1; - count3[0] = 1; - count3[1] = 1; - block3[0] = 1; - block3[1] = 2; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Create multiple blocks */ - start3[0] = 0; - start3[1] = 1; - start3[2] = 2; - stride3[0] = 2; - stride3[1] = 3; - stride3[2] = 4; - count3[0] = 4; - count3[1] = 3; - count3[2] = 2; - block3[0] = 1; - block3[1] = 2; - block3[2] = 3; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be YES */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_YES) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - /* Add blocks with same values in no dimensions */ - start3[0] = 8; - start3[1] = 10; - start3[2] = 10; - stride3[0] = 1; - stride3[1] = 1; - stride3[2] = 1; - count3[0] = 1; - count3[1] = 1; - count3[2] = 1; - block3[0] = 1; - block3[1] = 2; - block3[2] = 3; - ret = H5Sselect_hyperslab(space_id, H5S_SELECT_OR, start3, stride3, count3, block3); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); -#if 0 - /* diminfo_valid should be NO */ - ret = H5S__get_diminfo_status_test(space_id, &diminfo_valid); - CHECK(ret, FAIL, "H5S__get_diminfo_status_test"); - if (diminfo_valid != H5S_DIMINFO_VALID_NO) { - ret = FAIL; - CHECK(ret, FAIL, "H5S_hyper_update_diminfo"); - } /* end if */ -#endif - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); -} /* end test_space_update_diminfo() */ - -/**************************************************************** -** -** test_select_hyper_chunk_offset(): Tests selections on dataspace, -** verify that offsets for hyperslab selections are working in -** chunked datasets. -** -****************************************************************/ -#if 0 -static void -test_select_hyper_chunk_offset(void) -{ - hid_t fid; /* File ID */ - hid_t sid; /* Dataspace ID */ - hid_t msid; /* Memory dataspace ID */ - hid_t did; /* Dataset ID */ - const hsize_t mem_dims[1] = {SPACE10_DIM1}; /* Dataspace dimensions for memory */ - const hsize_t dims[1] = {0}; /* Dataspace initial dimensions */ - const hsize_t maxdims[1] = {H5S_UNLIMITED}; /* Dataspace mam dims */ - int *wbuf; /* Buffer for writing data */ - int *rbuf; /* Buffer for reading data */ - hid_t dcpl; /* Dataset creation property list ID */ - hsize_t chunks[1] = {SPACE10_CHUNK_SIZE}; /* Chunk size */ - hsize_t start[1] = {0}; /* The start of the hyperslab */ - hsize_t count[1] = {SPACE10_CHUNK_SIZE}; /* The size of the hyperslab */ - int i, j; /* Local index */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing hyperslab selections using offsets in chunked datasets\n")); - - /* Allocate buffers */ - wbuf = (int *)malloc(sizeof(int) * SPACE10_DIM1); - CHECK_PTR(wbuf, "malloc"); - rbuf = (int *)calloc(sizeof(int), SPACE10_DIM1); - CHECK_PTR(rbuf, "calloc"); - - /* Initialize the write buffer */ - for (i = 0; i < SPACE10_DIM1; i++) - wbuf[i] = i; - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Set to chunked storage layout */ - ret = H5Pset_layout(dcpl, H5D_CHUNKED); - CHECK(ret, FAIL, "H5Pset_layout"); - - /* Set the chunk size */ - ret = H5Pset_chunk(dcpl, 1, chunks); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Create dataspace for memory */ - msid = H5Screate_simple(1, mem_dims, NULL); - CHECK(msid, FAIL, "H5Screate_simple"); - - /* Select the correct chunk in the memory dataspace */ - ret = H5Sselect_hyperslab(msid, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for dataset */ - sid = H5Screate_simple(1, dims, maxdims); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Create the dataset */ - did = H5Dcreate2(fid, "fooData", H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Loop over writing out each chunk */ - for (i = SPACE10_CHUNK_SIZE; i <= SPACE10_DIM1; i += SPACE10_CHUNK_SIZE) { - hssize_t offset[1]; /* Offset of selection */ - hid_t fsid; /* File dataspace ID */ - hsize_t size[1]; /* The size to extend the dataset to */ - - /* Extend the dataset */ - size[0] = (hsize_t)i; /* The size to extend the dataset to */ - ret = H5Dset_extent(did, size); - CHECK(ret, FAIL, "H5Dset_extent"); - - /* Get the (extended) dataspace from the dataset */ - fsid = H5Dget_space(did); - CHECK(fsid, FAIL, "H5Dget_space"); - - /* Select the correct chunk in the dataset */ - ret = H5Sselect_hyperslab(fsid, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Set the selection offset for the file dataspace */ - offset[0] = i - SPACE10_CHUNK_SIZE; - ret = H5Soffset_simple(fsid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Set the selection offset for the memory dataspace */ - offset[0] = SPACE10_DIM1 - i; - ret = H5Soffset_simple(msid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Write the data to the chunk */ - ret = H5Dwrite(did, H5T_NATIVE_INT, msid, fsid, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close the file dataspace copy */ - ret = H5Sclose(fsid); - CHECK(ret, FAIL, "H5Sclose"); - } - - /* Read the data back in */ - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify the information read in */ - for (i = 0; i < SPACE10_DIM1; i += SPACE10_CHUNK_SIZE) - for (j = 0; j < SPACE10_CHUNK_SIZE; j++) - if (wbuf[i + j] != rbuf[((SPACE10_DIM1 - i) - SPACE10_CHUNK_SIZE) + j]) - TestErrPrintf("Line: %d - Error! i=%d, j=%d, rbuf=%d, wbuf=%d\n", __LINE__, i, j, - rbuf[((SPACE10_DIM1 - i) - SPACE10_CHUNK_SIZE) + j], wbuf[i + j]); - - /* Check with 'OR'ed set of hyperslab selections, which makes certain the - * hyperslab spanlist code gets tested. -QAK - */ - - /* Re-initialize the write buffer */ - for (i = 0; i < SPACE10_DIM1; i++) - wbuf[i] = i * 2; - - /* Change the selected the region in the memory dataspace */ - start[0] = 0; - count[0] = SPACE10_CHUNK_SIZE / 3; - ret = H5Sselect_hyperslab(msid, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - start[0] = (2 * SPACE10_CHUNK_SIZE) / 3; - ret = H5Sselect_hyperslab(msid, H5S_SELECT_OR, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Loop over writing out each chunk */ - for (i = SPACE10_CHUNK_SIZE; i <= SPACE10_DIM1; i += SPACE10_CHUNK_SIZE) { - hssize_t offset[1]; /* Offset of selection */ - hid_t fsid; /* File dataspace ID */ - hsize_t size[1]; /* The size to extend the dataset to */ - - /* Extend the dataset */ - size[0] = (hsize_t)i; /* The size to extend the dataset to */ - ret = H5Dset_extent(did, size); - CHECK(ret, FAIL, "H5Dset_extent"); - - /* Get the (extended) dataspace from the dataset */ - fsid = H5Dget_space(did); - CHECK(fsid, FAIL, "H5Dget_space"); - - /* Select the correct region in the dataset */ - start[0] = 0; - ret = H5Sselect_hyperslab(fsid, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - start[0] = (2 * SPACE10_CHUNK_SIZE) / 3; - ret = H5Sselect_hyperslab(fsid, H5S_SELECT_OR, start, NULL, count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Set the selection offset for the file dataspace */ - offset[0] = i - SPACE10_CHUNK_SIZE; - ret = H5Soffset_simple(fsid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Set the selection offset for the memory dataspace */ - offset[0] = SPACE10_DIM1 - i; - ret = H5Soffset_simple(msid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Write the data to the chunk */ - ret = H5Dwrite(did, H5T_NATIVE_INT, msid, fsid, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Close the file dataspace copy */ - ret = H5Sclose(fsid); - CHECK(ret, FAIL, "H5Sclose"); - } - - /* Read the data back in */ - ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Verify the information read in */ - for (i = 0; i < SPACE10_DIM1; i += SPACE10_CHUNK_SIZE) - for (j = 0; j < SPACE10_CHUNK_SIZE; j++) - /* We're not writing out the "middle" of each chunk, so don't check that */ - if (j < (SPACE10_CHUNK_SIZE / 3) || j >= ((2 * SPACE10_CHUNK_SIZE) / 3)) - if (wbuf[i + j] != rbuf[((SPACE10_DIM1 - i) - SPACE10_CHUNK_SIZE) + j]) - TestErrPrintf("Line: %d - Error! i=%d, j=%d, rbuf=%d, wbuf=%d\n", __LINE__, i, j, - rbuf[((SPACE10_DIM1 - i) - SPACE10_CHUNK_SIZE) + j], wbuf[i + j]); - - /* Close the memory dataspace */ - ret = H5Sclose(msid); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close the dataset */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Free the buffers */ - free(wbuf); - free(rbuf); -} /* test_select_hyper_chunk_offset() */ -#endif -/**************************************************************** -** -** test_select_hyper_chunk_offset2(): Tests selections on dataspace, -** another test to verify that offsets for hyperslab selections are -** working in chunked datasets. -** -****************************************************************/ -#if 0 -static void -test_select_hyper_chunk_offset2(void) -{ - hid_t file, dataset; /* handles */ - hid_t dataspace; - hid_t memspace; - hid_t dcpl; /* Dataset creation property list */ - herr_t status; - unsigned data_out[SPACE12_DIM0]; /* output buffer */ - unsigned data_in[SPACE12_CHUNK_DIM0]; /* input buffer */ - hsize_t dims[SPACE12_RANK] = {SPACE12_DIM0}; /* Dimension size */ - hsize_t chunk_dims[SPACE12_RANK] = {SPACE12_CHUNK_DIM0}; /* Chunk size */ - hsize_t start[SPACE12_RANK]; /* Start of hyperslab */ - hsize_t count[SPACE12_RANK]; /* Size of hyperslab */ - hssize_t offset[SPACE12_RANK]; /* hyperslab offset in the file */ - unsigned u, v; /* Local index variables */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing more hyperslab selections using offsets in chunked datasets\n")); - - /* Initialize data to write out */ - for (u = 0; u < SPACE12_DIM0; u++) - data_out[u] = u; - - /* Create the file */ - file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fcreate"); - - /* Create dataspace */ - dataspace = H5Screate_simple(SPACE12_RANK, dims, NULL); - CHECK(dataspace, FAIL, "H5Screate_simple"); - - /* Create dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Set chunk sizes */ - status = H5Pset_chunk(dcpl, SPACE12_RANK, chunk_dims); - CHECK(status, FAIL, "H5Pset_chunk"); - - /* Create dataset */ - dataset = H5Dcreate2(file, DATASETNAME, H5T_NATIVE_UINT, dataspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close DCPL */ - status = H5Pclose(dcpl); - CHECK(status, FAIL, "H5Pclose"); - - /* Write out entire dataset */ - status = H5Dwrite(dataset, H5T_NATIVE_UINT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data_out); - CHECK(status, FAIL, "H5Dclose"); - - /* Create memory dataspace (same size as a chunk) */ - memspace = H5Screate_simple(SPACE12_RANK, chunk_dims, NULL); - CHECK(dataspace, FAIL, "H5Screate_simple"); - - /* - * Define hyperslab in the file dataspace. - */ - start[0] = 0; - count[0] = SPACE12_CHUNK_DIM0; - status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, start, NULL, count, NULL); - CHECK(status, FAIL, "H5Sselect_hyperslab"); - - /* Loop through retrieving data from file, checking it against data written */ - for (u = 0; u < SPACE12_DIM0; u += SPACE12_CHUNK_DIM0) { - /* Set the offset of the file selection */ - offset[0] = u; - status = H5Soffset_simple(dataspace, offset); - CHECK(status, FAIL, "H5Soffset_simple"); - - /* Read in buffer of data */ - status = H5Dread(dataset, H5T_NATIVE_UINT, memspace, dataspace, H5P_DEFAULT, data_in); - CHECK(status, FAIL, "H5Dread"); - - /* Check data read in */ - for (v = 0; v < SPACE12_CHUNK_DIM0; v++) - if (data_out[u + v] != data_in[v]) - TestErrPrintf("Error! data_out[%u]=%u, data_in[%u]=%u\n", (unsigned)(u + v), data_out[u + v], - v, data_in[v]); - } /* end for */ - - status = H5Dclose(dataset); - CHECK(status, FAIL, "H5Dclose"); - - status = H5Sclose(dataspace); - CHECK(status, FAIL, "H5Sclose"); - - status = H5Sclose(memspace); - CHECK(status, FAIL, "H5Sclose"); - - status = H5Fclose(file); - CHECK(status, FAIL, "H5Fclose"); -} /* test_select_hyper_chunk_offset2() */ -#endif -/**************************************************************** -** -** test_select_bounds(): Tests selection bounds on dataspaces, -** both with and without offsets. -** -****************************************************************/ -static void -test_select_bounds(void) -{ - hid_t sid; /* Dataspace ID */ - const hsize_t dims[SPACE11_RANK] = {SPACE11_DIM1, SPACE11_DIM2}; /* Dataspace dimensions */ - hsize_t coord[SPACE11_NPOINTS][SPACE11_RANK]; /* Coordinates for point selection */ - hsize_t start[SPACE11_RANK]; /* The start of the hyperslab */ - hsize_t stride[SPACE11_RANK]; /* The stride between block starts for the hyperslab */ - hsize_t count[SPACE11_RANK]; /* The number of blocks for the hyperslab */ - hsize_t block[SPACE11_RANK]; /* The size of each block for the hyperslab */ - hssize_t offset[SPACE11_RANK]; /* Offset amount for selection */ - hsize_t low_bounds[SPACE11_RANK]; /* The low bounds for the selection */ - hsize_t high_bounds[SPACE11_RANK]; /* The high bounds for the selection */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing selection bounds\n")); - - /* Create dataspace */ - sid = H5Screate_simple(SPACE11_RANK, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Get bounds for 'all' selection */ - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low_bounds[0], 0, "H5Sget_select_bounds"); - VERIFY(low_bounds[1], 0, "H5Sget_select_bounds"); - VERIFY(high_bounds[0], SPACE11_DIM1 - 1, "H5Sget_select_bounds"); - VERIFY(high_bounds[1], SPACE11_DIM2 - 1, "H5Sget_select_bounds"); - - /* Set offset for selection */ - offset[0] = 1; - offset[1] = 1; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Get bounds for 'all' selection with offset (which should be ignored) */ - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low_bounds[0], 0, "H5Sget_select_bounds"); - VERIFY(low_bounds[1], 0, "H5Sget_select_bounds"); - VERIFY(high_bounds[0], SPACE11_DIM1 - 1, "H5Sget_select_bounds"); - VERIFY(high_bounds[1], SPACE11_DIM2 - 1, "H5Sget_select_bounds"); - - /* Reset offset for selection */ - offset[0] = 0; - offset[1] = 0; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Set 'none' selection */ - ret = H5Sselect_none(sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Get bounds for 'none' selection */ - H5E_BEGIN_TRY - { - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sget_select_bounds"); - - /* Set point selection */ - coord[0][0] = 3; - coord[0][1] = 3; - coord[1][0] = 3; - coord[1][1] = 96; - coord[2][0] = 96; - coord[2][1] = 3; - coord[3][0] = 96; - coord[3][1] = 96; - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)SPACE11_NPOINTS, (const hsize_t *)coord); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Get bounds for point selection */ - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low_bounds[0], 3, "H5Sget_select_bounds"); - VERIFY(low_bounds[1], 3, "H5Sget_select_bounds"); - VERIFY(high_bounds[0], SPACE11_DIM1 - 4, "H5Sget_select_bounds"); - VERIFY(high_bounds[1], SPACE11_DIM2 - 4, "H5Sget_select_bounds"); - - /* Set bad offset for selection */ - offset[0] = 5; - offset[1] = -5; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Get bounds for hyperslab selection with negative offset */ - H5E_BEGIN_TRY - { - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sget_select_bounds"); - - /* Set valid offset for selection */ - offset[0] = 2; - offset[1] = -2; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Get bounds for point selection with offset */ - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low_bounds[0], 5, "H5Sget_select_bounds"); - VERIFY(low_bounds[1], 1, "H5Sget_select_bounds"); - VERIFY(high_bounds[0], SPACE11_DIM1 - 2, "H5Sget_select_bounds"); - VERIFY(high_bounds[1], SPACE11_DIM2 - 6, "H5Sget_select_bounds"); - - /* Reset offset for selection */ - offset[0] = 0; - offset[1] = 0; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Set "regular" hyperslab selection */ - start[0] = 2; - start[1] = 2; - stride[0] = 10; - stride[1] = 10; - count[0] = 4; - count[1] = 4; - block[0] = 5; - block[1] = 5; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Get bounds for hyperslab selection */ - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low_bounds[0], 2, "H5Sget_select_bounds"); - VERIFY(low_bounds[1], 2, "H5Sget_select_bounds"); - VERIFY(high_bounds[0], 36, "H5Sget_select_bounds"); - VERIFY(high_bounds[1], 36, "H5Sget_select_bounds"); - - /* Set bad offset for selection */ - offset[0] = 5; - offset[1] = -5; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Get bounds for hyperslab selection with negative offset */ - H5E_BEGIN_TRY - { - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sget_select_bounds"); - - /* Set valid offset for selection */ - offset[0] = 5; - offset[1] = -2; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Get bounds for hyperslab selection with offset */ - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low_bounds[0], 7, "H5Sget_select_bounds"); - VERIFY(low_bounds[1], 0, "H5Sget_select_bounds"); - VERIFY(high_bounds[0], 41, "H5Sget_select_bounds"); - VERIFY(high_bounds[1], 34, "H5Sget_select_bounds"); - - /* Reset offset for selection */ - offset[0] = 0; - offset[1] = 0; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Make "irregular" hyperslab selection */ - start[0] = 20; - start[1] = 20; - stride[0] = 20; - stride[1] = 20; - count[0] = 2; - count[1] = 2; - block[0] = 10; - block[1] = 10; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Get bounds for hyperslab selection */ - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low_bounds[0], 2, "H5Sget_select_bounds"); - VERIFY(low_bounds[1], 2, "H5Sget_select_bounds"); - VERIFY(high_bounds[0], 49, "H5Sget_select_bounds"); - VERIFY(high_bounds[1], 49, "H5Sget_select_bounds"); - - /* Set bad offset for selection */ - offset[0] = 5; - offset[1] = -5; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Get bounds for hyperslab selection with negative offset */ - H5E_BEGIN_TRY - { - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sget_select_bounds"); - - /* Set valid offset for selection */ - offset[0] = 5; - offset[1] = -2; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Get bounds for hyperslab selection with offset */ - ret = H5Sget_select_bounds(sid, low_bounds, high_bounds); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(low_bounds[0], 7, "H5Sget_select_bounds"); - VERIFY(low_bounds[1], 0, "H5Sget_select_bounds"); - VERIFY(high_bounds[0], 54, "H5Sget_select_bounds"); - VERIFY(high_bounds[1], 47, "H5Sget_select_bounds"); - - /* Reset offset for selection */ - offset[0] = 0; - offset[1] = 0; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_select_bounds() */ - -/**************************************************************** -** -** test_hyper_regular(): Tests query operations on regular hyperslabs -** -****************************************************************/ -static void -test_hyper_regular(void) -{ - hid_t sid; /* Dataspace ID */ - const hsize_t dims[SPACE13_RANK] = {SPACE13_DIM1, SPACE13_DIM2, SPACE13_DIM3}; /* Dataspace dimensions */ - hsize_t coord[SPACE13_NPOINTS][SPACE13_RANK]; /* Coordinates for point selection */ - hsize_t start[SPACE13_RANK]; /* The start of the hyperslab */ - hsize_t stride[SPACE13_RANK]; /* The stride between block starts for the hyperslab */ - hsize_t count[SPACE13_RANK]; /* The number of blocks for the hyperslab */ - hsize_t block[SPACE13_RANK]; /* The size of each block for the hyperslab */ - hsize_t t_start[SPACE13_RANK]; /* Temporary start of the hyperslab */ - hsize_t t_count[SPACE13_RANK]; /* Temporary number of blocks for the hyperslab */ - hsize_t q_start[SPACE13_RANK]; /* The queried start of the hyperslab */ - hsize_t q_stride[SPACE13_RANK]; /* The queried stride between block starts for the hyperslab */ - hsize_t q_count[SPACE13_RANK]; /* The queried number of blocks for the hyperslab */ - hsize_t q_block[SPACE13_RANK]; /* The queried size of each block for the hyperslab */ - htri_t is_regular; /* Whether a hyperslab selection is regular */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing queries on regular hyperslabs\n")); - - /* Create dataspace */ - sid = H5Screate_simple(SPACE13_RANK, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Query if 'all' selection is regular hyperslab (should fail) */ - H5E_BEGIN_TRY - { - is_regular = H5Sis_regular_hyperslab(sid); - } - H5E_END_TRY - VERIFY(is_regular, FAIL, "H5Sis_regular_hyperslab"); - - /* Query regular hyperslab selection info (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sget_regular_hyperslab"); - - /* Set 'none' selection */ - ret = H5Sselect_none(sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Query if 'none' selection is regular hyperslab (should fail) */ - H5E_BEGIN_TRY - { - is_regular = H5Sis_regular_hyperslab(sid); - } - H5E_END_TRY - VERIFY(is_regular, FAIL, "H5Sis_regular_hyperslab"); - - /* Query regular hyperslab selection info (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sget_regular_hyperslab"); - - /* Set point selection */ - coord[0][0] = 3; - coord[0][1] = 3; - coord[0][2] = 3; - coord[1][0] = 3; - coord[1][1] = 48; - coord[1][2] = 48; - coord[2][0] = 48; - coord[2][1] = 3; - coord[2][2] = 3; - coord[3][0] = 48; - coord[3][1] = 48; - coord[3][2] = 48; - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)SPACE13_NPOINTS, (const hsize_t *)coord); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Query if 'point' selection is regular hyperslab (should fail) */ - H5E_BEGIN_TRY - { - is_regular = H5Sis_regular_hyperslab(sid); - } - H5E_END_TRY - VERIFY(is_regular, FAIL, "H5Sis_regular_hyperslab"); - - /* Query regular hyperslab selection info (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sget_regular_hyperslab"); - - /* Set "regular" hyperslab selection */ - start[0] = 2; - start[1] = 2; - start[2] = 2; - stride[0] = 5; - stride[1] = 5; - stride[2] = 5; - count[0] = 3; - count[1] = 3; - count[2] = 3; - block[0] = 4; - block[1] = 4; - block[2] = 4; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Query if 'hyperslab' selection is regular hyperslab (should be true) */ - is_regular = H5Sis_regular_hyperslab(sid); - VERIFY(is_regular, true, "H5Sis_regular_hyperslab"); - - /* Retrieve the hyperslab parameters */ - ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block); - CHECK(ret, FAIL, "H5Sget_regular_hyperslab"); - - /* Verify the hyperslab parameters */ - for (u = 0; u < SPACE13_RANK; u++) { - if (start[u] != q_start[u]) - ERROR("H5Sget_regular_hyperslab, start"); - if (stride[u] != q_stride[u]) - ERROR("H5Sget_regular_hyperslab, stride"); - if (count[u] != q_count[u]) - ERROR("H5Sget_regular_hyperslab, count"); - if (block[u] != q_block[u]) - ERROR("H5Sget_regular_hyperslab, block"); - } /* end for */ - - /* 'OR' in another point */ - t_start[0] = 0; - t_start[1] = 0; - t_start[2] = 0; - t_count[0] = 1; - t_count[1] = 1; - t_count[2] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, t_start, NULL, t_count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Query if 'hyperslab' selection is regular hyperslab (should be false) */ - is_regular = H5Sis_regular_hyperslab(sid); - VERIFY(is_regular, false, "H5Sis_regular_hyperslab"); - - /* Query regular hyperslab selection info (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Sget_regular_hyperslab"); - - /* 'XOR' in the point again, to remove it, which should make it regular again */ - t_start[0] = 0; - t_start[1] = 0; - t_start[2] = 0; - t_count[0] = 1; - t_count[1] = 1; - t_count[2] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_XOR, t_start, NULL, t_count, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Query if 'hyperslab' selection is regular hyperslab (should be true) */ - is_regular = H5Sis_regular_hyperslab(sid); - VERIFY(is_regular, true, "H5Sis_regular_hyperslab"); - - /* Retrieve the hyperslab parameters */ - ret = H5Sget_regular_hyperslab(sid, q_start, q_stride, q_count, q_block); - CHECK(ret, FAIL, "H5Sget_regular_hyperslab"); - - /* Verify the hyperslab parameters */ - for (u = 0; u < SPACE13_RANK; u++) { - if (start[u] != q_start[u]) - ERROR("H5Sget_regular_hyperslab, start"); - if (stride[u] != q_stride[u]) - ERROR("H5Sget_regular_hyperslab, stride"); - if (count[u] != q_count[u]) - ERROR("H5Sget_regular_hyperslab, count"); - if (block[u] != q_block[u]) - ERROR("H5Sget_regular_hyperslab, block"); - } /* end for */ - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_hyper_regular() */ - -/**************************************************************** -** -** test_hyper_unlim(): Tests unlimited hyperslab selections -** -****************************************************************/ -static void -test_hyper_unlim_check(hid_t sid, hsize_t *dims, hssize_t endpoints, hssize_t enblocks, hsize_t *eblock1, - hsize_t *eblock2) -{ - hid_t lim_sid; - hsize_t start[3]; - H5S_sel_type sel_type; - hssize_t npoints; - hssize_t nblocks; - hsize_t blocklist[12]; - herr_t ret; - - assert(enblocks <= 2); - - /* Copy sid to lim_sid */ - lim_sid = H5Scopy(sid); - CHECK(lim_sid, FAIL, "H5Scopy"); - - /* "And" lim_sid with dims to create limited selection */ - memset(start, 0, sizeof(start)); - ret = H5Sselect_hyperslab(lim_sid, H5S_SELECT_AND, start, NULL, dims, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Check number of elements */ - npoints = H5Sget_select_npoints(lim_sid); - CHECK(npoints, FAIL, "H5Sget_select_npoints"); - VERIFY(npoints, endpoints, "H5Sget_select_npoints"); - - /* Get selection type */ - sel_type = H5Sget_select_type(lim_sid); - CHECK(sel_type, H5S_SEL_ERROR, "H5Sget_select_type"); - - /* Only examine blocks for hyperslab selection */ - if (sel_type == H5S_SEL_HYPERSLABS) { - /* Get number of blocks */ - nblocks = H5Sget_select_hyper_nblocks(lim_sid); - CHECK(nblocks, FAIL, "H5Sget_select_hyper_nblocks"); - VERIFY(nblocks, enblocks, "H5Sget_select_hyper_nblocks"); - - if (nblocks > 0) { - /* Get blocklist */ - ret = H5Sget_select_hyper_blocklist(lim_sid, (hsize_t)0, (hsize_t)nblocks, blocklist); - CHECK(ret, FAIL, "H5Sget_select_hyper_blocklist"); - - /* Verify blocklist */ - if (nblocks == (hssize_t)1) { - if (memcmp(blocklist, eblock1, 6 * sizeof(eblock1[0])) != 0) - ERROR("H5Sget_select_hyper_blocklist"); - } /* end if */ - else { - assert(nblocks == (hssize_t)2); - if (memcmp(blocklist, eblock1, 6 * sizeof(eblock1[0])) != 0) { - if (memcmp(blocklist, eblock2, 6 * sizeof(eblock2[0])) != 0) - ERROR("H5Sget_select_hyper_blocklist"); - if (memcmp(&blocklist[6], eblock1, 6 * sizeof(eblock1[0])) != 0) - ERROR("H5Sget_select_hyper_blocklist"); - } /* end if */ - else if (memcmp(&blocklist[6], eblock2, 6 * sizeof(eblock2[0])) != 0) - ERROR("H5Sget_select_hyper_blocklist"); - } /* end else */ - } /* end if */ - } /* end if */ - else if (sel_type != H5S_SEL_NONE) - ERROR("H5Sget_select_type"); - - /* Close the limited dataspace */ - ret = H5Sclose(lim_sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* end test_hyper_unlim_check() */ - -static void -test_hyper_unlim(void) -{ - hid_t sid; - hsize_t dims[3] = {4, 4, 7}; - hsize_t mdims[3] = {4, H5S_UNLIMITED, 7}; - hsize_t start[3] = {1, 2, 1}; - hsize_t stride[3] = {1, 1, 3}; - hsize_t count[3] = {1, 1, 2}; - hsize_t block[3] = {2, H5S_UNLIMITED, 2}; - hsize_t start2[3]; - hsize_t count2[3]; - hsize_t eblock1[6] = {1, 2, 1, 2, 3, 2}; - hsize_t eblock2[6] = {1, 2, 4, 2, 3, 5}; - hssize_t offset[3] = {0, -1, 0}; - hssize_t ssize_out; - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(6, ("Testing unlimited hyperslab selections\n")); - - /* Create dataspace */ - sid = H5Screate_simple(3, dims, mdims); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Select unlimited hyperslab */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Check with unlimited dimension clipped to 4 */ - test_hyper_unlim_check(sid, dims, (hssize_t)16, (hssize_t)2, eblock1, eblock2); - - /* Check with unlimited dimension clipped to 3 */ - dims[1] = 3; - eblock1[4] = 2; - eblock2[4] = 2; - test_hyper_unlim_check(sid, dims, (hssize_t)8, (hssize_t)2, eblock1, eblock2); - - /* Check with unlimited dimension clipped to 2 */ - dims[1] = 2; - test_hyper_unlim_check(sid, dims, (hssize_t)0, (hssize_t)0, eblock1, eblock2); - - /* Check with unlimited dimension clipped to 1 */ - dims[1] = 1; - test_hyper_unlim_check(sid, dims, (hssize_t)0, (hssize_t)0, eblock1, eblock2); - - /* Check with unlimited dimension clipped to 7 */ - dims[1] = 7; - eblock1[4] = 6; - eblock2[4] = 6; - test_hyper_unlim_check(sid, dims, (hssize_t)40, (hssize_t)2, eblock1, eblock2); - - /* Set offset of selection */ - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Check with adjusted offset (should not affect result) */ - test_hyper_unlim_check(sid, dims, (hssize_t)40, (hssize_t)2, eblock1, eblock2); - - /* Reset offset of selection */ - offset[1] = (hssize_t)0; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* - * Now try with multiple blocks in unlimited dimension - */ - stride[1] = 3; - stride[2] = 1; - count[1] = H5S_UNLIMITED; - count[2] = 1; - block[1] = 2; - - /* Select unlimited hyperslab */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Check with new selection */ - eblock1[1] = 2; - eblock1[4] = 3; - eblock2[1] = 5; - eblock2[2] = 1; - eblock2[4] = 6; - eblock2[5] = 2; - test_hyper_unlim_check(sid, dims, (hssize_t)16, (hssize_t)2, eblock1, eblock2); - - /* Check with unlimited dimension clipped to 3 */ - dims[1] = 3; - eblock1[4] = 2; - test_hyper_unlim_check(sid, dims, (hssize_t)4, (hssize_t)1, eblock1, eblock2); - - /* Check with unlimited dimension clipped to 4 */ - dims[1] = 4; - eblock1[4] = 3; - test_hyper_unlim_check(sid, dims, (hssize_t)8, (hssize_t)1, eblock1, eblock2); - - /* Check with unlimited dimension clipped to 5 */ - dims[1] = 5; - eblock1[4] = 3; - test_hyper_unlim_check(sid, dims, (hssize_t)8, (hssize_t)1, eblock1, eblock2); - - /* Check with unlimited dimension clipped to 6 */ - dims[1] = 6; - eblock1[4] = 3; - eblock2[4] = 5; - test_hyper_unlim_check(sid, dims, (hssize_t)12, (hssize_t)2, eblock1, eblock2); - - /* Set offset of selection */ - offset[1] = (hssize_t)-1; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Check with adjusted offset (should not affect result) */ - test_hyper_unlim_check(sid, dims, (hssize_t)12, (hssize_t)2, eblock1, eblock2); - - /* Set offset of selection */ - offset[1] = (hssize_t)3; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* Check with adjusted offset (should not affect result) */ - test_hyper_unlim_check(sid, dims, (hssize_t)12, (hssize_t)2, eblock1, eblock2); - - /* Reset offset of selection */ - offset[1] = (hssize_t)0; - ret = H5Soffset_simple(sid, offset); - CHECK(ret, FAIL, "H5Soffset_simple"); - - /* - * Now try invalid operations - */ - H5E_BEGIN_TRY - { - /* Try multiple unlimited dimensions */ - start[0] = 1; - start[1] = 2; - start[2] = 1; - stride[0] = 1; - stride[1] = 3; - stride[2] = 3; - count[0] = 1; - count[1] = H5S_UNLIMITED; - count[2] = H5S_UNLIMITED; - block[0] = 2; - block[1] = 2; - block[2] = 2; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - - /* Try unlimited count and block */ - count[2] = 2; - block[1] = H5S_UNLIMITED; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - } - H5E_END_TRY - - /* Try operations with two unlimited selections */ - block[1] = 2; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - H5E_BEGIN_TRY - { - ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, start, NULL, count, NULL); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - ret = H5Sselect_hyperslab(sid, H5S_SELECT_AND, start, NULL, count, NULL); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - ret = H5Sselect_hyperslab(sid, H5S_SELECT_XOR, start, NULL, count, NULL); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTB, start, NULL, count, NULL); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTA, start, NULL, count, NULL); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - } - H5E_END_TRY - - /* Try invalid combination operations */ - H5E_BEGIN_TRY - { - ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, start, NULL, block, NULL); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - ret = H5Sselect_hyperslab(sid, H5S_SELECT_XOR, start, NULL, block, NULL); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTB, start, NULL, block, NULL); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - } - H5E_END_TRY - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, NULL, block, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - H5E_BEGIN_TRY - { - ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, start, stride, count, block); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - ret = H5Sselect_hyperslab(sid, H5S_SELECT_XOR, start, stride, count, block); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTA, start, stride, count, block); - VERIFY(ret, FAIL, "H5Sselect_hyperslab"); - } - H5E_END_TRY - - /* - * Now test valid combination operations - */ - /* unlim AND non-unlim */ - count[0] = 1; - count[1] = H5S_UNLIMITED; - count[2] = 2; - block[0] = 2; - block[1] = 2; - block[2] = 2; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - start2[0] = 2; - start2[1] = 2; - start2[2] = 0; - count2[0] = 5; - count2[1] = 4; - count2[2] = 2; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_AND, start2, NULL, count2, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - eblock1[0] = 2; - eblock1[3] = 2; - eblock1[1] = 2; - eblock1[4] = 3; - eblock1[2] = 1; - eblock1[5] = 1; - eblock2[0] = 2; - eblock2[3] = 2; - eblock2[1] = 5; - eblock2[4] = 5; - eblock2[2] = 1; - eblock2[5] = 1; - dims[0] = 50; - dims[1] = 50; - dims[2] = 50; - test_hyper_unlim_check(sid, dims, (hssize_t)3, (hssize_t)2, eblock1, eblock2); - - /* unlim NOTA non-unlim */ - count[0] = 1; - count[1] = H5S_UNLIMITED; - count[2] = 2; - block[0] = 2; - block[1] = 2; - block[2] = 2; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - start2[0] = 1; - start2[1] = 5; - start2[2] = 2; - count2[0] = 2; - count2[1] = 2; - count2[2] = 6; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTA, start2, NULL, count2, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - eblock1[0] = 1; - eblock1[3] = 2; - eblock1[1] = 5; - eblock1[4] = 6; - eblock1[2] = 3; - eblock1[5] = 3; - eblock2[0] = 1; - eblock2[3] = 2; - eblock2[1] = 5; - eblock2[4] = 6; - eblock2[2] = 6; - eblock2[5] = 7; - dims[0] = 50; - dims[1] = 50; - dims[2] = 50; - test_hyper_unlim_check(sid, dims, (hssize_t)12, (hssize_t)2, eblock1, eblock2); - - /* non-unlim AND unlim */ - start2[0] = 2; - start2[1] = 2; - start2[2] = 0; - count2[0] = 5; - count2[1] = 4; - count2[2] = 2; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start2, NULL, count2, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - count[0] = 1; - count[1] = H5S_UNLIMITED; - count[2] = 2; - block[0] = 2; - block[1] = 2; - block[2] = 2; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_AND, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - eblock1[0] = 2; - eblock1[3] = 2; - eblock1[1] = 2; - eblock1[4] = 3; - eblock1[2] = 1; - eblock1[5] = 1; - eblock2[0] = 2; - eblock2[3] = 2; - eblock2[1] = 5; - eblock2[4] = 5; - eblock2[2] = 1; - eblock2[5] = 1; - dims[0] = 50; - dims[1] = 50; - dims[2] = 50; - test_hyper_unlim_check(sid, dims, (hssize_t)3, (hssize_t)2, eblock1, eblock2); - - /* non-unlim NOTB unlim */ - start2[0] = 1; - start2[1] = 5; - start2[2] = 2; - count2[0] = 2; - count2[1] = 2; - count2[2] = 6; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start2, NULL, count2, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - count[0] = 1; - count[1] = H5S_UNLIMITED; - count[2] = 2; - block[0] = 2; - block[1] = 2; - block[2] = 2; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_NOTB, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - eblock1[0] = 1; - eblock1[3] = 2; - eblock1[1] = 5; - eblock1[4] = 6; - eblock1[2] = 3; - eblock1[5] = 3; - eblock2[0] = 1; - eblock2[3] = 2; - eblock2[1] = 5; - eblock2[4] = 6; - eblock2[2] = 6; - eblock2[5] = 7; - dims[0] = 50; - dims[1] = 50; - dims[2] = 50; - test_hyper_unlim_check(sid, dims, (hssize_t)12, (hssize_t)2, eblock1, eblock2); - - /* Test H5Sget_select_npoints() */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - ssize_out = H5Sget_select_npoints(sid); - VERIFY(ssize_out, (hssize_t)H5S_UNLIMITED, "H5Sget_select_npoints"); - - /* Test H5Sget_select_hyper_nblocks() */ - H5E_BEGIN_TRY - { - ssize_out = H5Sget_select_hyper_nblocks(sid); - } - H5E_END_TRY - VERIFY(ssize_out, (hssize_t)H5S_UNLIMITED, "H5Sget_select_hyper_nblocks"); - - /* Test H5Sget_select_bounds() */ - ret = H5Sget_select_bounds(sid, start2, count2); - CHECK(ret, FAIL, "H5Sget_select_bounds"); - VERIFY(start2[0], start[0], "H5Sget_select_bounds"); - VERIFY(start2[1], start[1], "H5Sget_select_bounds"); - VERIFY(start2[2], start[2], "H5Sget_select_bounds"); - VERIFY(count2[0], (long)(start[0] + (stride[0] * (count[0] - 1)) + block[0] - 1), "H5Sget_select_bounds"); - VERIFY(count2[1], H5S_UNLIMITED, "H5Sget_select_bounds"); - VERIFY(count2[2], (long)(start[2] + (stride[2] * (count[2] - 1)) + block[2] - 1), "H5Sget_select_bounds"); - - /* Close the dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* end test_hyper_unlim() */ - -/**************************************************************** -** -** test_internal_consistency(): Tests selections on dataspace, then -** verify that internal states of data structures of selections are -** consistent. -** -****************************************************************/ -static void -test_internal_consistency(void) -{ - hid_t all_sid; /* Dataspace ID with "all" selection */ - hid_t none_sid; /* Dataspace ID with "none" selection */ - hid_t single_pt_sid; /* Dataspace ID with single point selection */ - hid_t mult_pt_sid; /* Dataspace ID with multiple point selection */ - hid_t single_hyper_sid; /* Dataspace ID with single block hyperslab selection */ - hid_t single_hyper_all_sid; /* Dataspace ID with single block hyperslab - * selection that is the entire dataspace - */ - hid_t single_hyper_pt_sid; /* Dataspace ID with single block hyperslab - * selection that is the same as the single - * point selection - */ - hid_t regular_hyper_sid; /* Dataspace ID with regular hyperslab selection */ - hid_t irreg_hyper_sid; /* Dataspace ID with irregular hyperslab selection */ - hid_t none_hyper_sid; /* Dataspace ID with "no hyperslabs" selection */ - hid_t scalar_all_sid; /* ID for scalar dataspace with "all" selection */ - hid_t scalar_none_sid; /* ID for scalar dataspace with "none" selection */ - hid_t tmp_sid; /* Temporary dataspace ID */ - hsize_t dims[] = {SPACE9_DIM1, SPACE9_DIM2}; - hsize_t coord1[1][SPACE2_RANK]; /* Coordinates for single point selection */ - hsize_t coord2[SPACE9_DIM2][SPACE9_RANK]; /* Coordinates for multiple point selection */ - hsize_t start[SPACE9_RANK]; /* Hyperslab start */ - hsize_t stride[SPACE9_RANK]; /* Hyperslab stride */ - hsize_t count[SPACE9_RANK]; /* Hyperslab block count */ - hsize_t block[SPACE9_RANK]; /* Hyperslab block size */ -#if 0 - htri_t check; /* Shape comparison return value */ -#endif - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing Consistency of Internal States\n")); - assert(SPACE9_DIM2 >= POINT1_NPOINTS); - - /* Create dataspace for "all" selection */ - all_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(all_sid, FAIL, "H5Screate_simple"); - - /* Select entire extent for dataspace */ - ret = H5Sselect_all(all_sid); - CHECK(ret, FAIL, "H5Sselect_all"); - - /* Create dataspace for "none" selection */ - none_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(none_sid, FAIL, "H5Screate_simple"); - - /* Un-Select entire extent for dataspace */ - ret = H5Sselect_none(none_sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Create dataspace for single point selection */ - single_pt_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(single_pt_sid, FAIL, "H5Screate_simple"); - - /* Select sequence of ten points for multiple point selection */ - coord1[0][0] = 2; - coord1[0][1] = 2; - ret = H5Sselect_elements(single_pt_sid, H5S_SELECT_SET, (size_t)1, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Create dataspace for multiple point selection */ - mult_pt_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(mult_pt_sid, FAIL, "H5Screate_simple"); - - /* Select sequence of ten points for multiple point selection */ - coord2[0][0] = 2; - coord2[0][1] = 2; - coord2[1][0] = 7; - coord2[1][1] = 2; - coord2[2][0] = 1; - coord2[2][1] = 4; - coord2[3][0] = 2; - coord2[3][1] = 6; - coord2[4][0] = 0; - coord2[4][1] = 8; - coord2[5][0] = 3; - coord2[5][1] = 2; - coord2[6][0] = 4; - coord2[6][1] = 4; - coord2[7][0] = 1; - coord2[7][1] = 0; - coord2[8][0] = 5; - coord2[8][1] = 1; - coord2[9][0] = 9; - coord2[9][1] = 3; - ret = H5Sselect_elements(mult_pt_sid, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord2); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Create dataspace for single hyperslab selection */ - single_hyper_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(single_hyper_sid, FAIL, "H5Screate_simple"); - - /* Select 10x10 hyperslab for single hyperslab selection */ - start[0] = 1; - start[1] = 1; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = (SPACE9_DIM1 - 2); - block[1] = (SPACE9_DIM2 - 2); - ret = H5Sselect_hyperslab(single_hyper_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for single hyperslab selection with entire extent selected */ - single_hyper_all_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(single_hyper_all_sid, FAIL, "H5Screate_simple"); - - /* Select entire extent for hyperslab selection */ - start[0] = 0; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = SPACE9_DIM1; - block[1] = SPACE9_DIM2; - ret = H5Sselect_hyperslab(single_hyper_all_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for single hyperslab selection with single point selected */ - single_hyper_pt_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(single_hyper_pt_sid, FAIL, "H5Screate_simple"); - - /* Select entire extent for hyperslab selection */ - start[0] = 2; - start[1] = 2; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(single_hyper_pt_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for regular hyperslab selection */ - regular_hyper_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(regular_hyper_sid, FAIL, "H5Screate_simple"); - - /* Select regular, strided hyperslab selection */ - start[0] = 2; - start[1] = 2; - stride[0] = 2; - stride[1] = 2; - count[0] = 5; - count[1] = 2; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(regular_hyper_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for irregular hyperslab selection */ - irreg_hyper_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(irreg_hyper_sid, FAIL, "H5Screate_simple"); - - /* Create irregular hyperslab selection by OR'ing two blocks together */ - start[0] = 2; - start[1] = 2; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(irreg_hyper_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 4; - start[1] = 4; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 3; - block[1] = 3; - ret = H5Sselect_hyperslab(irreg_hyper_sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for "no" hyperslab selection */ - none_hyper_sid = H5Screate_simple(SPACE9_RANK, dims, NULL); - CHECK(none_hyper_sid, FAIL, "H5Screate_simple"); - - /* Create "no" hyperslab selection by XOR'ing same blocks together */ - start[0] = 2; - start[1] = 2; - stride[0] = 1; - stride[1] = 1; - count[0] = 1; - count[1] = 1; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(none_hyper_sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - ret = H5Sselect_hyperslab(none_hyper_sid, H5S_SELECT_XOR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create scalar dataspace for "all" selection */ - scalar_all_sid = H5Screate(H5S_SCALAR); - CHECK(scalar_all_sid, FAIL, "H5Screate"); - - /* Create scalar dataspace for "none" selection */ - scalar_none_sid = H5Screate(H5S_SCALAR); - CHECK(scalar_none_sid, FAIL, "H5Screate"); - - /* Un-Select entire extent for dataspace */ - ret = H5Sselect_none(scalar_none_sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Test all the selections created */ - - /* Test the copy of itself */ - tmp_sid = H5Scopy(all_sid); - CHECK(tmp_sid, FAIL, "H5Scopy"); -#if 0 - check = H5S__internal_consistency_test(tmp_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); -#endif - ret = H5Sclose(tmp_sid); - CHECK(ret, FAIL, "H5Sclose"); -#if 0 - /* Test "none" selection */ - check = H5S__internal_consistency_test(none_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); - - /* Test single point selection */ - check = H5S__internal_consistency_test(single_pt_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); - - /* Test multiple point selection */ - check = H5S__internal_consistency_test(mult_pt_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); - - /* Test "plain" single hyperslab selection */ - check = H5S__internal_consistency_test(single_hyper_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); - - /* Test "all" single hyperslab selection */ - check = H5S__internal_consistency_test(single_hyper_all_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); - - /* Test "single point" single hyperslab selection */ - check = H5S__internal_consistency_test(single_hyper_pt_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); - - /* Test regular, strided hyperslab selection */ - check = H5S__internal_consistency_test(regular_hyper_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); - - /* Test irregular hyperslab selection */ - check = H5S__internal_consistency_test(irreg_hyper_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); - - /* Test "no" hyperslab selection */ - check = H5S__internal_consistency_test(none_hyper_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); - - /* Test scalar "all" hyperslab selection */ - check = H5S__internal_consistency_test(scalar_all_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); - - /* Test scalar "none" hyperslab selection */ - check = H5S__internal_consistency_test(scalar_none_sid); - VERIFY(check, true, "H5S__internal_consistency_test"); -#endif - - /* Close dataspaces */ - ret = H5Sclose(all_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(none_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(single_pt_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(mult_pt_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(single_hyper_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(single_hyper_all_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(single_hyper_pt_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(regular_hyper_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(irreg_hyper_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(none_hyper_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(scalar_all_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(scalar_none_sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_internal_consistency() */ - -/**************************************************************** -** -** test_irreg_io(): Tests unusual selections on datasets, to stress the -** new hyperslab code. -** -****************************************************************/ -static void -test_irreg_io(void) -{ - hid_t fid; /* File ID */ - hid_t did; /* Dataset ID */ - hid_t dcpl_id; /* Dataset creation property list ID */ - hid_t sid; /* File dataspace ID */ - hid_t mem_sid; /* Memory dataspace ID */ - hsize_t dims[] = {6, 12}; /* Dataspace dimensions */ - hsize_t chunk_dims[] = {2, 2}; /* Chunk dimensions */ - hsize_t mem_dims[] = {32}; /* Memory dataspace dimensions */ - hsize_t start[2]; /* Hyperslab start */ - hsize_t stride[2]; /* Hyperslab stride */ - hsize_t count[2]; /* Hyperslab block count */ - hsize_t block[2]; /* Hyperslab block size */ - unsigned char wbuf[72]; /* Write buffer */ - unsigned char rbuf[32]; /* Read buffer */ - unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing Irregular Hyperslab I/O\n")); - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create dataspace for dataset */ - sid = H5Screate_simple(2, dims, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Set chunk dimensions for dataset */ - dcpl_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl_id, FAIL, "H5Pcreate"); - ret = H5Pset_chunk(dcpl_id, 2, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Create a dataset */ - did = H5Dcreate2(fid, SPACE1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl_id, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dcreate2"); - - /* Initialize the write buffer */ - for (u = 0; u < 72; u++) - wbuf[u] = (unsigned char)u; - - /* Write entire dataset to disk */ - ret = H5Dwrite(did, H5T_NATIVE_UCHAR, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close the DCPL */ - ret = H5Pclose(dcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Create dataspace for memory selection */ - mem_sid = H5Screate_simple(1, mem_dims, NULL); - CHECK(mem_sid, FAIL, "H5Screate_simple"); - - /* Select 'L'-shaped region within dataset */ - start[0] = 0; - start[1] = 10; - stride[0] = 1; - stride[1] = 1; - count[0] = 4; - count[1] = 2; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 4; - start[1] = 0; - stride[0] = 1; - stride[1] = 1; - count[0] = 2; - count[1] = 12; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Reset the buffer */ - memset(rbuf, 0, sizeof(rbuf)); - - /* Read selection from disk */ - ret = H5Dread(did, H5T_NATIVE_UCHAR, mem_sid, sid, H5P_DEFAULT, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Close everything */ - ret = H5Sclose(mem_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); -} /* test_irreg_io() */ - -/**************************************************************** -** -** test_sel_iter(): Test selection iterator API routines. -** -****************************************************************/ -static void -test_sel_iter(void) -{ - hid_t sid; /* Dataspace ID */ - hid_t iter_id; /* Dataspace selection iterator ID */ - hsize_t dims1[] = {6, 12}; /* 2-D Dataspace dimensions */ - hsize_t coord1[POINT1_NPOINTS][2]; /* Coordinates for point selection */ - hsize_t start[2]; /* Hyperslab start */ - hsize_t stride[2]; /* Hyperslab stride */ - hsize_t count[2]; /* Hyperslab block count */ - hsize_t block[2]; /* Hyperslab block size */ - size_t nseq; /* # of sequences retrieved */ - size_t nbytes; /* # of bytes retrieved */ - hsize_t off[SEL_ITER_MAX_SEQ]; /* Offsets for retrieved sequences */ - size_t len[SEL_ITER_MAX_SEQ]; /* Lengths for retrieved sequences */ - H5S_sel_type sel_type; /* Selection type */ - unsigned sel_share; /* Whether to share selection with dataspace */ - unsigned sel_iter_flags; /* Flags for selection iterator creation */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing Dataspace Selection Iterators\n")); - - /* Create dataspace */ - sid = H5Screate_simple(2, dims1, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Try creating selection iterator object with bad parameters */ - H5E_BEGIN_TRY - { /* Bad dataspace ID */ - iter_id = H5Ssel_iter_create(H5I_INVALID_HID, (size_t)1, (unsigned)0); - } - H5E_END_TRY - VERIFY(iter_id, FAIL, "H5Ssel_iter_create"); - H5E_BEGIN_TRY - { /* Bad element size */ - iter_id = H5Ssel_iter_create(sid, (size_t)0, (unsigned)0); - } - H5E_END_TRY - VERIFY(iter_id, FAIL, "H5Ssel_iter_create"); - H5E_BEGIN_TRY - { /* Bad flag(s) */ - iter_id = H5Ssel_iter_create(sid, (size_t)1, (unsigned)0xffff); - } - H5E_END_TRY - VERIFY(iter_id, FAIL, "H5Ssel_iter_create"); - - /* Try closing selection iterator, with bad parameters */ - H5E_BEGIN_TRY - { /* Invalid ID */ - ret = H5Ssel_iter_close(H5I_INVALID_HID); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Ssel_iter_close"); - H5E_BEGIN_TRY - { /* Not a selection iterator ID */ - ret = H5Ssel_iter_close(sid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Ssel_iter_close"); - - /* Try with no selection sharing, and with sharing */ - for (sel_share = 0; sel_share < 2; sel_share++) { - /* Set selection iterator sharing flags */ - if (sel_share) - sel_iter_flags = H5S_SEL_ITER_SHARE_WITH_DATASPACE; - else - sel_iter_flags = 0; - - /* Create selection iterator object */ - iter_id = H5Ssel_iter_create(sid, (size_t)1, (unsigned)sel_iter_flags); - CHECK(iter_id, FAIL, "H5Ssel_iter_create"); - - /* Close selection iterator */ - ret = H5Ssel_iter_close(iter_id); - CHECK(ret, FAIL, "H5Ssel_iter_close"); - - /* Try closing selection iterator twice */ - H5E_BEGIN_TRY - { /* Invalid ID */ - ret = H5Ssel_iter_close(iter_id); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Ssel_iter_close"); - - /* Create selection iterator object */ - iter_id = H5Ssel_iter_create(sid, (size_t)1, (unsigned)sel_iter_flags); - CHECK(iter_id, FAIL, "H5Ssel_iter_create"); - - /* Try resetting selection iterator with bad parameters */ - H5E_BEGIN_TRY - { - ret = H5Ssel_iter_reset(H5I_INVALID_HID, sid); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Ssel_iter_reset"); - H5E_BEGIN_TRY - { - ret = H5Ssel_iter_reset(iter_id, H5I_INVALID_HID); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Ssel_iter_reset"); - - /* Try retrieving sequences, with bad parameters */ - H5E_BEGIN_TRY - { /* Invalid ID */ - ret = H5Ssel_iter_get_seq_list(H5I_INVALID_HID, (size_t)1, (size_t)1, &nseq, &nbytes, off, len); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Ssel_iter_get_seq_list"); - H5E_BEGIN_TRY - { /* Invalid nseq pointer */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)1, (size_t)1, NULL, &nbytes, off, len); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Ssel_iter_get_seq_list"); - H5E_BEGIN_TRY - { /* Invalid nbytes pointer */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)1, (size_t)1, &nseq, NULL, off, len); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Ssel_iter_get_seq_list"); - H5E_BEGIN_TRY - { /* Invalid offset array */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)1, (size_t)1, &nseq, &nbytes, NULL, len); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Ssel_iter_get_seq_list"); - H5E_BEGIN_TRY - { /* Invalid length array */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)1, (size_t)1, &nseq, &nbytes, off, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Ssel_iter_get_seq_list"); - - /* Close selection iterator */ - ret = H5Ssel_iter_close(iter_id); - CHECK(ret, FAIL, "H5Ssel_iter_close"); - - /* Test iterators on various basic selection types */ - for (sel_type = H5S_SEL_NONE; sel_type <= H5S_SEL_ALL; sel_type = (H5S_sel_type)(sel_type + 1)) { - switch (sel_type) { - case H5S_SEL_NONE: /* "None" selection */ - ret = H5Sselect_none(sid); - CHECK(ret, FAIL, "H5Sselect_none"); - break; - - case H5S_SEL_POINTS: /* Point selection */ - /* Select sequence of ten points */ - coord1[0][0] = 0; - coord1[0][1] = 9; - coord1[1][0] = 1; - coord1[1][1] = 2; - coord1[2][0] = 2; - coord1[2][1] = 4; - coord1[3][0] = 0; - coord1[3][1] = 6; - coord1[4][0] = 1; - coord1[4][1] = 8; - coord1[5][0] = 2; - coord1[5][1] = 10; - coord1[6][0] = 0; - coord1[6][1] = 11; - coord1[7][0] = 1; - coord1[7][1] = 4; - coord1[8][0] = 2; - coord1[8][1] = 1; - coord1[9][0] = 0; - coord1[9][1] = 3; - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, - (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - break; - - case H5S_SEL_HYPERSLABS: /* Hyperslab selection */ - /* Select regular hyperslab */ - start[0] = 3; - start[1] = 0; - stride[0] = 2; - stride[1] = 2; - count[0] = 2; - count[1] = 5; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - break; - - case H5S_SEL_ALL: /* "All" selection */ - ret = H5Sselect_all(sid); - CHECK(ret, FAIL, "H5Sselect_all"); - break; - - case H5S_SEL_ERROR: - case H5S_SEL_N: - default: - assert(0 && "Can't occur"); - break; - } /* end switch */ - - /* Create selection iterator object */ - iter_id = H5Ssel_iter_create(sid, (size_t)1, (unsigned)sel_iter_flags); - CHECK(iter_id, FAIL, "H5Ssel_iter_create"); - - /* Try retrieving no sequences, with 0 for maxseq & maxbytes */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)0, (size_t)1, &nseq, &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - VERIFY(nseq, 0, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 0, "H5Ssel_iter_get_seq_list"); - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)1, (size_t)0, &nseq, &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - VERIFY(nseq, 0, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 0, "H5Ssel_iter_get_seq_list"); - - /* Try retrieving all sequences */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)SEL_ITER_MAX_SEQ, (size_t)(1024 * 1024), &nseq, - &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - - /* Check results from retrieving sequence list */ - switch (sel_type) { - case H5S_SEL_NONE: /* "None" selection */ - VERIFY(nseq, 0, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 0, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_POINTS: /* Point selection */ - VERIFY(nseq, 10, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 10, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_HYPERSLABS: /* Hyperslab selection */ - VERIFY(nseq, 10, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 10, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_ALL: /* "All" selection */ - VERIFY(nseq, 1, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 72, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_ERROR: - case H5S_SEL_N: - default: - assert(0 && "Can't occur"); - break; - } /* end switch */ - - /* Close selection iterator */ - ret = H5Ssel_iter_close(iter_id); - CHECK(ret, FAIL, "H5Ssel_iter_close"); - } /* end for */ - - /* Create selection iterator object */ - iter_id = H5Ssel_iter_create(sid, (size_t)1, (unsigned)sel_iter_flags); - CHECK(iter_id, FAIL, "H5Ssel_iter_create"); - - /* Test iterators on various basic selection types using - * H5Ssel_iter_reset instead of creating multiple iterators */ - for (sel_type = H5S_SEL_NONE; sel_type <= H5S_SEL_ALL; sel_type = (H5S_sel_type)(sel_type + 1)) { - switch (sel_type) { - case H5S_SEL_NONE: /* "None" selection */ - ret = H5Sselect_none(sid); - CHECK(ret, FAIL, "H5Sselect_none"); - break; - - case H5S_SEL_POINTS: /* Point selection */ - /* Select sequence of ten points */ - coord1[0][0] = 0; - coord1[0][1] = 9; - coord1[1][0] = 1; - coord1[1][1] = 2; - coord1[2][0] = 2; - coord1[2][1] = 4; - coord1[3][0] = 0; - coord1[3][1] = 6; - coord1[4][0] = 1; - coord1[4][1] = 8; - coord1[5][0] = 2; - coord1[5][1] = 10; - coord1[6][0] = 0; - coord1[6][1] = 11; - coord1[7][0] = 1; - coord1[7][1] = 4; - coord1[8][0] = 2; - coord1[8][1] = 1; - coord1[9][0] = 0; - coord1[9][1] = 3; - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, - (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - break; - - case H5S_SEL_HYPERSLABS: /* Hyperslab selection */ - /* Select regular hyperslab */ - start[0] = 3; - start[1] = 0; - stride[0] = 2; - stride[1] = 2; - count[0] = 2; - count[1] = 5; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - break; - - case H5S_SEL_ALL: /* "All" selection */ - ret = H5Sselect_all(sid); - CHECK(ret, FAIL, "H5Sselect_all"); - break; - - case H5S_SEL_ERROR: - case H5S_SEL_N: - default: - assert(0 && "Can't occur"); - break; - } /* end switch */ - - /* Try retrieving no sequences, with 0 for maxseq & maxbytes */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)0, (size_t)1, &nseq, &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - VERIFY(nseq, 0, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 0, "H5Ssel_iter_get_seq_list"); - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)1, (size_t)0, &nseq, &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - VERIFY(nseq, 0, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 0, "H5Ssel_iter_get_seq_list"); - - /* Reset iterator */ - ret = H5Ssel_iter_reset(iter_id, sid); - CHECK(ret, FAIL, "H5Ssel_iter_reset"); - - /* Try retrieving all sequences */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)SEL_ITER_MAX_SEQ, (size_t)(1024 * 1024), &nseq, - &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - - /* Check results from retrieving sequence list */ - switch (sel_type) { - case H5S_SEL_NONE: /* "None" selection */ - VERIFY(nseq, 0, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 0, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_POINTS: /* Point selection */ - VERIFY(nseq, 10, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 10, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_HYPERSLABS: /* Hyperslab selection */ - VERIFY(nseq, 10, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 10, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_ALL: /* "All" selection */ - VERIFY(nseq, 1, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 72, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_ERROR: - case H5S_SEL_N: - default: - assert(0 && "Can't occur"); - break; - } /* end switch */ - - /* Reset iterator */ - ret = H5Ssel_iter_reset(iter_id, sid); - CHECK(ret, FAIL, "H5Ssel_iter_reset"); - - /* Try retrieving all sequences again */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)SEL_ITER_MAX_SEQ, (size_t)(1024 * 1024), &nseq, - &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - - /* Check results from retrieving sequence list */ - switch (sel_type) { - case H5S_SEL_NONE: /* "None" selection */ - VERIFY(nseq, 0, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 0, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_POINTS: /* Point selection */ - VERIFY(nseq, 10, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 10, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_HYPERSLABS: /* Hyperslab selection */ - VERIFY(nseq, 10, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 10, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_ALL: /* "All" selection */ - VERIFY(nseq, 1, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 72, "H5Ssel_iter_get_seq_list"); - break; - - case H5S_SEL_ERROR: - case H5S_SEL_N: - default: - assert(0 && "Can't occur"); - break; - } /* end switch */ - - /* Reset iterator */ - ret = H5Ssel_iter_reset(iter_id, sid); - CHECK(ret, FAIL, "H5Ssel_iter_reset"); - } /* end for */ - - /* Close selection iterator */ - ret = H5Ssel_iter_close(iter_id); - CHECK(ret, FAIL, "H5Ssel_iter_close"); - - /* Point selection which will merge into smaller # of sequences */ - coord1[0][0] = 0; - coord1[0][1] = 9; - coord1[1][0] = 0; - coord1[1][1] = 10; - coord1[2][0] = 0; - coord1[2][1] = 11; - coord1[3][0] = 0; - coord1[3][1] = 6; - coord1[4][0] = 1; - coord1[4][1] = 8; - coord1[5][0] = 2; - coord1[5][1] = 10; - coord1[6][0] = 0; - coord1[6][1] = 11; - coord1[7][0] = 1; - coord1[7][1] = 4; - coord1[8][0] = 1; - coord1[8][1] = 5; - coord1[9][0] = 1; - coord1[9][1] = 6; - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Create selection iterator object */ - iter_id = H5Ssel_iter_create(sid, (size_t)1, (unsigned)sel_iter_flags); - CHECK(iter_id, FAIL, "H5Ssel_iter_create"); - - /* Try retrieving all sequences */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)SEL_ITER_MAX_SEQ, (size_t)(1024 * 1024), &nseq, - &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - VERIFY(nseq, 6, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 10, "H5Ssel_iter_get_seq_list"); - - /* Reset iterator */ - ret = H5Ssel_iter_reset(iter_id, sid); - CHECK(ret, FAIL, "H5Ssel_iter_reset"); - - /* Try retrieving all sequences again */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)SEL_ITER_MAX_SEQ, (size_t)(1024 * 1024), &nseq, - &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - VERIFY(nseq, 6, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 10, "H5Ssel_iter_get_seq_list"); - - /* Close selection iterator */ - ret = H5Ssel_iter_close(iter_id); - CHECK(ret, FAIL, "H5Ssel_iter_close"); - - /* Select irregular hyperslab, which will merge into smaller # of sequences */ - start[0] = 3; - start[1] = 0; - stride[0] = 2; - stride[1] = 2; - count[0] = 2; - count[1] = 5; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - start[0] = 3; - start[1] = 3; - stride[0] = 2; - stride[1] = 2; - count[0] = 2; - count[1] = 5; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create selection iterator object */ - iter_id = H5Ssel_iter_create(sid, (size_t)1, (unsigned)sel_iter_flags); - CHECK(iter_id, FAIL, "H5Ssel_iter_create"); - - /* Try retrieving all sequences */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)SEL_ITER_MAX_SEQ, (size_t)(1024 * 1024), &nseq, - &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - VERIFY(nseq, 6, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 20, "H5Ssel_iter_get_seq_list"); - - /* Reset iterator */ - ret = H5Ssel_iter_reset(iter_id, sid); - CHECK(ret, FAIL, "H5Ssel_iter_reset"); - - /* Try retrieving all sequences again */ - ret = H5Ssel_iter_get_seq_list(iter_id, (size_t)SEL_ITER_MAX_SEQ, (size_t)(1024 * 1024), &nseq, - &nbytes, off, len); - CHECK(ret, FAIL, "H5Ssel_iter_get_seq_list"); - VERIFY(nseq, 6, "H5Ssel_iter_get_seq_list"); - VERIFY(nbytes, 20, "H5Ssel_iter_get_seq_list"); - - /* Close selection iterator */ - ret = H5Ssel_iter_close(iter_id); - CHECK(ret, FAIL, "H5Ssel_iter_close"); - - } /* end for */ - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_sel_iter() */ - -/**************************************************************** -** -** test_select_intersect_block(): Test selections on dataspace, -** verify that "intersect block" routine is working correctly. -** -****************************************************************/ -static void -test_select_intersect_block(void) -{ - hid_t sid; /* Dataspace ID */ - hsize_t dims1[] = {6, 12}; /* 2-D Dataspace dimensions */ - hsize_t block_start[] = {1, 3}; /* Start offset for block */ - hsize_t block_end[] = {2, 5}; /* End offset for block */ - hsize_t block_end2[] = {0, 5}; /* Bad end offset for block */ - hsize_t block_end3[] = {2, 2}; /* Another bad end offset for block */ - hsize_t block_end4[] = {1, 3}; /* End offset that makes a single element block */ - hsize_t coord[10][2]; /* Coordinates for point selection */ - hsize_t start[2]; /* Starting location of hyperslab */ - hsize_t stride[2]; /* Stride of hyperslab */ - hsize_t count[2]; /* Element count of hyperslab */ - hsize_t block[2]; /* Block size of hyperslab */ - htri_t status; /* Intersection status */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing Dataspace Selection Block Intersection\n")); - - /* Create dataspace */ - sid = H5Screate_simple(2, dims1, NULL); - CHECK(sid, FAIL, "H5Screate_simple"); - - /* Try intersection calls with bad parameters */ - H5E_BEGIN_TRY - { /* Bad dataspace ID */ - status = H5Sselect_intersect_block(H5I_INVALID_HID, block_start, block_end); - } - H5E_END_TRY - VERIFY(status, FAIL, "H5Sselect_intersect_block"); - H5E_BEGIN_TRY - { /* Bad start pointer */ - status = H5Sselect_intersect_block(sid, NULL, block_end); - } - H5E_END_TRY - VERIFY(status, FAIL, "H5Sselect_intersect_block"); - H5E_BEGIN_TRY - { /* Bad end pointer */ - status = H5Sselect_intersect_block(sid, block_start, NULL); - } - H5E_END_TRY - VERIFY(status, FAIL, "H5Sselect_intersect_block"); - H5E_BEGIN_TRY - { /* Invalid block */ - status = H5Sselect_intersect_block(sid, block_start, block_end2); - } - H5E_END_TRY - VERIFY(status, FAIL, "H5Sselect_intersect_block"); - H5E_BEGIN_TRY - { /* Another invalid block */ - status = H5Sselect_intersect_block(sid, block_start, block_end3); - } - H5E_END_TRY - VERIFY(status, FAIL, "H5Sselect_intersect_block"); - - /* Set selection to 'none' */ - ret = H5Sselect_none(sid); - CHECK(ret, FAIL, "H5Sselect_none"); - - /* Test block intersection with 'none' selection (always false) */ - status = H5Sselect_intersect_block(sid, block_start, block_end); - VERIFY(status, false, "H5Sselect_intersect_block"); - - /* Set selection to 'all' */ - ret = H5Sselect_all(sid); - CHECK(ret, FAIL, "H5Sselect_all"); - - /* Test block intersection with 'all' selection (always true) */ - status = H5Sselect_intersect_block(sid, block_start, block_end); - VERIFY(status, true, "H5Sselect_intersect_block"); - - /* Select sequence of ten points */ - coord[0][0] = 0; - coord[0][1] = 10; - coord[1][0] = 1; - coord[1][1] = 2; - coord[2][0] = 2; - coord[2][1] = 4; - coord[3][0] = 0; - coord[3][1] = 6; - coord[4][0] = 1; - coord[4][1] = 8; - coord[5][0] = 2; - coord[5][1] = 11; - coord[6][0] = 0; - coord[6][1] = 4; - coord[7][0] = 1; - coord[7][1] = 0; - coord[8][0] = 2; - coord[8][1] = 1; - coord[9][0] = 0; - coord[9][1] = 3; - ret = H5Sselect_elements(sid, H5S_SELECT_SET, (size_t)10, (const hsize_t *)coord); - CHECK(ret, FAIL, "H5Sselect_elements"); - - /* Test block intersection with 'point' selection */ - status = H5Sselect_intersect_block(sid, block_start, block_end); - VERIFY(status, true, "H5Sselect_intersect_block"); - status = H5Sselect_intersect_block(sid, block_start, block_end4); - VERIFY(status, false, "H5Sselect_intersect_block"); - - /* Select single 4x6 hyperslab block at (2,1) */ - start[0] = 2; - start[1] = 1; - stride[0] = 1; - stride[1] = 1; - count[0] = 4; - count[1] = 6; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Test block intersection with single 'hyperslab' selection */ - status = H5Sselect_intersect_block(sid, block_start, block_end); - VERIFY(status, true, "H5Sselect_intersect_block"); - status = H5Sselect_intersect_block(sid, block_start, block_end4); - VERIFY(status, false, "H5Sselect_intersect_block"); - - /* 'OR' another hyperslab block in, making an irregular hyperslab selection */ - start[0] = 3; - start[1] = 2; - stride[0] = 1; - stride[1] = 1; - count[0] = 4; - count[1] = 6; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_OR, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Test block intersection with 'hyperslab' selection */ - status = H5Sselect_intersect_block(sid, block_start, block_end); - VERIFY(status, true, "H5Sselect_intersect_block"); - status = H5Sselect_intersect_block(sid, block_start, block_end4); - VERIFY(status, false, "H5Sselect_intersect_block"); - - /* Select regular, strided hyperslab selection */ - start[0] = 2; - start[1] = 1; - stride[0] = 2; - stride[1] = 2; - count[0] = 2; - count[1] = 4; - block[0] = 1; - block[1] = 1; - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, start, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Test block intersection with single 'hyperslab' selection */ - status = H5Sselect_intersect_block(sid, block_start, block_end); - VERIFY(status, true, "H5Sselect_intersect_block"); - status = H5Sselect_intersect_block(sid, block_start, block_end4); - VERIFY(status, false, "H5Sselect_intersect_block"); - - /* Close dataspace */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); -} /* test_select_intersect_block() */ - -/**************************************************************** -** -** test_hyper_io_1d(): -** Test to verify all the selected 10th element in the 1-d file -** dataspace is read correctly into the 1-d contiguous memory space. -** This is modeled after the test scenario described in HDFFV-10585 -** that demonstrated the hyperslab slowness. A fix to speed up -** performance is in place to handle the special case for 1-d disjoint -** file dataspace into 1-d single block contiguous memory space. -** -****************************************************************/ -static void -test_hyper_io_1d(void) -{ - hid_t fid; /* File ID */ - hid_t did; /* Dataset ID */ - hid_t sid, mid; /* Dataspace IDs */ - hid_t dcpl; /* Dataset creation property list ID */ - hsize_t dims[1], maxdims[1], dimsm[1]; /* Dataset dimension sizes */ - hsize_t chunk_dims[1]; /* Chunk dimension size */ - hsize_t offset[1]; /* Starting offset for hyperslab */ - hsize_t stride[1]; /* Distance between blocks in the hyperslab selection */ - hsize_t count[1]; /* # of blocks in the the hyperslab selection */ - hsize_t block[1]; /* Size of block in the hyperslab selection */ - unsigned int wdata[CHUNKSZ]; /* Data to be written */ - unsigned int rdata[NUM_ELEMENTS / 10]; /* Data to be read */ - herr_t ret; /* Generic return value */ - unsigned i; /* Local index variable */ - - /* Output message about test being performed */ - MESSAGE(6, ("Testing Hyperslab I/O for 1-d single block memory space\n")); - - for (i = 0; i < CHUNKSZ; i++) - wdata[i] = i; - - /* Create the file file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); - - /* Create file dataspace */ - dims[0] = CHUNKSZ; - maxdims[0] = H5S_UNLIMITED; - sid = H5Screate_simple(RANK, dims, maxdims); - CHECK(sid, H5I_INVALID_HID, "H5Pcreate"); - - /* Create memory dataspace */ - dimsm[0] = CHUNKSZ; - mid = H5Screate_simple(RANK, dimsm, NULL); - CHECK(mid, H5I_INVALID_HID, "H5Pcreate"); - - /* Set up to create a chunked dataset */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, H5I_INVALID_HID, "H5Pcreate"); - - chunk_dims[0] = CHUNKSZ; - ret = H5Pset_chunk(dcpl, RANK, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Create a chunked dataset */ - did = H5Dcreate2(fid, DNAME, H5T_NATIVE_INT, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dcreate2"); - - /* Set up hyperslab selection for file dataspace */ - offset[0] = 0; - stride[0] = 1; - count[0] = 1; - block[0] = CHUNKSZ; - - /* Write to each chunk in the dataset */ - for (i = 0; i < NUMCHUNKS; i++) { - /* Set the hyperslab selection */ - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, offset, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Write to the dataset */ - ret = H5Dwrite(did, H5T_NATIVE_INT, mid, sid, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Extend the dataset's dataspace */ - if (i < (NUMCHUNKS - 1)) { - offset[0] = offset[0] + CHUNKSZ; - dims[0] = dims[0] + CHUNKSZ; - ret = H5Dset_extent(did, dims); - CHECK(ret, FAIL, "H5Dset_extent"); - - /* Get the dataset's current dataspace */ - sid = H5Dget_space(did); - CHECK(sid, H5I_INVALID_HID, "H5Dget_space"); - } - } - - /* Closing */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(mid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open the file */ - fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid, H5I_INVALID_HID, "H5Fopen"); - - /* Open the dataset */ - did = H5Dopen2(fid, DNAME, H5P_DEFAULT); - CHECK(did, H5I_INVALID_HID, "H5Dopen"); - - /* Set up to read every 10th element in file dataspace */ - offset[0] = 1; - stride[0] = 10; - count[0] = NUM_ELEMENTS / 10; - block[0] = 1; - - /* Get the dataset's dataspace */ - sid = H5Dget_space(did); - CHECK(sid, H5I_INVALID_HID, "H5Dget_space"); - ret = H5Sselect_hyperslab(sid, H5S_SELECT_SET, offset, stride, count, block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Set up contiguous memory dataspace for the selected elements */ - dimsm[0] = count[0]; - mid = H5Screate_simple(RANK, dimsm, NULL); - CHECK(mid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Read all the selected 10th elements in the dataset into "rdata" */ - ret = H5Dread(did, H5T_NATIVE_INT, mid, sid, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Verify data read is correct */ - for (i = 0; i < 6; i += 2) { - VERIFY(rdata[i], 1, "H5Dread\n"); - VERIFY(rdata[i + 1], 11, "H5Dread\n"); - } - - /* Closing */ - ret = H5Sclose(mid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* test_hyper_io_1d() */ - -/**************************************************************** -** -** test_h5s_set_extent_none: -** Test to verify the behavior of dataspace code when passed -** a dataspace modified by H5Sset_extent_none(). -** -****************************************************************/ -static void -test_h5s_set_extent_none(void) -{ - hid_t sid = H5I_INVALID_HID; - hid_t dst_sid = H5I_INVALID_HID; - hid_t null_sid = H5I_INVALID_HID; - int rank = 1; - hsize_t current_dims = 123; - H5S_class_t cls; - int out_rank; - hsize_t out_dims; - hsize_t out_maxdims; - hssize_t out_points; - htri_t equal; - herr_t ret; - - /* Specific values here don't matter as we're just going to reset */ - sid = H5Screate_simple(rank, ¤t_dims, NULL); - CHECK(sid, H5I_INVALID_HID, "H5Screate_simple"); - - /* Dataspace class will be H5S_NULL after this. - * In versions prior to 1.10.7 / 1.12.1 this would produce a - * dataspace with the internal H5S_NO_CLASS class. - */ - ret = H5Sset_extent_none(sid); - CHECK(ret, FAIL, "H5Sset_extent_none"); - cls = H5Sget_simple_extent_type(sid); - VERIFY(cls, H5S_NULL, "H5Sget_simple_extent_type"); - - /* Extent getters should generate normal results and not segfault. - */ - out_rank = H5Sget_simple_extent_dims(sid, &out_dims, &out_maxdims); - VERIFY(out_rank, 0, "H5Sget_simple_extent_dims"); - out_rank = H5Sget_simple_extent_ndims(sid); - VERIFY(out_rank, 0, "H5Sget_simple_extent_ndims"); - out_points = H5Sget_simple_extent_npoints(sid); - VERIFY(out_points, 0, "H5Sget_simple_extent_npoints"); - - /* Check that copying the new (non-)extent works. - */ - dst_sid = H5Screate_simple(rank, ¤t_dims, NULL); - CHECK(dst_sid, H5I_INVALID_HID, "H5Screate_simple"); - ret = H5Sextent_copy(dst_sid, sid); - CHECK(ret, FAIL, "H5Sextent_copy"); - - /* Check that H5Sset_extent_none() produces the same extent as - * H5Screate(H5S_NULL). - */ - null_sid = H5Screate(H5S_NULL); - CHECK(null_sid, H5I_INVALID_HID, "H5Screate"); - equal = H5Sextent_equal(sid, null_sid); - VERIFY(equal, true, "H5Sextent_equal"); - - /* Close */ - ret = H5Sclose(sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(dst_sid); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Sclose(null_sid); - CHECK(ret, FAIL, "H5Sclose"); - -} /* test_h5s_set_extent_none() */ - -/**************************************************************** -** -** test_select(): Main H5S selection testing routine. -** -****************************************************************/ -void -test_select(void) -{ - hid_t plist_id; /* Property list for reading random hyperslabs */ - hid_t fapl; /* Property list accessing the file */ - int mdc_nelmts; /* Metadata number of elements */ - size_t rdcc_nelmts; /* Raw data number of elements */ - size_t rdcc_nbytes; /* Raw data number of bytes */ - double rdcc_w0; /* Raw data write percentage */ - hssize_t offset[SPACE7_RANK] = {1, 1}; /* Offset for testing selection offsets */ - const char *env_h5_drvr; /* File Driver value from environment */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Selections\n")); - - /* Get the VFD to use */ - env_h5_drvr = getenv(HDF5_DRIVER); - if (env_h5_drvr == NULL) - env_h5_drvr = "nomatch"; - - /* Create a dataset transfer property list */ - plist_id = H5Pcreate(H5P_DATASET_XFER); - CHECK(plist_id, FAIL, "H5Pcreate"); - - /* test I/O with a very small buffer for reads */ - ret = H5Pset_buffer(plist_id, (size_t)59, NULL, NULL); - CHECK(ret, FAIL, "H5Pset_buffer"); - - /* These next tests use the same file */ - test_select_hyper(H5P_DEFAULT); /* Test basic H5S hyperslab selection code */ - test_select_hyper(plist_id); /* Test basic H5S hyperslab selection code */ - test_select_point(H5P_DEFAULT); /* Test basic H5S element selection code, also tests appending to existing - element selections */ - test_select_point(plist_id); /* Test basic H5S element selection code, also tests appending to existing - element selections */ - test_select_all(H5P_DEFAULT); /* Test basic all & none selection code */ - test_select_all(plist_id); /* Test basic all & none selection code */ - test_select_all_hyper(H5P_DEFAULT); /* Test basic all & none selection code */ - test_select_all_hyper(plist_id); /* Test basic all & none selection code */ - - /* These next tests use the same file */ - test_select_combo(); /* Test combined hyperslab & element selection code */ - test_select_hyper_stride(H5P_DEFAULT); /* Test strided hyperslab selection code */ - test_select_hyper_stride(plist_id); /* Test strided hyperslab selection code */ - test_select_hyper_contig(H5T_STD_U16LE, H5P_DEFAULT); /* Test contiguous hyperslab selection code */ - test_select_hyper_contig(H5T_STD_U16LE, plist_id); /* Test contiguous hyperslab selection code */ - test_select_hyper_contig(H5T_STD_U16BE, H5P_DEFAULT); /* Test contiguous hyperslab selection code */ - test_select_hyper_contig(H5T_STD_U16BE, plist_id); /* Test contiguous hyperslab selection code */ - test_select_hyper_contig2(H5T_STD_U16LE, - H5P_DEFAULT); /* Test more contiguous hyperslab selection cases */ - test_select_hyper_contig2(H5T_STD_U16LE, plist_id); /* Test more contiguous hyperslab selection cases */ - test_select_hyper_contig2(H5T_STD_U16BE, - H5P_DEFAULT); /* Test more contiguous hyperslab selection cases */ - test_select_hyper_contig2(H5T_STD_U16BE, plist_id); /* Test more contiguous hyperslab selection cases */ - test_select_hyper_contig3(H5T_STD_U16LE, - H5P_DEFAULT); /* Test yet more contiguous hyperslab selection cases */ - test_select_hyper_contig3(H5T_STD_U16LE, - plist_id); /* Test yet more contiguous hyperslab selection cases */ - test_select_hyper_contig3(H5T_STD_U16BE, - H5P_DEFAULT); /* Test yet more contiguous hyperslab selection cases */ - test_select_hyper_contig3(H5T_STD_U16BE, - plist_id); /* Test yet more contiguous hyperslab selection cases */ -#if 0 - test_select_hyper_contig_dr(H5T_STD_U16LE, H5P_DEFAULT); - test_select_hyper_contig_dr(H5T_STD_U16LE, plist_id); - test_select_hyper_contig_dr(H5T_STD_U16BE, H5P_DEFAULT); - test_select_hyper_contig_dr(H5T_STD_U16BE, plist_id); -#else - printf("** SKIPPED a test due to file creation issues\n"); -#endif -#if 0 - test_select_hyper_checker_board_dr(H5T_STD_U16LE, H5P_DEFAULT); - test_select_hyper_checker_board_dr(H5T_STD_U16LE, plist_id); - test_select_hyper_checker_board_dr(H5T_STD_U16BE, H5P_DEFAULT); - test_select_hyper_checker_board_dr(H5T_STD_U16BE, plist_id); -#else - printf("** SKIPPED a test due to assertion in HDF5\n"); -#endif - test_select_hyper_copy(); /* Test hyperslab selection copying code */ - test_select_point_copy(); /* Test point selection copying code */ - test_select_hyper_offset(); /* Test selection offset code with hyperslabs */ - test_select_hyper_offset2(); /* Test more selection offset code with hyperslabs */ - test_select_point_offset(); /* Test selection offset code with elements */ - test_select_hyper_union(); /* Test hyperslab union code */ - - /* Fancy hyperslab API tests */ - test_select_hyper_union_stagger(); /* Test hyperslab union code for staggered slabs */ - test_select_hyper_union_3d(); /* Test hyperslab union code for 3-D dataset */ - test_select_hyper_valid_combination(); /* Test different input combinations */ - - /* The following tests are currently broken with the Direct VFD */ - if (strcmp(env_h5_drvr, "direct") != 0) { - test_select_hyper_and_2d(); /* Test hyperslab intersection (AND) code for 2-D dataset */ - test_select_hyper_xor_2d(); /* Test hyperslab XOR code for 2-D dataset */ - test_select_hyper_notb_2d(); /* Test hyperslab NOTB code for 2-D dataset */ - test_select_hyper_nota_2d(); /* Test hyperslab NOTA code for 2-D dataset */ - } - - /* test the random hyperslab I/O with the default property list for reading */ - test_select_hyper_union_random_5d(H5P_DEFAULT); /* Test hyperslab union code for random 5-D hyperslabs */ - - /* test random hyperslab I/O with a small buffer for reads */ - test_select_hyper_union_random_5d(plist_id); /* Test hyperslab union code for random 5-D hyperslabs */ - - /* Create a dataset transfer property list */ - fapl = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl, FAIL, "H5Pcreate"); - - /* Get the default file access properties for caching */ - ret = H5Pget_cache(fapl, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0); - CHECK(ret, FAIL, "H5Pget_cache"); - - /* Increase the size of the raw data cache */ - rdcc_nbytes = 10 * 1024 * 1024; - - /* Set the file access properties for caching */ - ret = H5Pset_cache(fapl, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0); - CHECK(ret, FAIL, "H5Pset_cache"); - - /* Test reading in a large hyperslab with a chunked dataset */ - test_select_hyper_chunk(fapl, H5P_DEFAULT); - - /* Test reading in a large hyperslab with a chunked dataset a small amount at a time */ - test_select_hyper_chunk(fapl, plist_id); - - /* Close file access property list */ - ret = H5Pclose(fapl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(plist_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* More tests for checking validity of selections */ - test_select_valid(); - - /* Tests for combining "all" and "none" selections with hyperslabs */ - test_select_combine(); - - /* Test filling selections */ - /* (Also tests iterating through each selection */ - test_select_fill_all(); - test_select_fill_point(NULL); - test_select_fill_point(offset); - test_select_fill_hyper_simple(NULL); - test_select_fill_hyper_simple(offset); - test_select_fill_hyper_regular(NULL); - test_select_fill_hyper_regular(offset); - test_select_fill_hyper_irregular(NULL); - test_select_fill_hyper_irregular(offset); - - /* Test 0-sized selections */ - test_select_none(); - - /* Test selections on scalar dataspaces */ - test_scalar_select(); - test_scalar_select2(); - test_scalar_select3(); - - /* Test "same shape" routine */ - test_shape_same(); - - /* Test "same shape" routine for selections of different rank */ - test_shape_same_dr(); - - /* Test "re-build" routine */ - test_space_rebuild(); - - /* Test "update diminfo" routine */ - test_space_update_diminfo(); - - /* Test point selections in chunked datasets */ - test_select_point_chunk(); - - /* Test scalar dataspaces in chunked datasets */ - test_select_scalar_chunk(); -#if 0 - /* Test using selection offset on hyperslab in chunked dataset */ - test_select_hyper_chunk_offset(); - test_select_hyper_chunk_offset2(); -#else - printf("** SKIPPED a test due to assertion in HDF5\n"); -#endif - - /* Test selection bounds with & without offsets */ - test_select_bounds(); - - /* Test 'regular' hyperslab query routines */ - test_hyper_regular(); - - /* Test unlimited hyperslab selections */ - test_hyper_unlim(); - - /* Test the consistency of internal data structures of selection */ - test_internal_consistency(); - - /* Test irregular selection I/O */ - test_irreg_io(); - - /* Test selection iterators */ - test_sel_iter(); - - /* Test selection intersection with block */ - test_select_intersect_block(); - - /* Test reading of 1-d disjoint file space to 1-d single block memory space */ - test_hyper_io_1d(); - - /* Test H5Sset_extent_none() functionality after we updated it to set - * the class to H5S_NULL instead of H5S_NO_CLASS. - */ - test_h5s_set_extent_none(); - -} /* test_select() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_select - * - * Purpose: Cleanup temporary test files - * - * Return: none - * - *------------------------------------------------------------------------- - */ -void -cleanup_select(void) -{ - H5Fdelete(FILENAME, H5P_DEFAULT); -} diff --git a/test/API/ttime.c b/test/API/ttime.c deleted file mode 100644 index a4a5ccb..0000000 --- a/test/API/ttime.c +++ /dev/null @@ -1,225 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: ttime - * - * Test the Time Datatype functionality - * - *************************************************************/ - -#include "testhdf5.h" - -#define DATAFILE "ttime.h5" -#ifdef NOT_YET -#define DATASETNAME "Dataset" -#endif /* NOT_YET */ - -/**************************************************************** -** -** test_time_commit(): Test committing time datatypes to a file -** -****************************************************************/ -static void -test_time_commit(void) -{ - hid_t file_id, tid; /* identifiers */ - herr_t status; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Committing Time Datatypes\n")); - - /* Create a new file using default properties. */ - file_id = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fcreate"); - - tid = H5Tcopy(H5T_UNIX_D32LE); - CHECK(tid, FAIL, "H5Tcopy"); - status = H5Tcommit2(file_id, "Committed D32LE type", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(status, FAIL, "H5Tcommit2"); - status = H5Tclose(tid); - CHECK(status, FAIL, "H5Tclose"); - - tid = H5Tcopy(H5T_UNIX_D32BE); - CHECK(tid, FAIL, "H5Tcopy"); - status = H5Tcommit2(file_id, "Committed D32BE type", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(status, FAIL, "H5Tcommit2"); - status = H5Tclose(tid); - CHECK(status, FAIL, "H5Tclose"); - - tid = H5Tcopy(H5T_UNIX_D64LE); - CHECK(tid, FAIL, "H5Tcopy"); - status = H5Tcommit2(file_id, "Committed D64LE type", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(status, FAIL, "H5Tcommit2"); - status = H5Tclose(tid); - CHECK(status, FAIL, "H5Tclose"); - - tid = H5Tcopy(H5T_UNIX_D64BE); - CHECK(tid, FAIL, "H5Tcopy"); - status = H5Tcommit2(file_id, "Committed D64BE type", tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(status, FAIL, "H5Tcommit2"); - status = H5Tclose(tid); - CHECK(status, FAIL, "H5Tclose"); - - /* Close the file. */ - status = H5Fclose(file_id); - CHECK(status, FAIL, "H5Fclose"); - - file_id = H5Fopen(DATAFILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fopen"); - - tid = H5Topen2(file_id, "Committed D32LE type", H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - - if (!H5Tequal(tid, H5T_UNIX_D32LE)) - TestErrPrintf("H5T_UNIX_D32LE datatype not found\n"); - - status = H5Tclose(tid); - CHECK(status, FAIL, "H5Tclose"); - - tid = H5Topen2(file_id, "Committed D32BE type", H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - - if (!H5Tequal(tid, H5T_UNIX_D32BE)) - TestErrPrintf("H5T_UNIX_D32BE datatype not found\n"); - - status = H5Tclose(tid); - CHECK(status, FAIL, "H5Tclose"); - - tid = H5Topen2(file_id, "Committed D64LE type", H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - - if (!H5Tequal(tid, H5T_UNIX_D64LE)) - TestErrPrintf("H5T_UNIX_D64LE datatype not found"); - - status = H5Tclose(tid); - CHECK(status, FAIL, "H5Tclose"); - - tid = H5Topen2(file_id, "Committed D64BE type", H5P_DEFAULT); - CHECK(tid, FAIL, "H5Topen2"); - - if (!H5Tequal(tid, H5T_UNIX_D64BE)) - TestErrPrintf("H5T_UNIX_D64BE datatype not found"); - - status = H5Tclose(tid); - CHECK(status, FAIL, "H5Tclose"); - - status = H5Fclose(file_id); - CHECK(status, FAIL, "H5Fclose"); -} - -#ifdef NOT_YET -/**************************************************************** -** -** test_time_io(): Test writing time data to a dataset -** -****************************************************************/ -static void -test_time_io(void) -{ - hid_t fid; /* File identifier */ - hid_t dsid; /* Dataset identifier */ - hid_t tid; /* Datatype identifier */ - hid_t sid; /* Dataspace identifier */ - time_t timenow, timethen; /* Times */ - herr_t status; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Committing Time Datatypes\n")); - - /* Create a new file using default properties. */ - fid = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - /* Create a scalar dataspace */ - sid = H5Screate(H5S_SCALAR); - CHECK(sid, FAIL, "H5Screate"); - - /* Create a dataset with a time datatype */ - dsid = H5Dcreate2(fid, DATASETNAME, H5T_UNIX_D32LE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dsid, FAIL, "H5Dcreate2"); - - /* Initialize time data value */ - timenow = HDtime(NULL); - - /* Write time to dataset */ - status = H5Dwrite(dsid, H5T_UNIX_D32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &timenow); - CHECK(status, FAIL, "H5Dwrite"); - - /* Close objects */ - status = H5Dclose(dsid); - CHECK(status, FAIL, "H5Dclose"); - - status = H5Sclose(sid); - CHECK(status, FAIL, "H5Sclose"); - - status = H5Fclose(fid); - CHECK(status, FAIL, "H5Fclose"); - - /* Open file and dataset, read time back and print it in calendar format */ - fid = H5Fopen(DATAFILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - dsid = H5Dopen2(fid, DATASETNAME, H5P_DEFAULT); - CHECK(dsid, FAIL, "H5Dopen2"); - - tid = H5Dget_type(dsid); - CHECK(tid, FAIL, "H5Dget_type"); - if (H5Tget_class(tid) == H5T_TIME) - fprintf(stderr, "datatype class is H5T_TIME\n"); - status = H5Tclose(tid); - CHECK(status, FAIL, "H5Tclose"); - - status = H5Dread(dsid, H5T_UNIX_D32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, &timethen); - CHECK(status, FAIL, "H5Dread"); - fprintf(stderr, "time written was: %s\n", HDctime(&timethen)); - - status = H5Dclose(dsid); - CHECK(status, FAIL, "H5Dclose"); - - status = H5Fclose(fid); - CHECK(status, FAIL, "H5Fclose"); -} -#endif /* NOT_YET */ - -/**************************************************************** -** -** test_time(): Main time datatype testing routine. -** -****************************************************************/ -void -test_time(void) -{ - /* Output message about test being performed */ - MESSAGE(5, ("Testing Time Datatypes\n")); - - test_time_commit(); /* Test committing time datatypes to a file */ -#ifdef NOT_YET - test_time_io(); /* Test writing time data to a dataset */ -#endif /* NOT_YET */ - -} /* test_time() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_time - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_time(void) -{ - H5Fdelete(DATAFILE, H5P_DEFAULT); -} diff --git a/test/API/tunicode.c b/test/API/tunicode.c deleted file mode 100644 index 8b404f2..0000000 --- a/test/API/tunicode.c +++ /dev/null @@ -1,867 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* Unicode test */ -#include "testhdf5.h" - -#define NUM_CHARS 16 -#define MAX_STRING_LENGTH ((NUM_CHARS * 4) + 1) /* Max length in bytes */ -#define MAX_PATH_LENGTH (MAX_STRING_LENGTH + 20) /* Max length in bytes */ -#define MAX_CODE_POINT 0x200000 -#define FILENAME "unicode.h5" -/* A buffer to hold two copies of the UTF-8 string */ -#define LONG_BUF_SIZE (2 * MAX_STRING_LENGTH + 4) - -#define DSET1_NAME "fl_string_dataset" -#define DSET3_NAME "dataset3" -#define DSET4_NAME "dataset4" -#define VL_DSET1_NAME "vl_dset_1" -#define GROUP1_NAME "group1" -#define GROUP2_NAME "group2" -#define GROUP3_NAME "group3" -#define GROUP4_NAME "group4" - -#define RANK 1 -#define COMP_INT_VAL 7 -#define COMP_FLOAT_VAL (-42.0F) -#define COMP_DOUBLE_VAL 42.0 - -/* Test function prototypes */ -void test_fl_string(hid_t fid, const char *string); -void test_strpad(hid_t fid, const char *string); -void test_vl_string(hid_t fid, const char *string); -void test_objnames(hid_t fid, const char *string); -void test_attrname(hid_t fid, const char *string); -void test_compound(hid_t fid, const char *string); -void test_enum(hid_t fid, const char *string); -void test_opaque(hid_t fid, const char *string); - -/* Utility function prototypes */ -static hid_t mkstr(size_t len, H5T_str_t strpad); -unsigned int write_char(unsigned int c, char *test_string, unsigned int cur_pos); -void dump_string(const char *string); - -/* - * test_fl_string - * Tests that UTF-8 can be used for fixed-length string data. - * Writes the string to a dataset and reads it back again. - */ -void -test_fl_string(hid_t fid, const char *string) -{ - hid_t dtype_id, space_id, dset_id; - hsize_t dims = 1; - char read_buf[MAX_STRING_LENGTH]; - H5T_cset_t cset; - herr_t ret; - - /* Create the datatype, ensure that the character set behaves - * correctly (it should default to ASCII and can be set to UTF8) - */ - dtype_id = H5Tcopy(H5T_C_S1); - CHECK(dtype_id, FAIL, "H5Tcopy"); - ret = H5Tset_size(dtype_id, (size_t)MAX_STRING_LENGTH); - CHECK(ret, FAIL, "H5Tset_size"); - cset = H5Tget_cset(dtype_id); - VERIFY(cset, H5T_CSET_ASCII, "H5Tget_cset"); - ret = H5Tset_cset(dtype_id, H5T_CSET_UTF8); - CHECK(ret, FAIL, "H5Tset_cset"); - cset = H5Tget_cset(dtype_id); - VERIFY(cset, H5T_CSET_UTF8, "H5Tget_cset"); - - /* Create dataspace for a dataset */ - space_id = H5Screate_simple(RANK, &dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - - /* Create a dataset */ - dset_id = H5Dcreate2(fid, DSET1_NAME, dtype_id, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate2"); - - /* Write UTF-8 string to dataset */ - ret = H5Dwrite(dset_id, dtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, string); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read string back and make sure it is unchanged */ - ret = H5Dread(dset_id, dtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, read_buf); - CHECK(ret, FAIL, "H5Dread"); - - VERIFY(strcmp(string, read_buf), 0, "strcmp"); - - /* Close all */ - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Tclose(dtype_id); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); -} - -/* - * test_strpad - * Tests string padding for a UTF-8 string. - * Converts strings to shorter and then longer strings. - * Borrows heavily from dtypes.c, but is more complicated because - * the string is randomly generated. - */ -void -test_strpad(hid_t H5_ATTR_UNUSED fid, const char *string) -{ - /* buf is used to hold the data that H5Tconvert operates on. */ - char buf[LONG_BUF_SIZE]; - - /* cmpbuf holds the output that H5Tconvert should produce, - * to compare against the actual output. */ - char cmpbuf[LONG_BUF_SIZE]; - - /* new_string is a slightly modified version of the UTF-8 - * string to make the tests run more smoothly. */ - char new_string[MAX_STRING_LENGTH + 2]; - - size_t length; /* Length of new_string in bytes */ - size_t small_len; /* Size of the small datatype */ - size_t big_len; /* Size of the larger datatype */ - hid_t src_type, dst_type; - herr_t ret; - - /* The following tests are simpler if the UTF-8 string contains - * the right number of bytes (even or odd, depending on the test). - * We create a 'new_string' whose length is convenient by prepending - * an 'x' to 'string' when necessary. */ - length = strlen(string); - if (length % 2 != 1) { - strcpy(new_string, "x"); - strcat(new_string, string); - length++; - } - else { - strcpy(new_string, string); - } - - /* Convert a null-terminated string to a shorter and longer null - * terminated string. */ - - /* Create a src_type that holds the UTF-8 string and its final NULL */ - big_len = length + 1; /* +1 byte for final NULL */ - assert((2 * big_len) <= sizeof(cmpbuf)); - src_type = mkstr(big_len, H5T_STR_NULLTERM); - CHECK(src_type, FAIL, "mkstr"); - /* Create a dst_type that holds half of the UTF-8 string and a final - * NULL */ - small_len = (length + 1) / 2; - dst_type = mkstr(small_len, H5T_STR_NULLTERM); - CHECK(dst_type, FAIL, "mkstr"); - - /* Fill the buffer with two copies of the UTF-8 string, each with a - * terminating NULL. It will look like "abcdefg\0abcdefg\0". */ - strncpy(buf, new_string, big_len); - strncpy(&buf[big_len], new_string, big_len); - - ret = H5Tconvert(src_type, dst_type, (size_t)2, buf, NULL, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tconvert"); - - /* After conversion, the buffer should look like - * "abc\0abc\0abcdefg\0". Note that this is just what the bytes look - * like; UTF-8 characters may well have been truncated. - * To check that the conversion worked properly, we'll build this - * string manually. */ - strncpy(cmpbuf, new_string, small_len - 1); - cmpbuf[small_len - 1] = '\0'; - strncpy(&cmpbuf[small_len], new_string, small_len - 1); - cmpbuf[2 * small_len - 1] = '\0'; - strcpy(&cmpbuf[2 * small_len], new_string); - - VERIFY(memcmp(buf, cmpbuf, 2 * big_len), 0, "memcmp"); - - /* Now convert from smaller datatype to bigger datatype. This should - * leave our buffer looking like: "abc\0\0\0\0\0abc\0\0\0\0\0" */ - ret = H5Tconvert(dst_type, src_type, (size_t)2, buf, NULL, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tconvert"); - - /* First fill the buffer with NULLs */ - memset(cmpbuf, '\0', (size_t)LONG_BUF_SIZE); - /* Copy in the characters */ - strncpy(cmpbuf, new_string, small_len - 1); - strncpy(&cmpbuf[big_len], new_string, small_len - 1); - - VERIFY(memcmp(buf, cmpbuf, 2 * big_len), 0, "memcmp"); - - ret = H5Tclose(src_type); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(dst_type); - CHECK(ret, FAIL, "H5Tclose"); - - /* Now test null padding. Null-padded strings do *not* need - * terminating NULLs, so the sizes of the datatypes are slightly - * different and we want a string with an even number of characters. */ - length = strlen(string); - if (length % 2 != 0) { - strcpy(new_string, "x"); - strcat(new_string, string); - length++; - } - else { - strcpy(new_string, string); - } - - /* Create a src_type that holds the UTF-8 string */ - big_len = length; - assert((2 * big_len) <= sizeof(cmpbuf)); - src_type = mkstr(big_len, H5T_STR_NULLPAD); - CHECK(src_type, FAIL, "mkstr"); - /* Create a dst_type that holds half of the UTF-8 string */ - small_len = length / 2; - dst_type = mkstr(small_len, H5T_STR_NULLPAD); - CHECK(dst_type, FAIL, "mkstr"); - - /* Fill the buffer with two copies of the UTF-8 string. - * It will look like "abcdefghabcdefgh". */ - strncpy(buf, new_string, big_len); - strncpy(&buf[big_len], new_string, big_len); - - ret = H5Tconvert(src_type, dst_type, (size_t)2, buf, NULL, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tconvert"); - - /* After conversion, the buffer should look like - * "abcdabcdabcdefgh". Note that this is just what the bytes look - * like; UTF-8 characters may well have been truncated. - * To check that the conversion worked properly, we'll build this - * string manually. */ - strncpy(cmpbuf, new_string, small_len); - strncpy(&cmpbuf[small_len], new_string, small_len); - strncpy(&cmpbuf[2 * small_len], new_string, big_len); - - VERIFY(memcmp(buf, cmpbuf, 2 * big_len), 0, "memcmp"); - - /* Now convert from smaller datatype to bigger datatype. This should - * leave our buffer looking like: "abcd\0\0\0\0abcd\0\0\0\0" */ - ret = H5Tconvert(dst_type, src_type, (size_t)2, buf, NULL, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tconvert"); - - /* First fill the buffer with NULLs */ - memset(cmpbuf, '\0', (size_t)LONG_BUF_SIZE); - /* Copy in the characters */ - strncpy(cmpbuf, new_string, small_len); - strncpy(&cmpbuf[big_len], new_string, small_len); - - VERIFY(memcmp(buf, cmpbuf, 2 * big_len), 0, "memcmp"); - - ret = H5Tclose(src_type); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(dst_type); - CHECK(ret, FAIL, "H5Tclose"); - - /* Test space padding. This is very similar to null-padding; we can - use the same values of length, small_len, and big_len. */ - - src_type = mkstr(big_len, H5T_STR_SPACEPAD); - CHECK(src_type, FAIL, "mkstr"); - dst_type = mkstr(small_len, H5T_STR_SPACEPAD); - CHECK(src_type, FAIL, "mkstr"); - - /* Fill the buffer with two copies of the UTF-8 string. - * It will look like "abcdefghabcdefgh". */ - strcpy(buf, new_string); - strcpy(&buf[big_len], new_string); - - ret = H5Tconvert(src_type, dst_type, (size_t)2, buf, NULL, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tconvert"); - - /* After conversion, the buffer should look like - * "abcdabcdabcdefgh". Note that this is just what the bytes look - * like; UTF-8 characters may have been truncated. - * To check that the conversion worked properly, we'll build this - * string manually. */ - strncpy(cmpbuf, new_string, small_len); - strncpy(&cmpbuf[small_len], new_string, small_len); - strncpy(&cmpbuf[2 * small_len], new_string, big_len); - - VERIFY(memcmp(buf, cmpbuf, 2 * big_len), 0, "memcmp"); - - /* Now convert from smaller datatype to bigger datatype. This should - * leave our buffer looking like: "abcd abcd " */ - ret = H5Tconvert(dst_type, src_type, (size_t)2, buf, NULL, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tconvert"); - - /* First fill the buffer with spaces */ - memset(cmpbuf, ' ', (size_t)LONG_BUF_SIZE); - /* Copy in the characters */ - strncpy(cmpbuf, new_string, small_len); - strncpy(&cmpbuf[big_len], new_string, small_len); - - VERIFY(memcmp(buf, cmpbuf, 2 * big_len), 0, "memcmp"); - - ret = H5Tclose(src_type); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(dst_type); - CHECK(ret, FAIL, "H5Tclose"); -} - -/* - * test_vl_string - * Tests variable-length string datatype with UTF-8 strings. - */ -void -test_vl_string(hid_t fid, const char *string) -{ - hid_t type_id, space_id, dset_id; - hsize_t dims = 1; - hsize_t size; /* Number of bytes used */ - char *read_buf[1]; - herr_t ret; - - /* Create dataspace for datasets */ - space_id = H5Screate_simple(RANK, &dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - type_id = H5Tcopy(H5T_C_S1); - CHECK(type_id, FAIL, "H5Tcopy"); - ret = H5Tset_size(type_id, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Create a dataset */ - dset_id = H5Dcreate2(fid, VL_DSET1_NAME, type_id, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dset_id, type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, &string); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dset_id, type_id, space_id, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - VERIFY(size, (hsize_t)strlen(string) + 1, "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dset_id, type_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, read_buf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - VERIFY(strcmp(string, read_buf[0]), 0, "strcmp"); - - /* Reclaim the read VL data */ - ret = H5Treclaim(type_id, space_id, H5P_DEFAULT, read_buf); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close all */ - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Tclose(type_id); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); -} - -/* - * test_objnames - * Tests that UTF-8 can be used for object names in the file. - * Tests groups, datasets, named datatypes, and soft links. - * Note that this test doesn't actually mark the names as being - * in UTF-8. At the time this test was written, that feature - * didn't exist in HDF5, and when the character encoding property - * was added to links it didn't change how they were stored in the file, - * -JML 2/2/2006 - */ -void -test_objnames(hid_t fid, const char *string) -{ - hid_t grp_id, grp1_id, grp2_id, grp3_id; - hid_t type_id, dset_id, space_id; -#if 0 - char read_buf[MAX_STRING_LENGTH]; -#endif - char path_buf[MAX_PATH_LENGTH]; - hsize_t dims = 1; -#if 0 - hobj_ref_t obj_ref; - ssize_t size; -#endif - herr_t ret; - - /* Create a group with a UTF-8 name */ - grp_id = H5Gcreate2(fid, string, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp_id, FAIL, "H5Gcreate2"); -#if 0 - /* Set a comment on the group to test that we can access the group - * Also test that UTF-8 comments can be read. - */ - ret = H5Oset_comment_by_name(fid, string, string, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oset_comment_by_name"); - size = H5Oget_comment_by_name(fid, string, read_buf, (size_t)MAX_STRING_LENGTH, H5P_DEFAULT); - CHECK(size, FAIL, "H5Oget_comment_by_name"); -#endif - ret = H5Gclose(grp_id); - CHECK(ret, FAIL, "H5Gclose"); -#if 0 - VERIFY(strcmp(string, read_buf), 0, "strcmp"); -#endif - /* Create a new dataset with a UTF-8 name */ - grp1_id = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp1_id, FAIL, "H5Gcreate2"); - - space_id = H5Screate_simple(RANK, &dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - dset_id = H5Dcreate2(grp1_id, string, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate2"); - - /* Make sure that dataset can be opened again */ - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - - dset_id = H5Dopen2(grp1_id, string, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Dopen2"); - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Gclose(grp1_id); - CHECK(ret, FAIL, "H5Gclose"); - - /* Do the same for a named datatype */ - grp2_id = H5Gcreate2(fid, GROUP2_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp2_id, FAIL, "H5Gcreate2"); - - type_id = H5Tcreate(H5T_OPAQUE, (size_t)1); - CHECK(type_id, FAIL, "H5Tcreate"); - ret = H5Tcommit2(grp2_id, string, type_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(type_id, FAIL, "H5Tcommit2"); - ret = H5Tclose(type_id); - CHECK(type_id, FAIL, "H5Tclose"); - - type_id = H5Topen2(grp2_id, string, H5P_DEFAULT); - CHECK(type_id, FAIL, "H5Topen2"); - ret = H5Tclose(type_id); - CHECK(type_id, FAIL, "H5Tclose"); - - /* Don't close the group -- use it to test that object references - * can refer to objects named in UTF-8 */ -#if 0 - space_id = H5Screate_simple(RANK, &dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - dset_id = - H5Dcreate2(grp2_id, DSET3_NAME, H5T_STD_REF_OBJ, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Dcreate2"); - - /* Create reference to named datatype */ - ret = H5Rcreate(&obj_ref, grp2_id, string, H5R_OBJECT, (hid_t)-1); - CHECK(ret, FAIL, "H5Rcreate"); - /* Write selection and read it back*/ - ret = H5Dwrite(dset_id, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &obj_ref); - CHECK(ret, FAIL, "H5Dwrite"); - ret = H5Dread(dset_id, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &obj_ref); - CHECK(ret, FAIL, "H5Dread"); - - /* Ensure that we can open named datatype using object reference */ - type_id = H5Rdereference2(dset_id, H5P_DEFAULT, H5R_OBJECT, &obj_ref); - CHECK(type_id, FAIL, "H5Rdereference2"); - ret = H5Tcommitted(type_id); - VERIFY(ret, 1, "H5Tcommitted"); - - ret = H5Tclose(type_id); - CHECK(type_id, FAIL, "H5Tclose"); - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); -#endif - ret = H5Gclose(grp2_id); - CHECK(ret, FAIL, "H5Gclose"); - - /* Create "group3". Build a hard link from group3 to group2, which has - * a datatype with the UTF-8 name. Create a soft link in group3 - * pointing through the hard link to the datatype. Give the soft - * link a name in UTF-8. Ensure that the soft link works. */ - - grp3_id = H5Gcreate2(fid, GROUP3_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(grp3_id, FAIL, "H5Gcreate2"); - - ret = H5Lcreate_hard(fid, GROUP2_NAME, grp3_id, GROUP2_NAME, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_hard"); - strcpy(path_buf, GROUP2_NAME); - strcat(path_buf, "/"); - strcat(path_buf, string); - ret = H5Lcreate_hard(grp3_id, path_buf, H5L_SAME_LOC, string, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Lcreate_hard"); - - /* Open named datatype using soft link */ - type_id = H5Topen2(grp3_id, string, H5P_DEFAULT); - CHECK(type_id, FAIL, "H5Topen2"); - - ret = H5Tclose(type_id); - CHECK(type_id, FAIL, "H5Tclose"); - ret = H5Gclose(grp3_id); - CHECK(ret, FAIL, "H5Gclose"); -} - -/* - * test_attrname - * Test that attributes can deal with UTF-8 strings - */ -void -test_attrname(hid_t fid, const char *string) -{ - hid_t group_id, attr_id; - hid_t dtype_id, space_id; - hsize_t dims = 1; - char read_buf[MAX_STRING_LENGTH]; - ssize_t size; - herr_t ret; - - /* Create a new group and give it an attribute whose - * name and value are UTF-8 strings. - */ - group_id = H5Gcreate2(fid, GROUP4_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(group_id, FAIL, "H5Gcreate2"); - - space_id = H5Screate_simple(RANK, &dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - dtype_id = H5Tcopy(H5T_C_S1); - CHECK(dtype_id, FAIL, "H5Tcopy"); - ret = H5Tset_size(dtype_id, (size_t)MAX_STRING_LENGTH); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Create the attribute and check that its name is correct */ - attr_id = H5Acreate2(group_id, string, dtype_id, space_id, H5P_DEFAULT, H5P_DEFAULT); - CHECK(attr_id, FAIL, "H5Acreate2"); - size = H5Aget_name(attr_id, (size_t)MAX_STRING_LENGTH, read_buf); - CHECK(size, FAIL, "H5Aget_name"); - ret = strcmp(read_buf, string); - VERIFY(ret, 0, "strcmp"); - read_buf[0] = '\0'; - - /* Try writing and reading from the attribute */ - ret = H5Awrite(attr_id, dtype_id, string); - CHECK(ret, FAIL, "H5Awrite"); - ret = H5Aread(attr_id, dtype_id, read_buf); - CHECK(ret, FAIL, "H5Aread"); - ret = strcmp(read_buf, string); - VERIFY(ret, 0, "strcmp"); - - /* Clean up */ - ret = H5Aclose(attr_id); - CHECK(ret, FAIL, "H5Aclose"); - ret = H5Tclose(dtype_id); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Gclose(group_id); - CHECK(ret, FAIL, "H5Gclose"); -} - -/* - * test_compound - * Test that compound datatypes can have UTF-8 field names. - */ -void -test_compound(hid_t fid, const char *string) -{ - /* Define two compound structures, s1_t and s2_t. - * s2_t is a subset of s1_t, with two out of three - * fields. - * This is stolen from the h5_compound example. - */ - typedef struct s1_t { - int a; - double c; - float b; - } s1_t; - typedef struct s2_t { - double c; - int a; - } s2_t; - /* Actual variable declarations */ - s1_t s1; - s2_t s2; - hid_t s1_tid, s2_tid; - hid_t space_id, dset_id; - hsize_t dim = 1; - char *readbuf; - herr_t ret; - - /* Initialize compound data */ - memset(&s1, 0, sizeof(s1_t)); /* To make purify happy */ - s1.a = COMP_INT_VAL; - s1.c = COMP_DOUBLE_VAL; - s1.b = COMP_FLOAT_VAL; - - /* Create compound datatypes using UTF-8 field name */ - s1_tid = H5Tcreate(H5T_COMPOUND, sizeof(s1_t)); - CHECK(s1_tid, FAIL, "H5Tcreate"); - ret = H5Tinsert(s1_tid, string, HOFFSET(s1_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Check that the field name was stored correctly */ - readbuf = H5Tget_member_name(s1_tid, 0); - ret = strcmp(readbuf, string); - VERIFY(ret, 0, "strcmp"); - H5free_memory(readbuf); - - /* Add the other fields to the datatype */ - ret = H5Tinsert(s1_tid, "c_name", HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE); - CHECK(ret, FAIL, "H5Tinsert"); - ret = H5Tinsert(s1_tid, "b_name", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create second datatype, with only two fields. */ - s2_tid = H5Tcreate(H5T_COMPOUND, sizeof(s2_t)); - CHECK(s2_tid, FAIL, "H5Tcreate"); - ret = H5Tinsert(s2_tid, "c_name", HOFFSET(s2_t, c), H5T_NATIVE_DOUBLE); - CHECK(ret, FAIL, "H5Tinsert"); - ret = H5Tinsert(s2_tid, string, HOFFSET(s2_t, a), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create the dataspace and dataset. */ - space_id = H5Screate_simple(1, &dim, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - dset_id = H5Dcreate2(fid, DSET4_NAME, s1_tid, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate2"); - - /* Write data to the dataset. */ - ret = H5Dwrite(dset_id, s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &s1); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Ensure that data can be read back by field name into s2 struct */ - ret = H5Dread(dset_id, s2_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, &s2); - CHECK(ret, FAIL, "H5Dread"); - - VERIFY(s2.a, COMP_INT_VAL, "H5Dread"); - VERIFY(s2.c, COMP_DOUBLE_VAL, "H5Dread"); - - /* Clean up */ - ret = H5Tclose(s1_tid); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Tclose(s2_tid); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); -} - -/* - * test_enum - * Test that enumerated datatypes can have UTF-8 member names. - */ -void -test_enum(hid_t H5_ATTR_UNUSED fid, const char *string) -{ - /* Define an enumerated type */ - typedef enum { E1_RED, E1_GREEN, E1_BLUE, E1_WHITE } c_e1; - /* Variable declarations */ - c_e1 val; - herr_t ret; - hid_t type_id; - char readbuf[MAX_STRING_LENGTH]; - - /* Create an enumerated datatype in HDF5 with a UTF-8 member name*/ - type_id = H5Tcreate(H5T_ENUM, sizeof(c_e1)); - CHECK(type_id, FAIL, "H5Tcreate"); - val = E1_RED; - ret = H5Tenum_insert(type_id, "RED", &val); - CHECK(ret, FAIL, "H5Tenum_insert"); - val = E1_GREEN; - ret = H5Tenum_insert(type_id, "GREEN", &val); - CHECK(ret, FAIL, "H5Tenum_insert"); - val = E1_BLUE; - ret = H5Tenum_insert(type_id, "BLUE", &val); - CHECK(ret, FAIL, "H5Tenum_insert"); - val = E1_WHITE; - ret = H5Tenum_insert(type_id, string, &val); - CHECK(ret, FAIL, "H5Tenum_insert"); - - /* Ensure that UTF-8 member name gives the right value and vice versa. */ - ret = H5Tenum_valueof(type_id, string, &val); - CHECK(ret, FAIL, "H5Tenum_valueof"); - VERIFY(val, E1_WHITE, "H5Tenum_valueof"); - ret = H5Tenum_nameof(type_id, &val, readbuf, (size_t)MAX_STRING_LENGTH); - CHECK(ret, FAIL, "H5Tenum_nameof"); - ret = strcmp(readbuf, string); - VERIFY(ret, 0, "strcmp"); - - /* Close the datatype */ - ret = H5Tclose(type_id); - CHECK(ret, FAIL, "H5Tclose"); -} - -/* - * test_opaque - * Test comments on opaque datatypes - */ -void -test_opaque(hid_t H5_ATTR_UNUSED fid, const char *string) -{ - hid_t type_id; - char *read_buf; - herr_t ret; - - /* Create an opaque type and give it a UTF-8 tag */ - type_id = H5Tcreate(H5T_OPAQUE, (size_t)4); - CHECK(type_id, FAIL, "H5Tcreate"); - ret = H5Tset_tag(type_id, string); - CHECK(ret, FAIL, "H5Tset_tag"); - - /* Read the tag back. */ - read_buf = H5Tget_tag(type_id); - ret = strcmp(read_buf, string); - VERIFY(ret, 0, "H5Tget_tag"); - H5free_memory(read_buf); - - ret = H5Tclose(type_id); - CHECK(ret, FAIL, "H5Tclose"); -} - -/*********************/ -/* Utility functions */ -/*********************/ - -/* mkstr - * Borrwed from dtypes.c. - * Creates a new string data type. Used in string padding tests */ -static hid_t -mkstr(size_t len, H5T_str_t strpad) -{ - hid_t t; - if ((t = H5Tcopy(H5T_C_S1)) < 0) - return -1; - if (H5Tset_size(t, len) < 0) - return -1; - if (H5Tset_strpad(t, strpad) < 0) - return -1; - return t; -} - -/* write_char - * Append a unicode code point c to test_string in UTF-8 encoding. - * Return the new end of the string. - */ -unsigned int -write_char(unsigned int c, char *test_string, unsigned int cur_pos) -{ - if (c < 0x80) { - test_string[cur_pos] = (char)c; - cur_pos++; - } - else if (c < 0x800) { - test_string[cur_pos] = (char)(0xC0 | c >> 6); - test_string[cur_pos + 1] = (char)(0x80 | (c & 0x3F)); - cur_pos += 2; - } - else if (c < 0x10000) { - test_string[cur_pos] = (char)(0xE0 | c >> 12); - test_string[cur_pos + 1] = (char)(0x80 | (c >> 6 & 0x3F)); - test_string[cur_pos + 2] = (char)(0x80 | (c & 0x3F)); - cur_pos += 3; - } - else if (c < 0x200000) { - test_string[cur_pos] = (char)(0xF0 | c >> 18); - test_string[cur_pos + 1] = (char)(0x80 | (c >> 12 & 0x3F)); - test_string[cur_pos + 2] = (char)(0x80 | (c >> 6 & 0x3F)); - test_string[cur_pos + 3] = (char)(0x80 | (c & 0x3F)); - cur_pos += 4; - } - - return cur_pos; -} - -/* dump_string - * Print a string both as text (which will look like garbage) and as hex. - * The text display is not guaranteed to be accurate--certain characters - * could confuse printf (e.g., '\n'). */ -void -dump_string(const char *string) -{ - size_t length; - size_t x; - - printf("The string was:\n %s", string); - printf("Or in hex:\n"); - - length = strlen(string); - - for (x = 0; x < length; x++) - printf("%x ", string[x] & (0x000000FF)); - - printf("\n"); -} - -/* Main test. - * Create a string of random Unicode characters, then run each test with - * that string. - */ -void -test_unicode(void) -{ - char test_string[MAX_STRING_LENGTH]; - unsigned int cur_pos = 0; /* Current position in test_string */ - unsigned int unicode_point; /* Unicode code point for a single character */ - hid_t fid; /* ID of file */ - int x; /* Temporary variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing UTF-8 Encoding\n")); - - /* Create a random string with length NUM_CHARS */ - HDsrandom((unsigned)HDtime(NULL)); - - memset(test_string, 0, sizeof(test_string)); - for (x = 0; x < NUM_CHARS; x++) { - /* We need to avoid unprintable characters (codes 0-31) and the - * . and / characters, since they aren't allowed in path names. - */ - unicode_point = (unsigned)(HDrandom() % (MAX_CODE_POINT - 32)) + 32; - if (unicode_point != 46 && unicode_point != 47) - cur_pos = write_char(unicode_point, test_string, cur_pos); - } - - /* Avoid unlikely case of the null string */ - if (cur_pos == 0) { - test_string[cur_pos] = 'Q'; - cur_pos++; - } - test_string[cur_pos] = '\0'; - - /* Create file */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - - test_fl_string(fid, test_string); - test_strpad(fid, "abcdefgh"); - test_strpad(fid, test_string); - test_vl_string(fid, test_string); - test_objnames(fid, test_string); - test_attrname(fid, test_string); - test_compound(fid, test_string); - test_enum(fid, test_string); - test_opaque(fid, test_string); - - /* Close file */ - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - /* This function could be useful in debugging if certain strings - * create errors. - */ -#ifdef DEBUG - dump_string(test_string); -#endif /* DEBUG */ -} - -/* cleanup_unicode(void) - * Delete the file this test created. - */ -void -cleanup_unicode(void) -{ - H5Fdelete(FILENAME, H5P_DEFAULT); -} diff --git a/test/API/tvlstr.c b/test/API/tvlstr.c deleted file mode 100644 index a9375c8..0000000 --- a/test/API/tvlstr.c +++ /dev/null @@ -1,1004 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tvlstr - * - * Test the Variable-Length String functionality - * - *************************************************************/ - -#include "testhdf5.h" - -#define DATAFILE "tvlstr.h5" -#define DATAFILE2 "tvlstr2.h5" -#define DATAFILE3 "sel2el.h5" - -#define DATASET "1Darray" - -/* 1-D dataset with fixed dimensions */ -#define SPACE1_RANK 1 -#define SPACE1_DIM1 4 -#define NUMP 4 - -#define VLSTR_TYPE "vl_string_type" - -/* Definitions for the VL re-writing test */ -#define REWRITE_NDATASETS 32 - -/* String for testing attributes */ -static const char *string_att = "This is the string for the attribute"; -static char *string_att_write = NULL; - -void *test_vlstr_alloc_custom(size_t size, void *info); -void test_vlstr_free_custom(void *mem, void *info); - -/**************************************************************** -** -** test_vlstr_alloc_custom(): Test VL datatype custom memory -** allocation routines. This routine just uses malloc to -** allocate the memory and increments the amount of memory -** allocated. -** -****************************************************************/ -void * -test_vlstr_alloc_custom(size_t size, void *info) -{ - void *ret_value = NULL; /* Pointer to return */ - size_t *mem_used = (size_t *)info; /* Get the pointer to the memory used */ - size_t extra; /* Extra space needed */ - - /* - * This weird contortion is required on the DEC Alpha to keep the - * alignment correct - QAK - */ - extra = MAX(sizeof(void *), sizeof(size_t)); - - if ((ret_value = malloc(extra + size)) != NULL) { - *(size_t *)ret_value = size; - *mem_used += size; - } /* end if */ - ret_value = ((unsigned char *)ret_value) + extra; - return (ret_value); -} - -/**************************************************************** -** -** test_vlstr_free_custom(): Test VL datatype custom memory -** allocation routines. This routine just uses free to -** release the memory and decrements the amount of memory -** allocated. -** -****************************************************************/ -void -test_vlstr_free_custom(void *_mem, void *info) -{ - unsigned char *mem; - size_t *mem_used = (size_t *)info; /* Get the pointer to the memory used */ - size_t extra; /* Extra space needed */ - - /* - * This weird contortion is required on the DEC Alpha to keep the - * alignment correct - QAK - */ - extra = MAX(sizeof(void *), sizeof(size_t)); - - if (_mem != NULL) { - mem = ((unsigned char *)_mem) - extra; - *mem_used -= *(size_t *)((void *)mem); - free(mem); - } /* end if */ -} - -/**************************************************************** -** -** test_vlstrings_basic(): Test basic VL string code. -** Tests simple VL string I/O -** -****************************************************************/ -static void -test_vlstrings_basic(void) -{ - /* Information to write */ - const char *wdata[SPACE1_DIM1] = { - "Four score and seven years ago our forefathers brought forth on this continent a new nation,", - "conceived in liberty and dedicated to the proposition that all men are created equal.", - "Now we are engaged in a great civil war,", - "testing whether that nation or any nation so conceived and so dedicated can long endure."}; - - char *rdata[SPACE1_DIM1]; /* Information read in */ - char *wdata2; - hid_t dataspace, dataset2; - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t dims1[] = {SPACE1_DIM1}; - hsize_t size; /* Number of bytes which will be used */ - unsigned i; /* counting variable */ - size_t str_used; /* String data in memory */ - size_t mem_used = 0; /* Memory used during allocation */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic VL String Functionality\n")); - - /* Create file */ - fid1 = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - tid1 = H5Tcopy(H5T_C_S1); - CHECK(tid1, FAIL, "H5Tcopy"); - - ret = H5Tset_size(tid1, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - dataspace = H5Screate(H5S_SCALAR); - - dataset2 = H5Dcreate2(fid1, "Dataset2", tid1, dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - wdata2 = (char *)calloc((size_t)65534, sizeof(char)); - memset(wdata2, 'A', (size_t)65533); - - ret = H5Dwrite(dataset2, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, &wdata2); - CHECK(ret, FAIL, "H5Dwrite"); - - H5Sclose(dataspace); - H5Dclose(dataset2); - free(wdata2); - - /* Change to the custom memory allocation routines for reading VL string */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vlstr_alloc_custom, &mem_used, test_vlstr_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dataset, tid1, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* Count the actual number of bytes used by the strings */ - for (i = 0, str_used = 0; i < SPACE1_DIM1; i++) - str_used += strlen(wdata[i]) + 1; - - /* Compare against the strings actually written */ - VERIFY(size, (hsize_t)str_used, "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - VERIFY(mem_used, str_used, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (strlen(wdata[i]) != strlen(rdata[i])) { - TestErrPrintf("VL data length don't match!, strlen(wdata[%d])=%d, strlen(rdata[%d])=%d\n", (int)i, - (int)strlen(wdata[i]), (int)i, (int)strlen(rdata[i])); - continue; - } /* end if */ - if (strcmp(wdata[i], rdata[i]) != 0) { - TestErrPrintf("VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n", (int)i, wdata[i], - (int)i, rdata[i]); - continue; - } /* end if */ - } /* end for */ - - /* Reclaim the read VL data */ - ret = H5Treclaim(tid1, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_vlstrings_basic() */ - -/**************************************************************** -** -** test_vlstrings_special(): Test VL string code for special -** string cases, nil and zero-sized. -** -****************************************************************/ -static void -test_vlstrings_special(void) -{ - const char *wdata[SPACE1_DIM1] = {"", "two", "three", "\0"}; - const char *wdata2[SPACE1_DIM1] = {NULL, NULL, NULL, NULL}; - char *rdata[SPACE1_DIM1]; /* Information read in */ - char *fill; /* Fill value */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - hid_t dcpl; /* Dataset creation property list ID */ - hsize_t dims1[] = {SPACE1_DIM1}; - unsigned i; /* counting variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Special VL Strings\n")); - - /* Create file */ - fid1 = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - tid1 = H5Tcopy(H5T_C_S1); - CHECK(tid1, FAIL, "H5Tcopy"); - - ret = H5Tset_size(tid1, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset3", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Read from dataset before writing data */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - if (rdata[i] != NULL) - TestErrPrintf("VL doesn't match!, rdata[%d]=%s\n", (int)i, rdata[i]); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (strlen(wdata[i]) != strlen(rdata[i])) { - TestErrPrintf("VL data length don't match!, strlen(wdata[%d])=%d, strlen(rdata[%d])=%d\n", (int)i, - (int)strlen(wdata[i]), (int)i, (int)strlen(rdata[i])); - continue; - } /* end if */ - if ((wdata[i] == NULL && rdata[i] != NULL) || (rdata[i] == NULL && wdata[i] != NULL)) { - TestErrPrintf("VL data values don't match!\n"); - continue; - } /* end if */ - if (strcmp(wdata[i], rdata[i]) != 0) { - TestErrPrintf("VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n", (int)i, wdata[i], - (int)i, rdata[i]); - continue; - } /* end if */ - } /* end for */ - - /* Reclaim the read VL data */ - ret = H5Treclaim(tid1, sid1, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create another dataset to test nil strings */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Set the fill value for the second dataset */ - fill = NULL; - ret = H5Pset_fill_value(dcpl, tid1, &fill); - CHECK(ret, FAIL, "H5Pset_fill_value"); - - dataset = H5Dcreate2(fid1, "Dataset4", tid1, sid1, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Read from dataset before writing data */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - if (rdata[i] != NULL) - TestErrPrintf("VL doesn't match!, rdata[%d]=%s\n", (int)i, rdata[i]); - - /* Try to write nil strings to disk. */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata2); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read nil strings back from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - if (rdata[i] != NULL) - TestErrPrintf("VL doesn't match!, rdata[%d]=%s\n", (int)i, rdata[i]); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} - -/**************************************************************** -** -** test_vlstring_type(): Test VL string type. -** Tests if VL string is treated as string. -** -****************************************************************/ -static void -test_vlstring_type(void) -{ - hid_t fid; /* HDF5 File IDs */ - hid_t tid_vlstr; - H5T_cset_t cset; - H5T_str_t pad; - htri_t vl_str; /* Whether string is VL */ - herr_t ret; - - /* Output message about test being performed */ - MESSAGE(5, ("Testing VL String type\n")); - - /* Open file */ - fid = H5Fopen(DATAFILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Create a datatype to refer to */ - tid_vlstr = H5Tcopy(H5T_C_S1); - CHECK(tid_vlstr, FAIL, "H5Tcopy"); - - /* Change padding and verify it */ - ret = H5Tset_strpad(tid_vlstr, H5T_STR_NULLPAD); - CHECK(ret, FAIL, "H5Tset_strpad"); - pad = H5Tget_strpad(tid_vlstr); - VERIFY(pad, H5T_STR_NULLPAD, "H5Tget_strpad"); - - /* Convert to variable-length string */ - ret = H5Tset_size(tid_vlstr, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Check if datatype is VL string */ - ret = H5Tget_class(tid_vlstr); - VERIFY(ret, H5T_STRING, "H5Tget_class"); - ret = H5Tis_variable_str(tid_vlstr); - VERIFY(ret, true, "H5Tis_variable_str"); - - /* Verify that the class detects as a string */ - vl_str = H5Tdetect_class(tid_vlstr, H5T_STRING); - CHECK(vl_str, FAIL, "H5Tdetect_class"); - VERIFY(vl_str, true, "H5Tdetect_class"); - - /* Check default character set and padding */ - cset = H5Tget_cset(tid_vlstr); - VERIFY(cset, H5T_CSET_ASCII, "H5Tget_cset"); - pad = H5Tget_strpad(tid_vlstr); - VERIFY(pad, H5T_STR_NULLPAD, "H5Tget_strpad"); - - /* Commit variable-length string datatype to storage */ - ret = H5Tcommit2(fid, VLSTR_TYPE, tid_vlstr, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Tcommit2"); - - /* Close datatype */ - ret = H5Tclose(tid_vlstr); - CHECK(ret, FAIL, "H5Tclose"); - - tid_vlstr = H5Topen2(fid, VLSTR_TYPE, H5P_DEFAULT); - CHECK(tid_vlstr, FAIL, "H5Topen2"); - - ret = H5Tclose(tid_vlstr); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - - fid = H5Fopen(DATAFILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fopen"); - - /* Open the variable-length string datatype just created */ - tid_vlstr = H5Topen2(fid, VLSTR_TYPE, H5P_DEFAULT); - CHECK(tid_vlstr, FAIL, "H5Topen2"); - - /* Verify character set and padding */ - cset = H5Tget_cset(tid_vlstr); - VERIFY(cset, H5T_CSET_ASCII, "H5Tget_cset"); - pad = H5Tget_strpad(tid_vlstr); - VERIFY(pad, H5T_STR_NULLPAD, "H5Tget_strpad"); - - /* Close datatype and file */ - ret = H5Tclose(tid_vlstr); - CHECK(ret, FAIL, "H5Tclose"); - ret = H5Fclose(fid); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_vlstring_type() */ - -/**************************************************************** -** -** test_compact_vlstring(): Test code for storing VL strings in -** compact datasets. -** -****************************************************************/ -static void -test_compact_vlstring(void) -{ - const char *wdata[SPACE1_DIM1] = {"one", "two", "three", "four"}; - char *rdata[SPACE1_DIM1]; /* Information read in */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - hid_t plist; /* Dataset creation property list */ - hsize_t dims1[] = {SPACE1_DIM1}; - unsigned i; /* counting variable */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing VL Strings in compact dataset\n")); - - /* Create file */ - fid1 = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - tid1 = H5Tcopy(H5T_C_S1); - CHECK(tid1, FAIL, "H5Tcopy"); - - ret = H5Tset_size(tid1, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - plist = H5Pcreate(H5P_DATASET_CREATE); - CHECK(plist, FAIL, "H5Pcreate"); - - ret = H5Pset_layout(plist, H5D_COMPACT); - CHECK(ret, FAIL, "H5Pset_layout"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset5", tid1, sid1, H5P_DEFAULT, plist, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (strlen(wdata[i]) != strlen(rdata[i])) { - TestErrPrintf("VL data length don't match!, strlen(wdata[%d])=%d, strlen(rdata[%d])=%d\n", (int)i, - (int)strlen(wdata[i]), (int)i, (int)strlen(rdata[i])); - continue; - } /* end if */ - if (strcmp(wdata[i], rdata[i]) != 0) { - TestErrPrintf("VL data values don't match!, wdata[%d]=%s, rdata[%d]=%s\n", (int)i, wdata[i], - (int)i, rdata[i]); - continue; - } /* end if */ - } /* end for */ - - /* Reclaim the read VL data */ - ret = H5Treclaim(tid1, sid1, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset create property list */ - ret = H5Pclose(plist); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /*test_compact_vlstrings*/ - -/**************************************************************** -** -** test_write_vl_string_attribute(): Test basic VL string code. -** Tests writing VL strings as attributes -** -****************************************************************/ -static void -test_write_vl_string_attribute(void) -{ - hid_t file, root, dataspace, att; - hid_t type; - herr_t ret; - char *string_att_check = NULL; - - /* Open the file */ - file = H5Fopen(DATAFILE, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fopen"); - - /* Create a datatype to refer to. */ - type = H5Tcopy(H5T_C_S1); - CHECK(type, FAIL, "H5Tcopy"); - - ret = H5Tset_size(type, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - root = H5Gopen2(file, "/", H5P_DEFAULT); - CHECK(root, FAIL, "H5Gopen2"); - - dataspace = H5Screate(H5S_SCALAR); - CHECK(dataspace, FAIL, "H5Screate"); - - /* Test creating a "normal" sized string attribute */ - att = H5Acreate2(root, "test_scalar", type, dataspace, H5P_DEFAULT, H5P_DEFAULT); - CHECK(att, FAIL, "H5Acreate2"); - - ret = H5Awrite(att, type, &string_att); - CHECK(ret, FAIL, "H5Awrite"); - - ret = H5Aread(att, type, &string_att_check); - CHECK(ret, FAIL, "H5Aread"); - - if (strcmp(string_att_check, string_att) != 0) - TestErrPrintf("VL string attributes don't match!, string_att=%s, string_att_check=%s\n", string_att, - string_att_check); - - H5free_memory(string_att_check); - string_att_check = NULL; - - ret = H5Aclose(att); - CHECK(ret, FAIL, "HAclose"); - - /* Test creating a "large" sized string attribute */ - att = H5Acreate2(root, "test_scalar_large", type, dataspace, H5P_DEFAULT, H5P_DEFAULT); - CHECK(att, FAIL, "H5Acreate2"); - - string_att_write = (char *)calloc((size_t)8192, sizeof(char)); - memset(string_att_write, 'A', (size_t)8191); - - ret = H5Awrite(att, type, &string_att_write); - CHECK(ret, FAIL, "H5Awrite"); - - ret = H5Aread(att, type, &string_att_check); - CHECK(ret, FAIL, "H5Aread"); - - if (strcmp(string_att_check, string_att_write) != 0) - TestErrPrintf("VL string attributes don't match!, string_att_write=%s, string_att_check=%s\n", - string_att_write, string_att_check); - - H5free_memory(string_att_check); - string_att_check = NULL; - - /* The attribute string written is freed below, in the test_read_vl_string_attribute() test */ - /* free(string_att_write); */ - - ret = H5Aclose(att); - CHECK(ret, FAIL, "HAclose"); - - ret = H5Gclose(root); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Sclose(dataspace); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} - -/**************************************************************** -** -** test_read_vl_string_attribute(): Test basic VL string code. -** Tests reading VL strings from attributes -** -****************************************************************/ -static void -test_read_vl_string_attribute(void) -{ - hid_t file, root, att; - hid_t type; - herr_t ret; - char *string_att_check = NULL; - - /* Open file */ - file = H5Fopen(DATAFILE, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file, FAIL, "H5Fopen"); - - /* Create a datatype to refer to. */ - type = H5Tcopy(H5T_C_S1); - CHECK(type, FAIL, "H5Tcopy"); - - ret = H5Tset_size(type, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - root = H5Gopen2(file, "/", H5P_DEFAULT); - CHECK(root, FAIL, "H5Gopen2"); - - /* Test reading "normal" sized string attribute */ - att = H5Aopen(root, "test_scalar", H5P_DEFAULT); - CHECK(att, FAIL, "H5Aopen"); - - ret = H5Aread(att, type, &string_att_check); - CHECK(ret, FAIL, "H5Aread"); - - if (strcmp(string_att_check, string_att) != 0) - TestErrPrintf("VL string attributes don't match!, string_att=%s, string_att_check=%s\n", string_att, - string_att_check); - - H5free_memory(string_att_check); - string_att_check = NULL; - - ret = H5Aclose(att); - CHECK(ret, FAIL, "HAclose"); - - /* Test reading "large" sized string attribute */ - att = H5Aopen(root, "test_scalar_large", H5P_DEFAULT); - CHECK(att, FAIL, "H5Aopen"); - - if (string_att_write) { - ret = H5Aread(att, type, &string_att_check); - CHECK(ret, FAIL, "H5Aread"); - - if (strcmp(string_att_check, string_att_write) != 0) - TestErrPrintf("VL string attributes don't match!, string_att_write=%s, string_att_check=%s\n", - string_att_write, string_att_check); - - H5free_memory(string_att_check); - string_att_check = NULL; - } - - /* Free string allocated in test_write_vl_string_attribute */ - if (string_att_write) - free(string_att_write); - - ret = H5Aclose(att); - CHECK(ret, FAIL, "HAclose"); - - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Gclose(root); - CHECK(ret, FAIL, "H5Gclose"); - - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); -} - -/* Helper routine for test_vl_rewrite() */ -static void -write_scalar_dset(hid_t file, hid_t type, hid_t space, char *name, char *data) -{ - hid_t dset; - herr_t ret; - - dset = H5Dcreate2(file, name, type, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); - - ret = H5Dwrite(dset, type, space, space, H5P_DEFAULT, &data); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); -} - -/* Helper routine for test_vl_rewrite() */ -static void -read_scalar_dset(hid_t file, hid_t type, hid_t space, char *name, char *data) -{ - hid_t dset; - herr_t ret; - char *data_read; - - dset = H5Dopen2(file, name, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dopen2"); - - ret = H5Dread(dset, type, space, space, H5P_DEFAULT, &data_read); - CHECK(ret, FAIL, "H5Dread"); - - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - - if (strcmp(data, data_read) != 0) - TestErrPrintf("Expected %s for dataset %s but read %s\n", data, name, data_read); - - ret = H5Treclaim(type, space, H5P_DEFAULT, &data_read); - CHECK(ret, FAIL, "H5Treclaim"); -} - -/**************************************************************** -** -** test_vl_rewrite(): Test basic VL string code. -** Tests I/O on VL strings when lots of objects in the file -** have been linked/unlinked. -** -****************************************************************/ -static void -test_vl_rewrite(void) -{ - hid_t file1, file2; /* File IDs */ - hid_t type; /* VL string datatype ID */ - hid_t space; /* Scalar dataspace */ - char name[256]; /* Buffer for names & data */ - int i; /* Local index variable */ - herr_t ret; /* Generic return value */ - - /* Create the VL string datatype */ - type = H5Tcopy(H5T_C_S1); - CHECK(type, FAIL, "H5Tcopy"); - - ret = H5Tset_size(type, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Create the scalar dataspace */ - space = H5Screate(H5S_SCALAR); - CHECK(space, FAIL, "H5Screate"); - - /* Open the files */ - file1 = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file1, FAIL, "H5Fcreate"); - - file2 = H5Fcreate(DATAFILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file1, FAIL, "H5Fcreate"); - - /* Create in file 1 */ - for (i = 0; i < REWRITE_NDATASETS; i++) { - snprintf(name, sizeof(name), "/set_%d", i); - write_scalar_dset(file1, type, space, name, name); - } - - /* Effectively copy data from file 1 to 2 */ - for (i = 0; i < REWRITE_NDATASETS; i++) { - snprintf(name, sizeof(name), "/set_%d", i); - read_scalar_dset(file1, type, space, name, name); - write_scalar_dset(file2, type, space, name, name); - } - - /* Read back from file 2 */ - for (i = 0; i < REWRITE_NDATASETS; i++) { - snprintf(name, sizeof(name), "/set_%d", i); - read_scalar_dset(file2, type, space, name, name); - } /* end for */ - - /* Remove from file 2. */ - for (i = 0; i < REWRITE_NDATASETS; i++) { - snprintf(name, sizeof(name), "/set_%d", i); - ret = H5Ldelete(file2, name, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end for */ - - /* Effectively copy from file 1 to file 2 */ - for (i = 0; i < REWRITE_NDATASETS; i++) { - snprintf(name, sizeof(name), "/set_%d", i); - read_scalar_dset(file1, type, space, name, name); - write_scalar_dset(file2, type, space, name, name); - } /* end for */ - - /* Close everything */ - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Sclose(space); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file1); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Fclose(file2); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_vl_rewrite() */ - -/**************************************************************** - ** - ** test_write_same_element(): - ** Tests writing to the same element of VL string using - ** H5Sselect_element. - ** - ****************************************************************/ -static void -test_write_same_element(void) -{ - hid_t file1, dataset1; - hid_t mspace, fspace, dtype; - hsize_t fdim[] = {SPACE1_DIM1}; - const char *wdata[SPACE1_DIM1] = {"Parting", "is such a", "sweet", "sorrow."}; - const char *val[SPACE1_DIM1] = {"But", "reuniting", "is a", "great joy"}; - hsize_t marray[] = {NUMP}; - hsize_t coord[SPACE1_RANK][NUMP]; - herr_t ret; - - MESSAGE(5, ("Testing writing to same element of VL string dataset twice\n")); - - if ((vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) && (vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC)) { - file1 = H5Fcreate(DATAFILE3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file1, FAIL, "H5Fcreate"); - - dtype = H5Tcopy(H5T_C_S1); - CHECK(dtype, FAIL, "H5Tcopy"); - - ret = H5Tset_size(dtype, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - fspace = H5Screate_simple(SPACE1_RANK, fdim, NULL); - CHECK(fspace, FAIL, "H5Screate_simple"); - - dataset1 = H5Dcreate2(file1, DATASET, dtype, fspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset1, FAIL, "H5Dcreate"); - - ret = H5Dwrite(dataset1, dtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Dclose(dataset1); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Sclose(fspace); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file1); - CHECK(ret, FAIL, "H5Fclose"); - - /* - * Open the file. Select the same points, write values to those point locations. - */ - file1 = H5Fopen(DATAFILE3, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file1, FAIL, "H5Fopen"); - - dataset1 = H5Dopen2(file1, DATASET, H5P_DEFAULT); - CHECK(dataset1, FAIL, "H5Dopen"); - - fspace = H5Dget_space(dataset1); - CHECK(fspace, FAIL, "H5Dget_space"); - - dtype = H5Dget_type(dataset1); - CHECK(dtype, FAIL, "H5Dget_type"); - - mspace = H5Screate_simple(1, marray, NULL); - CHECK(mspace, FAIL, "H5Screate_simple"); - - coord[0][0] = 0; - coord[0][1] = 2; - coord[0][2] = 2; - coord[0][3] = 0; - - ret = H5Sselect_elements(fspace, H5S_SELECT_SET, NUMP, (const hsize_t *)&coord); - CHECK(ret, FAIL, "H5Sselect_elements"); - - ret = H5Dwrite(dataset1, dtype, mspace, fspace, H5P_DEFAULT, val); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Tclose(dtype); - CHECK(ret, FAIL, "H5Tclose"); - - ret = H5Dclose(dataset1); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(fspace); - CHECK(ret, FAIL, "H5Dclose"); - - ret = H5Sclose(mspace); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Fclose(file1); - CHECK(ret, FAIL, "H5Fclose"); - } -} /* test_write_same_element */ - -/**************************************************************** -** -** test_vlstrings(): Main VL string testing routine. -** -****************************************************************/ -void -test_vlstrings(void) -{ - /* Output message about test being performed */ - MESSAGE(5, ("Testing Variable-Length Strings\n")); - - /* These tests use the same file */ - /* Test basic VL string datatype */ - test_vlstrings_basic(); - test_vlstrings_special(); - test_vlstring_type(); - test_compact_vlstring(); - - /* Test using VL strings in attributes */ - test_write_vl_string_attribute(); - test_read_vl_string_attribute(); - - /* Test writing VL datasets in files with lots of unlinking */ - test_vl_rewrite(); - /* Test writing to the same element more than once using H5Sselect_elements */ - test_write_same_element(); -} /* test_vlstrings() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_vlstrings - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_vlstrings(void) -{ - H5Fdelete(DATAFILE, H5P_DEFAULT); - H5Fdelete(DATAFILE2, H5P_DEFAULT); - H5Fdelete(DATAFILE3, H5P_DEFAULT); -} diff --git a/test/API/tvltypes.c b/test/API/tvltypes.c deleted file mode 100644 index 9e6027c..0000000 --- a/test/API/tvltypes.c +++ /dev/null @@ -1,3258 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * 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. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*********************************************************** - * - * Test program: tvltypes - * - * Test the Variable-Length Datatype functionality - * - *************************************************************/ - -#include "testhdf5.h" - -/* #include "H5Dprivate.h" */ - -#define FILENAME "tvltypes.h5" - -/* 1-D dataset with fixed dimensions */ -#define SPACE1_RANK 1 -#define SPACE1_DIM1 4 - -/* 1-D dataset with fixed dimensions */ -#define SPACE3_RANK 1 -#define SPACE3_DIM1 128 -#define L1_INCM 16 -#define L2_INCM 8 -#define L3_INCM 3 - -/* Default temporary buffer size - Pulled from H5Dprivate.h */ -#define H5D_TEMP_BUF_SIZE (1024 * 1024) - -/* 1-D dataset with fixed dimensions */ -#define SPACE4_RANK 1 -#define SPACE4_DIM_SMALL 128 -#define SPACE4_DIM_LARGE (H5D_TEMP_BUF_SIZE / 64) - -void *test_vltypes_alloc_custom(size_t size, void *info); -void test_vltypes_free_custom(void *mem, void *info); - -/**************************************************************** -** -** test_vltypes_alloc_custom(): Test VL datatype custom memory -** allocation routines. This routine just uses malloc to -** allocate the memory and increments the amount of memory -** allocated. -** -****************************************************************/ -void * -test_vltypes_alloc_custom(size_t size, void *mem_used) -{ - void *ret_value; /* Pointer to return */ - const size_t extra = MAX(sizeof(void *), sizeof(size_t)); /* Extra space needed */ - /* (This weird contortion is required on the - * DEC Alpha to keep the alignment correct - QAK) - */ - - if ((ret_value = malloc(extra + size)) != NULL) { - *(size_t *)ret_value = size; - *(size_t *)mem_used += size; - } /* end if */ - - ret_value = ((unsigned char *)ret_value) + extra; - - return (ret_value); -} - -/**************************************************************** -** -** test_vltypes_free_custom(): Test VL datatype custom memory -** allocation routines. This routine just uses free to -** release the memory and decrements the amount of memory -** allocated. -** -****************************************************************/ -void -test_vltypes_free_custom(void *_mem, void *mem_used) -{ - if (_mem) { - const size_t extra = MAX(sizeof(void *), sizeof(size_t)); /* Extra space needed */ - /* (This weird contortion is required - * on the DEC Alpha to keep the - * alignment correct - QAK) - */ - unsigned char *mem = ((unsigned char *)_mem) - extra; /* Pointer to actual block allocated */ - - *(size_t *)mem_used -= *(size_t *)((void *)mem); - free(mem); - } /* end if */ -} - -/**************************************************************** -** -** test_vltypes_data_create(): Dataset of VL is supposed to -** fail when fill value is never written to dataset. -** -****************************************************************/ -static void -test_vltypes_dataset_create(void) -{ - hid_t fid1; /* HDF5 File IDs */ - hid_t dcpl; /* Dataset Property list */ - hid_t dataset; /* Dataset ID */ - hsize_t dims1[] = {SPACE1_DIM1}; - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Dataset of VL Datatype Functionality\n")); - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - tid1 = H5Tvlen_create(H5T_NATIVE_UINT); - CHECK(tid1, FAIL, "H5Tvlen_create"); - - /* Create dataset property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); - - /* Set fill value writing time to be NEVER */ - ret = H5Pset_fill_time(dcpl, H5D_FILL_TIME_NEVER); - CHECK(ret, FAIL, "H5Pset_fill_time"); - - /* Create a dataset, supposed to fail */ - H5E_BEGIN_TRY - { - dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, dcpl, H5P_DEFAULT); - } - H5E_END_TRY - VERIFY(dataset, FAIL, "H5Dcreate2"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} - -/**************************************************************** -** -** test_vltypes_funcs(): Test some type functions that are and -** aren't supposed to work with VL type. -** -****************************************************************/ -static void -test_vltypes_funcs(void) -{ - hid_t type; /* Datatype ID */ - size_t size; - H5T_pad_t inpad; - H5T_norm_t norm; - H5T_cset_t cset; - H5T_str_t strpad; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing some type functions for VL\n")); - - /* Create a datatype to refer to */ - type = H5Tvlen_create(H5T_IEEE_F32BE); - CHECK(type, FAIL, "H5Tvlen_create"); - - size = H5Tget_precision(type); - CHECK(size, 0, "H5Tget_precision"); - - size = H5Tget_size(type); - CHECK(size, 0, "H5Tget_size"); - - size = H5Tget_ebias(type); - CHECK(size, 0, "H5Tget_ebias"); - - ret = H5Tset_pad(type, H5T_PAD_ZERO, H5T_PAD_ONE); - CHECK(ret, FAIL, "H5Tset_pad"); - - inpad = H5Tget_inpad(type); - CHECK(inpad, FAIL, "H5Tget_inpad"); - - norm = H5Tget_norm(type); - CHECK(norm, FAIL, "H5Tget_norm"); - - ret = H5Tset_offset(type, (size_t)16); - CHECK(ret, FAIL, "H5Tset_offset"); - - H5E_BEGIN_TRY - { - cset = H5Tget_cset(type); - } - H5E_END_TRY - VERIFY(cset, FAIL, "H5Tget_cset"); - - H5E_BEGIN_TRY - { - strpad = H5Tget_strpad(type); - } - H5E_END_TRY - VERIFY(strpad, FAIL, "H5Tget_strpad"); - - /* Close datatype */ - ret = H5Tclose(type); - CHECK(ret, FAIL, "H5Tclose"); -} - -/**************************************************************** -** -** test_vltypes_vlen_atomic(): Test basic VL datatype code. -** Tests VL datatypes of atomic datatypes -** -****************************************************************/ -static void -test_vltypes_vlen_atomic(void) -{ - hvl_t wdata[SPACE1_DIM1]; /* Information to write */ - hvl_t wdata2[SPACE1_DIM1]; /* Information to write */ - hvl_t rdata[SPACE1_DIM1]; /* Information read in */ - hvl_t fill; /* Fill value */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t sid2; /* ID of bad dataspace (no extent set) */ - hid_t tid1; /* Datatype ID */ - hid_t dcpl_pid; /* Dataset creation property list ID */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t dims1[] = {SPACE1_DIM1}; - hsize_t size; /* Number of bytes which will be used */ - unsigned i, j; /* counting variables */ - size_t mem_used = 0; /* Memory used during allocation */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Atomic VL Datatype Functionality\n")); - - /* Allocate and initialize VL data to write */ - for (i = 0; i < SPACE1_DIM1; i++) { - wdata[i].p = malloc((i + 1) * sizeof(unsigned int)); - wdata[i].len = i + 1; - for (j = 0; j < (i + 1); j++) - ((unsigned int *)wdata[i].p)[j] = i * 10 + j; - - wdata2[i].p = NULL; - wdata2[i].len = 0; - } /* end for */ - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a datatype to refer to */ - tid1 = H5Tvlen_create(H5T_NATIVE_UINT); - CHECK(tid1, FAIL, "H5Tvlen_create"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Read from dataset before writing data */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - if (rdata[i].len != 0 || rdata[i].p != NULL) - TestErrPrintf("VL doesn't match!, rdata[%d].len=%u, rdata[%d].p=%p\n", (int)i, - (unsigned)rdata[i].len, (int)i, rdata[i].p); - - /* Write "nil" data to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata2); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read from dataset with "nil" data */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - if (rdata[i].len != 0 || rdata[i].p != NULL) - TestErrPrintf("VL doesn't match!, rdata[%d].len=%u, rdata[%d].p=%p\n", (int)i, - (unsigned)rdata[i].len, (int)i, rdata[i].p); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create second dataset, with fill value */ - dcpl_pid = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl_pid, FAIL, "H5Pcreate"); - - /* Set the fill value for the second dataset */ - fill.p = NULL; - fill.len = 0; - ret = H5Pset_fill_value(dcpl_pid, tid1, &fill); - CHECK(ret, FAIL, "H5Pset_fill_value"); - - /* Create a second dataset */ - dataset = H5Dcreate2(fid1, "Dataset2", tid1, sid1, H5P_DEFAULT, dcpl_pid, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataset creation property list */ - ret = H5Pclose(dcpl_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Read from dataset before writing data */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - if (rdata[i].len != 0 || rdata[i].p != NULL) - TestErrPrintf("VL doesn't match!, rdata[%d].len=%u, rdata[%d].p=%p\n", (int)i, - (unsigned)rdata[i].len, (int)i, rdata[i].p); - - /* Write "nil" data to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata2); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read from dataset with "nil" data */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - if (rdata[i].len != 0 || rdata[i].p != NULL) - TestErrPrintf("VL doesn't match!, rdata[%d].len=%u, rdata[%d].p=%p\n", (int)i, - (unsigned)rdata[i].len, (int)i, rdata[i].p); - - /* Write data to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open the file for data checking */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open a dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get dataspace for datasets */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Get datatype for dataset */ - tid1 = H5Dget_type(dataset); - CHECK(tid1, FAIL, "H5Dget_type"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dataset, tid1, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* 10 elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - VERIFY(size, ((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(unsigned int), "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* 10 elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - VERIFY(mem_used, ((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(unsigned int), "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].len != rdata[i].len) { - TestErrPrintf("%d: VL data lengths don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n", __LINE__, - (int)i, (int)wdata[i].len, (int)i, (int)rdata[i].len); - continue; - } /* end if */ - for (j = 0; j < rdata[i].len; j++) { - if (((unsigned int *)wdata[i].p)[j] != ((unsigned int *)rdata[i].p)[j]) { - TestErrPrintf("VL data values don't match!, wdata[%d].p[%d]=%d, rdata[%d].p[%d]=%d\n", (int)i, - (int)j, (int)((unsigned int *)wdata[i].p)[j], (int)i, (int)j, - (int)((unsigned int *)rdata[i].p)[j]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Reclaim the read VL data */ - ret = H5Treclaim(tid1, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Open second dataset */ - dataset = H5Dopen2(fid1, "Dataset2", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get dataspace for datasets */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Get datatype for dataset */ - tid1 = H5Dget_type(dataset); - CHECK(tid1, FAIL, "H5Dget_type"); - - /* Create a "bad" dataspace with no extent set */ - sid2 = H5Screate(H5S_SIMPLE); - CHECK(sid2, FAIL, "H5Screate"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dataset, tid1, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* 10 elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - VERIFY(size, ((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(unsigned int), "H5Dvlen_get_buf_size"); - - /* Try to call H5Dvlen_get_buf with bad dataspace */ - H5E_BEGIN_TRY - { - ret = H5Dvlen_get_buf_size(dataset, tid1, sid2, &size); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* 10 elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - VERIFY(mem_used, ((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(unsigned int), "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].len != rdata[i].len) { - TestErrPrintf("%d: VL data lengths don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n", __LINE__, - (int)i, (int)wdata[i].len, (int)i, (int)rdata[i].len); - continue; - } /* end if */ - for (j = 0; j < rdata[i].len; j++) { - if (((unsigned int *)wdata[i].p)[j] != ((unsigned int *)rdata[i].p)[j]) { - TestErrPrintf("VL data values don't match!, wdata[%d].p[%d]=%d, rdata[%d].p[%d]=%d\n", (int)i, - (int)j, (int)((unsigned int *)wdata[i].p)[j], (int)i, (int)j, - (int)((unsigned int *)rdata[i].p)[j]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Try to reclaim read data using "bad" dataspace with no extent - * Should fail */ - H5E_BEGIN_TRY - { - ret = H5Treclaim(tid1, sid2, xfer_pid, rdata); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Treclaim"); - - /* Reclaim the read VL data */ - ret = H5Treclaim(tid1, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid1, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_vltypes_vlen_atomic() */ - -/**************************************************************** -** -** rewrite_vltypes_vlen_atomic(): check memory leak for basic VL datatype. -** Check memory leak for VL datatypes of atomic datatypes -** -****************************************************************/ -static void -rewrite_vltypes_vlen_atomic(void) -{ - hvl_t wdata[SPACE1_DIM1]; /* Information to write */ - hvl_t rdata[SPACE1_DIM1]; /* Information read in */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1; /* Datatype ID */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t size; /* Number of bytes which will be used */ - unsigned i, j; /* counting variables */ - size_t mem_used = 0; /* Memory used during allocation */ - unsigned increment = 4; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Check Memory Leak for Basic Atomic VL Datatype Functionality\n")); - - /* Allocate and initialize VL data to write */ - for (i = 0; i < SPACE1_DIM1; i++) { - wdata[i].p = malloc((i + increment) * sizeof(unsigned int)); - wdata[i].len = i + increment; - for (j = 0; j < (i + increment); j++) - ((unsigned int *)wdata[i].p)[j] = i * 20 + j; - } /* end for */ - - /* Open file created in test_vltypes_vlen_atomic() */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset created in test_vltypes_vlen_atomic() */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Open dataspace for dataset */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Get datatype for dataset */ - tid1 = H5Dget_type(dataset); - CHECK(tid1, FAIL, "H5Dget_type"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open the file for data checking */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open a dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get dataspace for datasets */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Get datatype for dataset */ - tid1 = H5Dget_type(dataset); - CHECK(tid1, FAIL, "H5Dget_type"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dataset, tid1, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* 22 elements allocated = 4+5+6+7 elements for each array position */ - VERIFY(size, 22 * sizeof(unsigned int), "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* 22 elements allocated = 4+5+6+7 elements for each array position */ - VERIFY(mem_used, 22 * sizeof(unsigned int), "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].len != rdata[i].len) { - TestErrPrintf("%d: VL data lengths don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n", __LINE__, - (int)i, (int)wdata[i].len, (int)i, (int)rdata[i].len); - continue; - } /* end if */ - for (j = 0; j < rdata[i].len; j++) { - if (((unsigned int *)wdata[i].p)[j] != ((unsigned int *)rdata[i].p)[j]) { - TestErrPrintf("VL data values don't match!, wdata[%d].p[%d]=%d, rdata[%d].p[%d]=%d\n", (int)i, - (int)j, (int)((unsigned int *)wdata[i].p)[j], (int)i, (int)j, - (int)((unsigned int *)rdata[i].p)[j]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Reclaim the read VL data */ - ret = H5Treclaim(tid1, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid1, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end rewrite_vltypes_vlen_atomic() */ - -/**************************************************************** -** -** test_vltypes_vlen_compound(): Test basic VL datatype code. -** Test VL datatypes of compound datatypes -** -****************************************************************/ -static void -test_vltypes_vlen_compound(void) -{ - typedef struct { /* Struct that the VL sequences are composed of */ - int i; - float f; - } s1; - hvl_t wdata[SPACE1_DIM1]; /* Information to write */ - hvl_t rdata[SPACE1_DIM1]; /* Information read in */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1, tid2; /* Datatype IDs */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t dims1[] = {SPACE1_DIM1}; - hsize_t size; /* Number of bytes which will be used */ - unsigned i, j; /* counting variables */ - size_t mem_used = 0; /* Memory used during allocation */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Basic Compound VL Datatype Functionality\n")); - - /* Allocate and initialize VL data to write */ - for (i = 0; i < SPACE1_DIM1; i++) { - wdata[i].p = malloc((i + 1) * sizeof(s1)); - wdata[i].len = i + 1; - for (j = 0; j < (i + 1); j++) { - ((s1 *)wdata[i].p)[j].i = (int)(i * 10 + j); - ((s1 *)wdata[i].p)[j].f = (float)(i * 20 + j) / 3.0F; - } /* end for */ - } /* end for */ - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create the base compound type */ - tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1)); - CHECK(tid2, FAIL, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create a datatype to refer to */ - tid1 = H5Tvlen_create(tid2); - CHECK(tid1, FAIL, "H5Tvlen_create"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dataset, tid1, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* 10 elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - VERIFY(size, ((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(s1), "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* 10 elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - VERIFY(mem_used, ((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(s1), "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].len != rdata[i].len) { - TestErrPrintf("%d: VL data length don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n", __LINE__, - (int)i, (int)wdata[i].len, (int)i, (int)rdata[i].len); - continue; - } /* end if */ - for (j = 0; j < rdata[i].len; j++) { - if (((s1 *)wdata[i].p)[j].i != ((s1 *)rdata[i].p)[j].i) { - TestErrPrintf("VL data values don't match!, wdata[%d].p[%d].i=%d, rdata[%d].p[%d].i=%d\n", - (int)i, (int)j, (int)((s1 *)wdata[i].p)[j].i, (int)i, (int)j, - (int)((s1 *)rdata[i].p)[j].i); - continue; - } /* end if */ - if (!H5_FLT_ABS_EQUAL(((s1 *)wdata[i].p)[j].f, ((s1 *)rdata[i].p)[j].f)) { - TestErrPrintf("VL data values don't match!, wdata[%d].p[%d].f=%f, rdata[%d].p[%d].f=%f\n", - (int)i, (int)j, (double)((s1 *)wdata[i].p)[j].f, (int)i, (int)j, - (double)((s1 *)rdata[i].p)[j].f); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Reclaim the VL data */ - ret = H5Treclaim(tid1, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid1, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_vltypes_vlen_compound() */ - -/**************************************************************** -** -** rewrite_vltypes_vlen_compound(): Check memory leak for basic VL datatype. -** Checks memory leak for VL datatypes of compound datatypes -** -****************************************************************/ -static void -rewrite_vltypes_vlen_compound(void) -{ - typedef struct { /* Struct that the VL sequences are composed of */ - int i; - float f; - } s1; - hvl_t wdata[SPACE1_DIM1]; /* Information to write */ - hvl_t rdata[SPACE1_DIM1]; /* Information read in */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1, tid2; /* Datatype IDs */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t size; /* Number of bytes which will be used */ - unsigned i, j; /* counting variables */ - size_t mem_used = 0; /* Memory used during allocation */ - unsigned increment = 4; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Check Memory Leak for Basic Compound VL Datatype Functionality\n")); - - /* Allocate and initialize VL data to write */ - for (i = 0; i < SPACE1_DIM1; i++) { - wdata[i].p = malloc((i + increment) * sizeof(s1)); - wdata[i].len = i + increment; - for (j = 0; j < (i + increment); j++) { - ((s1 *)wdata[i].p)[j].i = (int)(i * 40 + j); - ((s1 *)wdata[i].p)[j].f = (float)(i * 60 + j) / 3.0F; - } /* end for */ - } /* end for */ - - /* Create file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Create the base compound type */ - tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1)); - CHECK(tid2, FAIL, "H5Tcreate"); - - ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create a datatype to refer to */ - tid1 = H5Tvlen_create(tid2); - CHECK(tid1, FAIL, "H5Tvlen_create"); - - /* Create a dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Create dataspace for datasets */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid1, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dataset, tid1, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* 22 elements allocated = 4 + 5 + 6 + 7 elements for each array position */ - VERIFY(size, 22 * sizeof(s1), "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid1, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* 22 elements allocated = 4 + 5 + 6 + 7 elements for each array position */ - VERIFY(mem_used, 22 * sizeof(s1), "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].len != rdata[i].len) { - TestErrPrintf("%d: VL data length don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n", __LINE__, - (int)i, (int)wdata[i].len, (int)i, (int)rdata[i].len); - continue; - } /* end if */ - for (j = 0; j < rdata[i].len; j++) { - if (((s1 *)wdata[i].p)[j].i != ((s1 *)rdata[i].p)[j].i) { - TestErrPrintf("VL data values don't match!, wdata[%d].p[%d].i=%d, rdata[%d].p[%d].i=%d\n", - (int)i, (int)j, (int)((s1 *)wdata[i].p)[j].i, (int)i, (int)j, - (int)((s1 *)rdata[i].p)[j].i); - continue; - } /* end if */ - if (!H5_FLT_ABS_EQUAL(((s1 *)wdata[i].p)[j].f, ((s1 *)rdata[i].p)[j].f)) { - TestErrPrintf("VL data values don't match!, wdata[%d].p[%d].f=%f, rdata[%d].p[%d].f=%f\n", - (int)i, (int)j, (double)((s1 *)wdata[i].p)[j].f, (int)i, (int)j, - (double)((s1 *)rdata[i].p)[j].f); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Reclaim the VL data */ - ret = H5Treclaim(tid1, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid1, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end rewrite_vltypes_vlen_compound() */ - -/**************************************************************** -** -** test_vltypes_compound_vlen_vlen(): Test basic VL datatype code. -** Tests compound datatypes with VL datatypes of VL datatypes. -** -****************************************************************/ -static void -test_vltypes_compound_vlen_vlen(void) -{ - typedef struct { /* Struct that the compound type are composed of */ - int i; - float f; - hvl_t v; - } s1; - s1 *wdata; /* data to write */ - s1 *rdata; /* data to read */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1, tid2, tid3; /* Datatype IDs */ - hsize_t dims1[] = {SPACE3_DIM1}; - unsigned i, j, k; /* counting variables */ - hvl_t *t1, *t2; /* Temporary pointer to VL information */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Compound Datatypes with VL Atomic Datatype Component Functionality\n")); - - /* Allocate and initialize VL data to write */ - wdata = (s1 *)malloc(sizeof(s1) * SPACE3_DIM1); - CHECK_PTR(wdata, "malloc"); - rdata = (s1 *)malloc(sizeof(s1) * SPACE3_DIM1); - CHECK_PTR(rdata, "malloc"); - for (i = 0; i < SPACE3_DIM1; i++) { - wdata[i].i = (int)(i * 10); - wdata[i].f = (float)(i * 20) / 3.0F; - wdata[i].v.p = malloc((i + L1_INCM) * sizeof(hvl_t)); - wdata[i].v.len = i + L1_INCM; - for (t1 = (hvl_t *)((wdata[i].v).p), j = 0; j < (i + L1_INCM); j++, t1++) { - t1->p = malloc((j + L2_INCM) * sizeof(unsigned int)); - t1->len = j + L2_INCM; - for (k = 0; k < j + L2_INCM; k++) - ((unsigned int *)t1->p)[k] = i * 100 + j * 10 + k; - } /* end for */ - } /* end for */ - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE3_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a VL datatype to refer to */ - tid3 = H5Tvlen_create(H5T_NATIVE_UINT); - CHECK(tid3, FAIL, "H5Tvlen_create"); - - /* Create a VL datatype to refer to */ - tid1 = H5Tvlen_create(tid3); - CHECK(tid1, FAIL, "H5Tvlen_create"); - - /* Create the base compound type */ - tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1)); - CHECK(tid2, FAIL, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - ret = H5Tinsert(tid2, "v", HOFFSET(s1, v), tid1); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid2, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open a dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE3_DIM1; i++) { - if (wdata[i].i != rdata[i].i) { - TestErrPrintf("Integer components don't match!, wdata[%d].i=%d, rdata[%d].i=%d\n", (int)i, - (int)wdata[i].i, (int)i, (int)rdata[i].i); - continue; - } /* end if */ - if (!H5_FLT_ABS_EQUAL(wdata[i].f, rdata[i].f)) { - TestErrPrintf("Float components don't match!, wdata[%d].f=%f, rdata[%d].f=%f\n", (int)i, - (double)wdata[i].f, (int)i, (double)rdata[i].f); - continue; - } /* end if */ - - if (wdata[i].v.len != rdata[i].v.len) { - TestErrPrintf("%d: VL data length don't match!, wdata[%d].v.len=%d, rdata[%d].v.len=%d\n", - __LINE__, (int)i, (int)wdata[i].v.len, (int)i, (int)rdata[i].v.len); - continue; - } /* end if */ - - for (t1 = (hvl_t *)(wdata[i].v.p), t2 = (hvl_t *)(rdata[i].v.p), j = 0; j < rdata[i].v.len; - j++, t1++, t2++) { - if (t1->len != t2->len) { - TestErrPrintf("%d: VL data length don't match!, i=%d, j=%d, t1->len=%d, t2->len=%d\n", - __LINE__, (int)i, (int)j, (int)t1->len, (int)t2->len); - continue; - } /* end if */ - for (k = 0; k < t2->len; k++) { - if (((unsigned int *)t1->p)[k] != ((unsigned int *)t2->p)[k]) { - TestErrPrintf("VL data values don't match!, t1->p[%d]=%d, t2->p[%d]=%d\n", (int)k, - (int)((unsigned int *)t1->p)[k], (int)k, (int)((unsigned int *)t2->p)[k]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - } /* end for */ - - /* Reclaim the VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid3); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Release buffers */ - free(wdata); - free(rdata); -} /* end test_vltypes_compound_vlen_vlen() */ - -/**************************************************************** -** -** test_vltypes_compound_vlstr(): Test VL datatype code. -** Tests VL datatypes of compound datatypes with VL string. -** Dataset is extensible chunked, and data is rewritten with -** shorter VL data. -** -****************************************************************/ -static void -test_vltypes_compound_vlstr(void) -{ - typedef enum { red, blue, green } e1; - typedef struct { - char *string; - e1 color; - } s2; - typedef struct { /* Struct that the compound type are composed of */ - hvl_t v; - } s1; - s1 wdata[SPACE1_DIM1]; /* data to write */ - s1 wdata2[SPACE1_DIM1]; /* data to write */ - s1 rdata[SPACE1_DIM1]; /* data to read */ - s1 rdata2[SPACE1_DIM1]; /* data to read */ - char str[64] = "a\0"; - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset, dset2; /* Dataset ID */ - hid_t sid1, sid2, filespace, filespace2; /* Dataspace ID */ - hid_t tid1, tid2, tid3, tid4, tid5; /* Datatype IDs */ - hid_t cparms; - hsize_t dims1[] = {SPACE1_DIM1}; - hsize_t chunk_dims[] = {SPACE1_DIM1 / 2}; - hsize_t maxdims[] = {H5S_UNLIMITED}; - hsize_t size[] = {SPACE1_DIM1}; - hsize_t offset[] = {0}; - unsigned i, j; /* counting variables */ - s2 *t1, *t2; /* Temporary pointer to VL information */ - int val; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing VL Datatype of Compound Datatype with VL String Functionality\n")); - - /* Allocate and initialize VL data to write */ - for (i = 0; i < SPACE1_DIM1; i++) { - wdata[i].v.p = (s2 *)malloc((i + L3_INCM) * sizeof(s2)); - wdata[i].v.len = i + L3_INCM; - for (t1 = (s2 *)((wdata[i].v).p), j = 0; j < (i + L3_INCM); j++, t1++) { - strcat(str, "m"); - t1->string = (char *)malloc(strlen(str) * sizeof(char) + 1); - strcpy(t1->string, str); - /*t1->color = red;*/ - t1->color = blue; - } - } /* end for */ - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, maxdims); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a VL string type*/ - tid4 = H5Tcopy(H5T_C_S1); - CHECK(tid4, FAIL, "H5Tcopy"); - ret = H5Tset_size(tid4, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Create an enum type */ - tid3 = H5Tenum_create(H5T_STD_I32LE); - val = 0; - ret = H5Tenum_insert(tid3, "RED", &val); - CHECK(ret, FAIL, "H5Tenum_insert"); - val = 1; - ret = H5Tenum_insert(tid3, "BLUE", &val); - CHECK(ret, FAIL, "H5Tenum_insert"); - val = 2; - ret = H5Tenum_insert(tid3, "GREEN", &val); - CHECK(ret, FAIL, "H5Tenum_insert"); - - /* Create the first layer compound type */ - tid5 = H5Tcreate(H5T_COMPOUND, sizeof(s2)); - CHECK(tid5, FAIL, "H5Tcreate"); - /* Insert fields */ - ret = H5Tinsert(tid5, "string", HOFFSET(s2, string), tid4); - CHECK(ret, FAIL, "H5Tinsert"); - /* Insert fields */ - ret = H5Tinsert(tid5, "enumerate", HOFFSET(s2, color), tid3); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create a VL datatype of first layer compound type */ - tid1 = H5Tvlen_create(tid5); - CHECK(tid1, FAIL, "H5Tvlen_create"); - - /* Create the base compound type */ - tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1)); - CHECK(tid2, FAIL, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid2, "v", HOFFSET(s1, v), tid1); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Modify dataset creation properties, i.e. enable chunking */ - cparms = H5Pcreate(H5P_DATASET_CREATE); - ret = H5Pset_chunk(cparms, SPACE1_RANK, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid2, sid1, H5P_DEFAULT, cparms, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Extend the dataset. This call assures that dataset is 4.*/ - ret = H5Dset_extent(dataset, size); - CHECK(ret, FAIL, "H5Dset_extent"); - - /* Select a hyperslab */ - filespace = H5Dget_space(dataset); - ret = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offset, NULL, dims1, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid2, sid1, filespace, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Fflush(fid1, H5F_SCOPE_GLOBAL); - CHECK(ret, FAIL, "H5Fflush"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close disk dataspace */ - ret = H5Sclose(filespace); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close datatype */ - ret = H5Tclose(tid4); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid5); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid3); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close Property list */ - ret = H5Pclose(cparms); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dset2 = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dset2, FAIL, "H5Dopen2"); - - /* Get the data type */ - tid2 = H5Dget_type(dset2); - CHECK(tid2, FAIL, "H5Dget_type"); - - /* Read dataset from disk */ - ret = H5Dread(dset2, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].v.len != rdata[i].v.len) { - TestErrPrintf("%d: VL data length don't match!, wdata[%d].v.len=%d, rdata[%d].v.len=%d\n", - __LINE__, (int)i, (int)wdata[i].v.len, (int)i, (int)rdata[i].v.len); - continue; - } /* end if */ - - for (t1 = (s2 *)(wdata[i].v.p), t2 = (s2 *)(rdata[i].v.p), j = 0; j < rdata[i].v.len; - j++, t1++, t2++) { - if (strcmp(t1->string, t2->string) != 0) { - TestErrPrintf("VL data values don't match!, t1->string=%s, t2->string=%s\n", t1->string, - t2->string); - continue; - } /* end if */ - if (t1->color != t2->color) { - TestErrPrintf("VL data values don't match!, t1->color=%d, t2->color=%d\n", t1->color, - t2->color); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Reclaim the VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Use this part for new data */ - strcpy(str, "bbbbbbbb\0"); - for (i = 0; i < SPACE1_DIM1; i++) { - wdata2[i].v.p = (s2 *)malloc((i + 1) * sizeof(s2)); - wdata2[i].v.len = i + 1; - for (t1 = (s2 *)(wdata2[i].v).p, j = 0; j < i + 1; j++, t1++) { - strcat(str, "pp"); - t1->string = (char *)malloc(strlen(str) * sizeof(char) + 1); - strcpy(t1->string, str); - t1->color = green; - } - } /* end for */ - - /* Select a hyperslab */ - filespace2 = H5Dget_space(dset2); - ret = H5Sselect_hyperslab(filespace2, H5S_SELECT_SET, offset, NULL, dims1, NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create dataspace for datasets */ - sid2 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Write dataset to disk */ - ret = H5Dwrite(dset2, tid2, sid2, filespace2, H5P_DEFAULT, &wdata2); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read dataset from disk */ - ret = H5Dread(dset2, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata2); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata2[i].v.len != rdata2[i].v.len) { - TestErrPrintf("%d: VL data length don't match!, wdata2[%d].v.len=%d, rdata2[%d].v.len=%d\n", - __LINE__, (int)i, (int)wdata2[i].v.len, (int)i, (int)rdata2[i].v.len); - continue; - } /* end if */ - - for (t1 = (s2 *)(wdata2[i].v.p), t2 = (s2 *)(rdata2[i].v.p), j = 0; j < rdata2[i].v.len; - j++, t1++, t2++) { - if (strcmp(t1->string, t2->string) != 0) { - TestErrPrintf("VL data values don't match!, t1->string=%s, t2->string=%s\n", t1->string, - t2->string); - continue; - } /* end if */ - if (t1->color != t2->color) { - TestErrPrintf("VL data values don't match!, t1->color=%d, t2->color=%d\n", t1->color, - t2->color); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, wdata2); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Reclaim the VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, rdata2); - CHECK(ret, FAIL, "H5Treclaim"); - - ret = H5Dclose(dset2); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close disk dataspace */ - ret = H5Sclose(filespace2); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); -} /* end test_vltypes_compound_vlstr() */ - -/**************************************************************** -** -** test_vltypes_compound_vlen_atomic(): Test basic VL datatype code. -** Tests compound datatypes with VL datatypes of atomic datatypes. -** -****************************************************************/ -static void -test_vltypes_compound_vlen_atomic(void) -{ - typedef struct { /* Struct that the VL sequences are composed of */ - int i; - float f; - hvl_t v; - } s1; - s1 wdata[SPACE1_DIM1]; /* Information to write */ - s1 rdata[SPACE1_DIM1]; /* Information read in */ - s1 fill; /* Fill value */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1, tid2; /* Datatype IDs */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hid_t dcpl_pid; /* Dataset creation property list ID */ - hsize_t dims1[] = {SPACE1_DIM1}; - hsize_t size; /* Number of bytes which will be used */ - unsigned i, j; /* counting variables */ - size_t mem_used = 0; /* Memory used during allocation */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing Compound Datatypes with VL Atomic Datatype Component Functionality\n")); - - /* Allocate and initialize VL data to write */ - for (i = 0; i < SPACE1_DIM1; i++) { - wdata[i].i = (int)(i * 10); - wdata[i].f = (float)(i * 20) / 3.0F; - wdata[i].v.p = malloc((i + 1) * sizeof(unsigned int)); - wdata[i].v.len = i + 1; - for (j = 0; j < (i + 1); j++) - ((unsigned int *)wdata[i].v.p)[j] = i * 10 + j; - } /* end for */ - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a VL datatype to refer to */ - tid1 = H5Tvlen_create(H5T_NATIVE_UINT); - CHECK(tid1, FAIL, "H5Tvlen_create"); - - /* Create the base compound type */ - tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1)); - CHECK(tid2, FAIL, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - ret = H5Tinsert(tid2, "v", HOFFSET(s1, v), tid1); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid2, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dataset, tid2, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* 10 elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - VERIFY(size, ((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(unsigned int), "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid2, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* 10 elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - VERIFY(mem_used, ((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(unsigned int), "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].i != rdata[i].i) { - TestErrPrintf("Integer components don't match!, wdata[%d].i=%d, rdata[%d].i=%d\n", (int)i, - (int)wdata[i].i, (int)i, (int)rdata[i].i); - continue; - } /* end if */ - if (!H5_FLT_ABS_EQUAL(wdata[i].f, rdata[i].f)) { - TestErrPrintf("Float components don't match!, wdata[%d].f=%f, rdata[%d].f=%f\n", (int)i, - (double)wdata[i].f, (int)i, (double)rdata[i].f); - continue; - } /* end if */ - if (wdata[i].v.len != rdata[i].v.len) { - TestErrPrintf("%d: VL data length don't match!, wdata[%d].v.len=%d, rdata[%d].v.len=%d\n", - __LINE__, (int)i, (int)wdata[i].v.len, (int)i, (int)rdata[i].v.len); - continue; - } /* end if */ - for (j = 0; j < rdata[i].v.len; j++) { - if (((unsigned int *)wdata[i].v.p)[j] != ((unsigned int *)rdata[i].v.p)[j]) { - TestErrPrintf("VL data values don't match!, wdata[%d].v.p[%d]=%d, rdata[%d].v.p[%d]=%d\n", - (int)i, (int)j, (int)((unsigned int *)wdata[i].v.p)[j], (int)i, (int)j, - (int)((unsigned int *)rdata[i].v.p)[j]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Reclaim the VL data */ - ret = H5Treclaim(tid2, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a second dataset, with a fill value */ - dcpl_pid = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl_pid, FAIL, "H5Pcreate"); - - /* Set the fill value for the second dataset */ - memset(&fill, 0, sizeof(s1)); - ret = H5Pset_fill_value(dcpl_pid, tid2, &fill); - CHECK(ret, FAIL, "H5Pset_fill_value"); - - dataset = H5Dcreate2(fid1, "Dataset2", tid2, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Close dataset creation property list */ - ret = H5Pclose(dcpl_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Read from dataset before writing data */ - ret = H5Dread(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Check data read in */ - for (i = 0; i < SPACE1_DIM1; i++) - if (rdata[i].i != 0 || !H5_FLT_ABS_EQUAL(rdata[i].f, 0.0F) || rdata[i].v.len != 0 || - rdata[i].v.p != NULL) - TestErrPrintf( - "VL doesn't match!, rdata[%d].i=%d, rdata[%d].f=%f, rdata[%d].v.len=%u, rdata[%d].v.p=%p\n", - (int)i, rdata[i].i, (int)i, (double)rdata[i].f, (int)i, (unsigned)rdata[i].v.len, (int)i, - rdata[i].v.p); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].i != rdata[i].i) { - TestErrPrintf("Integer components don't match!, wdata[%d].i=%d, rdata[%d].i=%d\n", (int)i, - (int)wdata[i].i, (int)i, (int)rdata[i].i); - continue; - } /* end if */ - if (!H5_FLT_ABS_EQUAL(wdata[i].f, rdata[i].f)) { - TestErrPrintf("Float components don't match!, wdata[%d].f=%f, rdata[%d].f=%f\n", (int)i, - (double)wdata[i].f, (int)i, (double)rdata[i].f); - continue; - } /* end if */ - if (wdata[i].v.len != rdata[i].v.len) { - TestErrPrintf("%d: VL data length don't match!, wdata[%d].v.len=%d, rdata[%d].v.len=%d\n", - __LINE__, (int)i, (int)wdata[i].v.len, (int)i, (int)rdata[i].v.len); - continue; - } /* end if */ - for (j = 0; j < rdata[i].v.len; j++) { - if (((unsigned int *)wdata[i].v.p)[j] != ((unsigned int *)rdata[i].v.p)[j]) { - TestErrPrintf("VL data values don't match!, wdata[%d].v.p[%d]=%d, rdata[%d].v.p[%d]=%d\n", - (int)i, (int)j, (int)((unsigned int *)wdata[i].v.p)[j], (int)i, (int)j, - (int)((unsigned int *)rdata[i].v.p)[j]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Reclaim the VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_vltypes_compound_vlen_atomic() */ - -/**************************************************************** -** -** rewrite_vltypes_compound_vlen_atomic(): Check memory leak for -** basic VL datatype code. -** Check memory leak for compound datatypes with VL datatypes -** of atomic datatypes. -** -****************************************************************/ -static void -rewrite_vltypes_compound_vlen_atomic(void) -{ - typedef struct { /* Struct that the VL sequences are composed of */ - int i; - float f; - hvl_t v; - } s1; - s1 wdata[SPACE1_DIM1]; /* Information to write */ - s1 rdata[SPACE1_DIM1]; /* Information read in */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1, tid2; /* Datatype IDs */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t size; /* Number of bytes which will be used */ - unsigned i, j; /* counting variables */ - size_t mem_used = 0; /* Memory used during allocation */ - unsigned increment = 4; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, - ("Checking memory leak for compound datatype with VL Atomic Datatype Component Functionality\n")); - - /* Allocate and initialize VL data to write */ - for (i = 0; i < SPACE1_DIM1; i++) { - wdata[i].i = (int)(i * 40); - wdata[i].f = (float)(i * 50) / 3.0F; - wdata[i].v.p = malloc((i + increment) * sizeof(unsigned int)); - wdata[i].v.len = i + increment; - for (j = 0; j < (i + increment); j++) - ((unsigned int *)wdata[i].v.p)[j] = i * 60 + j; - } /* end for */ - - /* Create file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Create a VL datatype to refer to */ - tid1 = H5Tvlen_create(H5T_NATIVE_UINT); - CHECK(tid1, FAIL, "H5Tvlen_create"); - - /* Create the base compound type */ - tid2 = H5Tcreate(H5T_COMPOUND, sizeof(s1)); - CHECK(tid2, FAIL, "H5Tcreate"); - - /* Insert fields */ - ret = H5Tinsert(tid2, "i", HOFFSET(s1, i), H5T_NATIVE_INT); - CHECK(ret, FAIL, "H5Tinsert"); - ret = H5Tinsert(tid2, "f", HOFFSET(s1, f), H5T_NATIVE_FLOAT); - CHECK(ret, FAIL, "H5Tinsert"); - ret = H5Tinsert(tid2, "v", HOFFSET(s1, v), tid1); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Create a dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Create dataspace for datasets */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory will be used */ - ret = H5Dvlen_get_buf_size(dataset, tid2, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* 22 elements allocated = 4+5+6+7 elements for each array position */ - VERIFY(size, 22 * sizeof(unsigned int), "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid2, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* 22 elements allocated = 4+5+6+7 elements for each array position */ - VERIFY(mem_used, 22 * sizeof(unsigned int), "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].i != rdata[i].i) { - TestErrPrintf("Integer components don't match!, wdata[%d].i=%d, rdata[%d].i=%d\n", (int)i, - (int)wdata[i].i, (int)i, (int)rdata[i].i); - continue; - } /* end if */ - if (!H5_FLT_ABS_EQUAL(wdata[i].f, rdata[i].f)) { - TestErrPrintf("Float components don't match!, wdata[%d].f=%f, rdata[%d].f=%f\n", (int)i, - (double)wdata[i].f, (int)i, (double)rdata[i].f); - continue; - } /* end if */ - if (wdata[i].v.len != rdata[i].v.len) { - TestErrPrintf("%d: VL data length don't match!, wdata[%d].v.len=%d, rdata[%d].v.len=%d\n", - __LINE__, (int)i, (int)wdata[i].v.len, (int)i, (int)rdata[i].v.len); - continue; - } /* end if */ - for (j = 0; j < rdata[i].v.len; j++) { - if (((unsigned int *)wdata[i].v.p)[j] != ((unsigned int *)rdata[i].v.p)[j]) { - TestErrPrintf("VL data values don't match!, wdata[%d].v.p[%d]=%d, rdata[%d].v.p[%d]=%d\n", - (int)i, (int)j, (int)((unsigned int *)wdata[i].v.p)[j], (int)i, (int)j, - (int)((unsigned int *)rdata[i].v.p)[j]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - - /* Reclaim the VL data */ - ret = H5Treclaim(tid2, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end rewrite_vltypes_compound_vlen_atomic() */ - -/**************************************************************** -** -** vlen_size_func(): Test basic VL datatype code. -** Tests VL datatype with VL datatypes of atomic datatypes. -** -****************************************************************/ -static size_t -vlen_size_func(unsigned long n) -{ - size_t u = 1; - size_t tmp = 1; - size_t result = 1; - - while (u < n) { - u++; - tmp += u; - result += tmp; - } - return (result); -} - -/**************************************************************** -** -** test_vltypes_vlen_vlen_atomic(): Test basic VL datatype code. -** Tests VL datatype with VL datatypes of atomic datatypes. -** -****************************************************************/ -static void -test_vltypes_vlen_vlen_atomic(void) -{ - hvl_t wdata[SPACE1_DIM1]; /* Information to write */ - hvl_t rdata[SPACE1_DIM1]; /* Information read in */ - hvl_t *t1, *t2; /* Temporary pointer to VL information */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid1, tid2; /* Datatype IDs */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t dims1[] = {SPACE1_DIM1}; - hsize_t size; /* Number of bytes which will be used */ - unsigned i, j, k; /* counting variables */ - size_t mem_used = 0; /* Memory used during allocation */ - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Testing VL Datatypes with VL Atomic Datatype Component Functionality\n")); - - /* Allocate and initialize VL data to write */ - for (i = 0; i < SPACE1_DIM1; i++) { - wdata[i].p = malloc((i + 1) * sizeof(hvl_t)); - if (wdata[i].p == NULL) { - TestErrPrintf("Cannot allocate memory for VL data! i=%u\n", i); - return; - } /* end if */ - wdata[i].len = i + 1; - for (t1 = (hvl_t *)(wdata[i].p), j = 0; j < (i + 1); j++, t1++) { - t1->p = malloc((j + 1) * sizeof(unsigned int)); - if (t1->p == NULL) { - TestErrPrintf("Cannot allocate memory for VL data! i=%u, j=%u\n", i, j); - return; - } /* end if */ - t1->len = j + 1; - for (k = 0; k < (j + 1); k++) - ((unsigned int *)t1->p)[k] = i * 100 + j * 10 + k; - } /* end for */ - } /* end for */ - - /* Create file */ - fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fcreate"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a VL datatype to refer to */ - tid1 = H5Tvlen_create(H5T_NATIVE_UINT); - CHECK(tid1, FAIL, "H5Tvlen_create"); - - /* Create the base VL type */ - tid2 = H5Tvlen_create(tid1); - CHECK(tid2, FAIL, "H5Tvlen_create"); - - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset1", tid2, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dcreate2"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Create dataspace for datasets */ - sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); - CHECK(sid1, FAIL, "H5Screate_simple"); - - /* Create a VL datatype to refer to */ - tid1 = H5Tvlen_create(H5T_NATIVE_UINT); - CHECK(tid1, FAIL, "H5Tvlen_create"); - - /* Create the base VL type */ - tid2 = H5Tvlen_create(tid1); - CHECK(tid2, FAIL, "H5Tvlen_create"); - - /* Open a dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory was used */ - ret = H5Dvlen_get_buf_size(dataset, tid2, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* 10 hvl_t elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - /* 20 unsigned int elements allocated = 1 + 3 + 6 + 10 elements */ - VERIFY(size, - (hsize_t)(((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(hvl_t) + - vlen_size_func((unsigned long)SPACE1_DIM1) * sizeof(unsigned int)), - "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid2, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* 10 hvl_t elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - /* 20 unsigned int elements allocated = 1 + 3 + 6 + 10 elements */ - VERIFY(mem_used, - (size_t)(((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(hvl_t) + - vlen_size_func((unsigned long)SPACE1_DIM1) * sizeof(unsigned int)), - "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].len != rdata[i].len) { - TestErrPrintf("%d: VL data length don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n", __LINE__, - (int)i, (int)wdata[i].len, (int)i, (int)rdata[i].len); - continue; - } /* end if */ - for (t1 = (hvl_t *)wdata[i].p, t2 = (hvl_t *)(rdata[i].p), j = 0; j < rdata[i].len; j++, t1++, t2++) { - if (t1->len != t2->len) { - TestErrPrintf("%d: VL data length don't match!, i=%d, j=%d, t1->len=%d, t2->len=%d\n", - __LINE__, (int)i, (int)j, (int)t1->len, (int)t2->len); - continue; - } /* end if */ - for (k = 0; k < t2->len; k++) { - if (((unsigned int *)t1->p)[k] != ((unsigned int *)t2->p)[k]) { - TestErrPrintf("VL data values don't match!, t1->p[%d]=%d, t2->p[%d]=%d\n", (int)k, - (int)((unsigned int *)t1->p)[k], (int)k, (int)((unsigned int *)t2->p)[k]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - } /* end for */ - - /* Reclaim all the (nested) VL data */ - ret = H5Treclaim(tid2, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close datatype */ - ret = H5Tclose(tid1); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end test_vltypes_vlen_vlen_atomic() */ - -/**************************************************************** -** -** rewrite_longer_vltypes_vlen_vlen_atomic(): Test basic VL datatype code. -** Tests VL datatype with VL datatypes of atomic datatypes. -** -****************************************************************/ -static void -rewrite_longer_vltypes_vlen_vlen_atomic(void) -{ - hvl_t wdata[SPACE1_DIM1]; /* Information to write */ - hvl_t rdata[SPACE1_DIM1]; /* Information read in */ - hvl_t *t1, *t2; /* Temporary pointer to VL information */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid2; /* Datatype IDs */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t size; /* Number of bytes which will be used */ - unsigned i, j, k; /* counting variables */ - size_t mem_used = 0; /* Memory used during allocation */ - unsigned increment = 1; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Check memory leak for VL Datatypes with VL Atomic Datatype Component Functionality\n")); - - /* Allocate and initialize VL data to write */ - for (i = 0; i < SPACE1_DIM1; i++) { - wdata[i].p = malloc((i + increment) * sizeof(hvl_t)); - if (wdata[i].p == NULL) { - TestErrPrintf("Cannot allocate memory for VL data! i=%u\n", i); - return; - } /* end if */ - wdata[i].len = i + increment; - for (t1 = (hvl_t *)(wdata[i].p), j = 0; j < (i + increment); j++, t1++) { - t1->p = malloc((j + 1) * sizeof(unsigned int)); - if (t1->p == NULL) { - TestErrPrintf("Cannot allocate memory for VL data! i=%u, j=%u\n", i, j); - return; - } /* end if */ - t1->len = j + 1; - for (k = 0; k < (j + 1); k++) - ((unsigned int *)t1->p)[k] = i * 1000 + j * 100 + k * 10; - } /* end for */ - } /* end for */ - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get dataspace for datasets */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Open datatype of the dataset */ - tid2 = H5Dget_type(dataset); - CHECK(tid2, FAIL, "H5Dget_type"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open the file for data checking */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open a dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get dataspace for datasets */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Get datatype for dataset */ - tid2 = H5Dget_type(dataset); - CHECK(tid2, FAIL, "H5Dget_type"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory was used */ - ret = H5Dvlen_get_buf_size(dataset, tid2, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* 18 hvl_t elements allocated = 3 + 4 + 5 + 6 elements for each array position */ - /* 52 unsigned int elements allocated = 6 + 10 + 15 + 21 elements */ - /*VERIFY(size, 18 * sizeof(hvl_t) + 52 * sizeof(unsigned int), "H5Dvlen_get_buf_size");*/ - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid2, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* 18 hvl_t elements allocated = 3+4+5+6elements for each array position */ - /* 52 unsigned int elements allocated = 6+10+15+21 elements */ - /*VERIFY(mem_used,18*sizeof(hvl_t)+52*sizeof(unsigned int),"H5Dread");*/ - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].len != rdata[i].len) { - TestErrPrintf("%d: VL data length don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n", __LINE__, - (int)i, (int)wdata[i].len, (int)i, (int)rdata[i].len); - continue; - } /* end if */ - for (t1 = (hvl_t *)(wdata[i].p), t2 = (hvl_t *)(rdata[i].p), j = 0; j < rdata[i].len; - j++, t1++, t2++) { - if (t1->len != t2->len) { - TestErrPrintf("%d: VL data length don't match!, i=%d, j=%d, t1->len=%d, t2->len=%d\n", - __LINE__, (int)i, (int)j, (int)t1->len, (int)t2->len); - continue; - } /* end if */ - for (k = 0; k < t2->len; k++) { - if (((unsigned int *)t1->p)[k] != ((unsigned int *)t2->p)[k]) { - TestErrPrintf("VL data values don't match!, t1->p[%d]=%d, t2->p[%d]=%d\n", (int)k, - (int)((unsigned int *)t1->p)[k], (int)k, (int)((unsigned int *)t2->p)[k]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - } /* end for */ - - /* Reclaim all the (nested) VL data */ - ret = H5Treclaim(tid2, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end rewrite_longer_vltypes_vlen_vlen_atomic() */ - -/**************************************************************** -** -** rewrite_shorter_vltypes_vlen_vlen_atomic(): Test basic VL datatype code. -** Tests VL datatype with VL datatypes of atomic datatypes. -** -****************************************************************/ -static void -rewrite_shorter_vltypes_vlen_vlen_atomic(void) -{ - hvl_t wdata[SPACE1_DIM1]; /* Information to write */ - hvl_t rdata[SPACE1_DIM1]; /* Information read in */ - hvl_t *t1, *t2; /* Temporary pointer to VL information */ - hid_t fid1; /* HDF5 File IDs */ - hid_t dataset; /* Dataset ID */ - hid_t sid1; /* Dataspace ID */ - hid_t tid2; /* Datatype IDs */ - hid_t xfer_pid; /* Dataset transfer property list ID */ - hsize_t size; /* Number of bytes which will be used */ - unsigned i, j, k; /* counting variables */ - size_t mem_used = 0; /* Memory used during allocation */ - unsigned increment = 1; - herr_t ret; /* Generic return value */ - - /* Output message about test being performed */ - MESSAGE(5, ("Check memory leak for VL Datatypes with VL Atomic Datatype Component Functionality\n")); - - /* Allocate and initialize VL data to write */ - for (i = 0; i < SPACE1_DIM1; i++) { - wdata[i].p = malloc((i + increment) * sizeof(hvl_t)); - if (wdata[i].p == NULL) { - TestErrPrintf("Cannot allocate memory for VL data! i=%u\n", i); - return; - } /* end if */ - wdata[i].len = i + increment; - for (t1 = (hvl_t *)(wdata[i].p), j = 0; j < (i + increment); j++, t1++) { - t1->p = malloc((j + 1) * sizeof(unsigned int)); - if (t1->p == NULL) { - TestErrPrintf("Cannot allocate memory for VL data! i=%u, j=%u\n", i, j); - return; - } /* end if */ - t1->len = j + 1; - for (k = 0; k < (j + 1); k++) - ((unsigned int *)t1->p)[k] = i * 100000 + j * 1000 + k * 10; - } /* end for */ - } /* end for */ - - /* Open file */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open the dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get dataspace for datasets */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Open datatype of the dataset */ - tid2 = H5Dget_type(dataset); - CHECK(tid2, FAIL, "H5Dget_type"); - - /* Write dataset to disk */ - ret = H5Dwrite(dataset, tid2, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open the file for data checking */ - fid1 = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(fid1, FAIL, "H5Fopen"); - - /* Open a dataset */ - dataset = H5Dopen2(fid1, "Dataset1", H5P_DEFAULT); - CHECK(dataset, FAIL, "H5Dopen2"); - - /* Get dataspace for datasets */ - sid1 = H5Dget_space(dataset); - CHECK(sid1, FAIL, "H5Dget_space"); - - /* Get datatype for dataset */ - tid2 = H5Dget_type(dataset); - CHECK(tid2, FAIL, "H5Dget_type"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Make certain the correct amount of memory was used */ - ret = H5Dvlen_get_buf_size(dataset, tid2, sid1, &size); - CHECK(ret, FAIL, "H5Dvlen_get_buf_size"); - - /* 10 hvl_t elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - /* 20 unsigned int elements allocated = 1 + 3 + 6 + 10 elements */ - VERIFY(size, - (hsize_t)(((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(hvl_t) + - vlen_size_func((unsigned long)SPACE1_DIM1) * sizeof(unsigned int)), - "H5Dvlen_get_buf_size"); - - /* Read dataset from disk */ - ret = H5Dread(dataset, tid2, H5S_ALL, H5S_ALL, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Dread"); - - /* Make certain the correct amount of memory has been used */ - /* 10 hvl_t elements allocated = 1 + 2 + 3 + 4 elements for each array position */ - /* 20 unsigned int elements allocated = 1 + 3 + 6 + 10 elements */ - VERIFY(mem_used, - (size_t)(((SPACE1_DIM1 * (SPACE1_DIM1 + 1)) / 2) * sizeof(hvl_t) + - vlen_size_func((unsigned long)SPACE1_DIM1) * sizeof(unsigned int)), - "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < SPACE1_DIM1; i++) { - if (wdata[i].len != rdata[i].len) { - TestErrPrintf("%d: VL data length don't match!, wdata[%d].len=%d, rdata[%d].len=%d\n", __LINE__, - (int)i, (int)wdata[i].len, (int)i, (int)rdata[i].len); - continue; - } /* end if */ - for (t1 = (hvl_t *)(wdata[i].p), t2 = (hvl_t *)(rdata[i].p), j = 0; j < rdata[i].len; - j++, t1++, t2++) { - if (t1->len != t2->len) { - TestErrPrintf("%d: VL data length don't match!, i=%d, j=%d, t1->len=%d, t2->len=%d\n", - __LINE__, (int)i, (int)j, (int)t1->len, (int)t2->len); - continue; - } /* end if */ - for (k = 0; k < t2->len; k++) { - if (((unsigned int *)t1->p)[k] != ((unsigned int *)t2->p)[k]) { - TestErrPrintf("VL data values don't match!, t1->p[%d]=%d, t2->p[%d]=%d\n", (int)k, - (int)((unsigned int *)t1->p)[k], (int)k, (int)((unsigned int *)t2->p)[k]); - continue; - } /* end if */ - } /* end for */ - } /* end for */ - } /* end for */ - - /* Reclaim all the (nested) VL data */ - ret = H5Treclaim(tid2, sid1, xfer_pid, rdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Make certain the VL memory has been freed */ - VERIFY(mem_used, 0, "H5Treclaim"); - - /* Reclaim the write VL data */ - ret = H5Treclaim(tid2, sid1, H5P_DEFAULT, wdata); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close datatype */ - ret = H5Tclose(tid2); - CHECK(ret, FAIL, "H5Tclose"); - - /* Close disk dataspace */ - ret = H5Sclose(sid1); - CHECK(ret, FAIL, "H5Sclose"); - - /* Close dataset transfer property list */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - /* Close file */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); - -} /* end rewrite_shorter_vltypes_vlen_vlen_atomic() */ - -/**************************************************************** -** -** test_vltypes_fill_value(): Test fill value for VL data. -** One tests data space isn't allocated; another tests data -** space is allocated. -** -****************************************************************/ -static void -test_vltypes_fill_value(void) -{ - typedef struct dtype1_struct { - unsigned int gui; - unsigned int pgui; - const char *str_id; - const char *str_name; - const char *str_desc; - const char *str_orig; - const char *str_stat; - unsigned int ver; - double val; - double ma; - double mi; - const char *str_form; - const char *str_unit; - } dtype1_struct; - - herr_t ret; - hid_t file_id; - hid_t dtype1_id = -1; - hid_t str_id = -1; - hid_t small_dspace_id; /* Dataspace ID for small datasets */ - hid_t large_dspace_id; /* Dataspace ID for large datasets */ - hid_t small_select_dspace_id; /* Dataspace ID for selection in small datasets */ - hid_t large_select_dspace_id; /* Dataspace ID for selection in large datasets */ - hid_t dset_dspace_id = -1; /* Dataspace ID for a particular dataset */ - hid_t dset_select_dspace_id = -1; /* Dataspace ID for selection in a particular dataset */ - hid_t scalar_dspace_id; /* Dataspace ID for scalar dataspace */ - hid_t single_dspace_id; /* Dataspace ID for single element selection */ - hsize_t single_offset[] = {2}; /* Offset of single element selection */ - hsize_t single_block[] = {1}; /* Block size of single element selection */ - hsize_t select_offset[] = {0}; /* Offset of non-contiguous element selection */ - hsize_t select_stride[] = {2}; /* Stride size of non-contiguous element selection */ - hsize_t small_select_count[] = {SPACE4_DIM_SMALL / - 2}; /* Count of small non-contiguous element selection */ - hsize_t large_select_count[] = {SPACE4_DIM_LARGE / - 2}; /* Count of large non-contiguous element selection */ - hsize_t select_block[] = {1}; /* Block size of non-contiguous element selection */ - hid_t dcpl_id, xfer_pid; - hid_t dset_id; - hsize_t small_dims[] = {SPACE4_DIM_SMALL}; - hsize_t large_dims[] = {SPACE4_DIM_LARGE}; - size_t dset_elmts = 0; /* Number of elements in a particular dataset */ - const dtype1_struct fill1 = {1, 2, "foobar", "", NULL, "\0", "dead", - 3, 4.0, 100.0, 1.0, "liquid", "meter"}; - const dtype1_struct wdata = {3, 4, "", NULL, "\0", "foo", "two", 6, 8.0, 200.0, 2.0, "solid", "yard"}; - dtype1_struct *rbuf = NULL; /* Buffer for reading data */ - size_t mem_used = 0; /* Memory used during allocation */ - H5D_layout_t layout; /* Dataset storage layout */ - char dset_name1[64], dset_name2[64]; /* Dataset names */ - unsigned i; - - /* Output message about test being performed */ - MESSAGE(5, ("Check fill value for VL data\n")); - - /* Create a string datatype */ - str_id = H5Tcopy(H5T_C_S1); - CHECK(str_id, FAIL, "H5Tcopy"); - ret = H5Tset_size(str_id, H5T_VARIABLE); - CHECK(ret, FAIL, "H5Tset_size"); - - /* Create a compound data type */ - dtype1_id = H5Tcreate(H5T_COMPOUND, sizeof(struct dtype1_struct)); - CHECK(dtype1_id, FAIL, "H5Tcreate"); - - ret = H5Tinsert(dtype1_id, "guid", HOFFSET(struct dtype1_struct, gui), H5T_NATIVE_UINT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "pguid", HOFFSET(struct dtype1_struct, pgui), H5T_NATIVE_UINT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "str_id", HOFFSET(dtype1_struct, str_id), str_id); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "str_name", HOFFSET(dtype1_struct, str_name), str_id); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "str_desc", HOFFSET(dtype1_struct, str_desc), str_id); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "str_orig", HOFFSET(dtype1_struct, str_orig), str_id); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "str_stat", HOFFSET(dtype1_struct, str_stat), str_id); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "ver", HOFFSET(struct dtype1_struct, ver), H5T_NATIVE_UINT); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "val", HOFFSET(struct dtype1_struct, val), H5T_NATIVE_DOUBLE); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "ma", HOFFSET(struct dtype1_struct, ma), H5T_NATIVE_DOUBLE); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "mi", HOFFSET(struct dtype1_struct, mi), H5T_NATIVE_DOUBLE); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "str_form", HOFFSET(dtype1_struct, str_form), str_id); - CHECK(ret, FAIL, "H5Tinsert"); - - ret = H5Tinsert(dtype1_id, "str_unit", HOFFSET(dtype1_struct, str_unit), str_id); - CHECK(ret, FAIL, "H5Tinsert"); - - /* Close string datatype */ - ret = H5Tclose(str_id); - CHECK(ret, FAIL, "H5Tclose"); - - /* Allocate space for the buffer to read data */ - rbuf = (dtype1_struct *)malloc(SPACE4_DIM_LARGE * sizeof(dtype1_struct)); - CHECK_PTR(rbuf, "malloc"); - - /* Create the small & large dataspaces to use */ - small_dspace_id = H5Screate_simple(SPACE4_RANK, small_dims, NULL); - CHECK(small_dspace_id, FAIL, "H5Screate_simple"); - - large_dspace_id = H5Screate_simple(SPACE4_RANK, large_dims, NULL); - CHECK(large_dspace_id, FAIL, "H5Screate_simple"); - - /* Create small & large dataspaces w/non-contiguous selections */ - small_select_dspace_id = H5Scopy(small_dspace_id); - CHECK(small_select_dspace_id, FAIL, "H5Scopy"); - - ret = H5Sselect_hyperslab(small_select_dspace_id, H5S_SELECT_SET, select_offset, select_stride, - small_select_count, select_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - large_select_dspace_id = H5Scopy(large_dspace_id); - CHECK(large_select_dspace_id, FAIL, "H5Scopy"); - - ret = H5Sselect_hyperslab(large_select_dspace_id, H5S_SELECT_SET, select_offset, select_stride, - large_select_count, select_block); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Create a scalar dataspace */ - scalar_dspace_id = H5Screate(H5S_SCALAR); - CHECK(scalar_dspace_id, FAIL, "H5Screate"); - - /* Create dataset create property list and set the fill value */ - dcpl_id = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl_id, FAIL, "H5Pcreate"); - - ret = H5Pset_fill_value(dcpl_id, dtype1_id, &fill1); - CHECK(ret, FAIL, "H5Pset_fill_value"); - - /* Create the file */ - file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fcreate"); - - /* Create datasets with different storage layouts */ - for (layout = H5D_COMPACT; layout <= H5D_CHUNKED; layout++) { - unsigned compress_loop; /* # of times to run loop, for testing compressed chunked dataset */ - unsigned test_loop; /* Loop over datasets */ - -#ifdef H5_HAVE_FILTER_DEFLATE - if (layout == H5D_CHUNKED) - compress_loop = 2; - else -#endif /* H5_HAVE_FILTER_DEFLATE */ - compress_loop = 1; - - /* Loop over dataset operations */ - for (test_loop = 0; test_loop < compress_loop; test_loop++) { - hid_t tmp_dcpl_id; /* Temporary copy of the dataset creation property list */ - - /* Make a copy of the dataset creation property list */ - tmp_dcpl_id = H5Pcopy(dcpl_id); - CHECK(tmp_dcpl_id, FAIL, "H5Pcopy"); - - /* Layout specific actions */ - switch (layout) { - case H5D_COMPACT: - strcpy(dset_name1, "dataset1-compact"); - strcpy(dset_name2, "dataset2-compact"); - dset_dspace_id = small_dspace_id; - ret = H5Pset_layout(tmp_dcpl_id, H5D_COMPACT); - CHECK(ret, FAIL, "H5Pset_layout"); - break; - - case H5D_CONTIGUOUS: - strcpy(dset_name1, "dataset1-contig"); - strcpy(dset_name2, "dataset2-contig"); - dset_dspace_id = large_dspace_id; - break; - - case H5D_CHUNKED: { - hsize_t chunk_dims[1] = {SPACE4_DIM_LARGE / 4}; - - dset_dspace_id = large_dspace_id; - ret = H5Pset_chunk(tmp_dcpl_id, 1, chunk_dims); - CHECK(ret, FAIL, "H5Pset_chunk"); -#ifdef H5_HAVE_FILTER_DEFLATE - if (test_loop == 1) { - strcpy(dset_name1, "dataset1-chunked-compressed"); - strcpy(dset_name2, "dataset2-chunked-compressed"); - ret = H5Pset_deflate(tmp_dcpl_id, 3); - CHECK(ret, FAIL, "H5Pset_deflate"); - } /* end if */ - else { -#endif /* H5_HAVE_FILTER_DEFLATE */ - strcpy(dset_name1, "dataset1-chunked"); - strcpy(dset_name2, "dataset2-chunked"); -#ifdef H5_HAVE_FILTER_DEFLATE - } /* end else */ -#endif /* H5_HAVE_FILTER_DEFLATE */ - } break; - - case H5D_VIRTUAL: - assert(0 && "Invalid layout type!"); - break; - - case H5D_LAYOUT_ERROR: - case H5D_NLAYOUTS: - default: - assert(0 && "Unknown layout type!"); - break; - } /* end switch */ - - /* Create first data set with default setting - no space is allocated */ - dset_id = H5Dcreate2(file_id, dset_name1, dtype1_id, dset_dspace_id, H5P_DEFAULT, tmp_dcpl_id, - H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate2"); - - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Create a second data set with space allocated and fill value written */ - ret = H5Pset_fill_time(tmp_dcpl_id, H5D_FILL_TIME_IFSET); - CHECK(ret, FAIL, "H5Pset_fill_time"); - - ret = H5Pset_alloc_time(tmp_dcpl_id, H5D_ALLOC_TIME_EARLY); - CHECK(ret, FAIL, "H5Pset_alloc_time"); - - dset_id = H5Dcreate2(file_id, dset_name2, dtype1_id, dset_dspace_id, H5P_DEFAULT, tmp_dcpl_id, - H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dcreate2"); - - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close temporary DCPL */ - ret = H5Pclose(tmp_dcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - } /* end for */ - } /* end for */ - - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - - ret = H5Pclose(dcpl_id); - CHECK(ret, FAIL, "H5Pclose"); - - /* Change to the custom memory allocation routines for reading VL data */ - xfer_pid = H5Pcreate(H5P_DATASET_XFER); - CHECK(xfer_pid, FAIL, "H5Pcreate"); - - ret = H5Pset_vlen_mem_manager(xfer_pid, test_vltypes_alloc_custom, &mem_used, test_vltypes_free_custom, - &mem_used); - CHECK(ret, FAIL, "H5Pset_vlen_mem_manager"); - - /* Open the file to check data set value */ - file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fopen"); - - /* Read empty datasets with different storage layouts */ - for (layout = H5D_COMPACT; layout <= H5D_CHUNKED; layout++) { - unsigned compress_loop; /* # of times to run loop, for testing compressed chunked dataset */ - unsigned test_loop; /* Loop over datasets */ - -#ifdef H5_HAVE_FILTER_DEFLATE - if (layout == H5D_CHUNKED) - compress_loop = 2; - else -#endif /* H5_HAVE_FILTER_DEFLATE */ - compress_loop = 1; - - /* Loop over dataset operations */ - for (test_loop = 0; test_loop < compress_loop; test_loop++) { - - /* Layout specific actions */ - switch (layout) { - case H5D_COMPACT: - strcpy(dset_name1, "dataset1-compact"); - strcpy(dset_name2, "dataset2-compact"); - dset_dspace_id = small_dspace_id; - dset_select_dspace_id = small_select_dspace_id; - dset_elmts = SPACE4_DIM_SMALL; - break; - - case H5D_CONTIGUOUS: - strcpy(dset_name1, "dataset1-contig"); - strcpy(dset_name2, "dataset2-contig"); - dset_dspace_id = large_dspace_id; - dset_select_dspace_id = large_select_dspace_id; - dset_elmts = SPACE4_DIM_LARGE; - break; - - case H5D_CHUNKED: -#ifdef H5_HAVE_FILTER_DEFLATE - if (test_loop == 1) { - strcpy(dset_name1, "dataset1-chunked-compressed"); - strcpy(dset_name2, "dataset2-chunked-compressed"); - } /* end if */ - else { -#endif /* H5_HAVE_FILTER_DEFLATE */ - strcpy(dset_name1, "dataset1-chunked"); - strcpy(dset_name2, "dataset2-chunked"); -#ifdef H5_HAVE_FILTER_DEFLATE - } /* end else */ -#endif /* H5_HAVE_FILTER_DEFLATE */ - dset_dspace_id = large_dspace_id; - dset_select_dspace_id = large_select_dspace_id; - dset_elmts = SPACE4_DIM_LARGE; - break; - - case H5D_VIRTUAL: - assert(0 && "Invalid layout type!"); - break; - - case H5D_LAYOUT_ERROR: - case H5D_NLAYOUTS: - default: - assert(0 && "Unknown layout type!"); - break; - } /* end switch */ - - /* Open first data set */ - dset_id = H5Dopen2(file_id, dset_name1, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dopen2"); - - /* Read in the entire 'empty' dataset of fill value */ - ret = H5Dread(dset_id, dtype1_id, dset_dspace_id, dset_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < dset_elmts; i++) { - if (strcmp(rbuf[i].str_id, "foobar") != 0 || strcmp(rbuf[i].str_name, "") != 0 || - rbuf[i].str_desc || strcmp(rbuf[i].str_orig, "\0") != 0 || - strcmp(rbuf[i].str_stat, "dead") != 0 || strcmp(rbuf[i].str_form, "liquid") != 0 || - strcmp(rbuf[i].str_unit, "meter") != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i) = %d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end for */ - - /* Release the space */ - ret = H5Treclaim(dtype1_id, dset_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Clear the read buffer */ - memset(rbuf, 0, dset_elmts * sizeof(dtype1_struct)); - - /* Read in non-contiguous selection from 'empty' dataset of fill value */ - ret = H5Dread(dset_id, dtype1_id, dset_select_dspace_id, dset_select_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < dset_elmts; i++) { - if ((i % 2) == select_offset[0]) { - if (strcmp(rbuf[i].str_id, "foobar") != 0 || strcmp(rbuf[i].str_name, "") != 0 || - rbuf[i].str_desc || strcmp(rbuf[i].str_orig, "\0") != 0 || - strcmp(rbuf[i].str_stat, "dead") != 0 || strcmp(rbuf[i].str_form, "liquid") != 0 || - strcmp(rbuf[i].str_unit, "meter") != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i) = %d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end if */ - else { - if (rbuf[i].str_id || rbuf[i].str_name || rbuf[i].str_desc || rbuf[i].str_orig || - rbuf[i].str_stat || rbuf[i].str_form || rbuf[i].str_unit) { - TestErrPrintf("%d: VL data doesn't match!, index(i) = %d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end else */ - } /* end for */ - - /* Release the space */ - ret = H5Treclaim(dtype1_id, dset_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Treclaim"); - - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open the second data set to check the value of data */ - dset_id = H5Dopen2(file_id, dset_name2, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dopen2"); - - /* Read in the entire 'empty' dataset of fill value */ - ret = H5Dread(dset_id, dtype1_id, dset_dspace_id, dset_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < dset_elmts; i++) { - if (strcmp(rbuf[i].str_id, "foobar") != 0 || strcmp(rbuf[i].str_name, "") != 0 || - rbuf[i].str_desc || strcmp(rbuf[i].str_orig, "\0") != 0 || - strcmp(rbuf[i].str_stat, "dead") != 0 || strcmp(rbuf[i].str_form, "liquid") != 0 || - strcmp(rbuf[i].str_unit, "meter") != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i)=%d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end for */ - - /* Release the space */ - ret = H5Treclaim(dtype1_id, dset_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Clear the read buffer */ - memset(rbuf, 0, dset_elmts * sizeof(dtype1_struct)); - - /* Read in non-contiguous selection from 'empty' dataset of fill value */ - ret = H5Dread(dset_id, dtype1_id, dset_select_dspace_id, dset_select_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < dset_elmts; i++) { - if ((i % 2) == select_offset[0]) { - if (strcmp(rbuf[i].str_id, "foobar") != 0 || strcmp(rbuf[i].str_name, "") != 0 || - rbuf[i].str_desc || strcmp(rbuf[i].str_orig, "\0") != 0 || - strcmp(rbuf[i].str_stat, "dead") != 0 || strcmp(rbuf[i].str_form, "liquid") != 0 || - strcmp(rbuf[i].str_unit, "meter") != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i) = %d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end if */ - else { - if (rbuf[i].str_id || rbuf[i].str_name || rbuf[i].str_desc || rbuf[i].str_orig || - rbuf[i].str_stat || rbuf[i].str_form || rbuf[i].str_unit) { - TestErrPrintf("%d: VL data doesn't match!, index(i) = %d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end else */ - } /* end for */ - - /* Release the space */ - ret = H5Treclaim(dtype1_id, dset_select_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Treclaim"); - - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - } /* end for */ - } /* end for */ - - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Open the file to check data set value */ - file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); - CHECK(file_id, FAIL, "H5Fopen"); - - /* Write one element & fill values to datasets with different storage layouts */ - for (layout = H5D_COMPACT; layout <= H5D_CHUNKED; layout++) { - unsigned compress_loop; /* # of times to run loop, for testing compressed chunked dataset */ - unsigned test_loop; /* Loop over datasets */ - -#ifdef H5_HAVE_FILTER_DEFLATE - if (layout == H5D_CHUNKED) - compress_loop = 2; - else -#endif /* H5_HAVE_FILTER_DEFLATE */ - compress_loop = 1; - - /* Loop over dataset operations */ - for (test_loop = 0; test_loop < compress_loop; test_loop++) { - - /* Layout specific actions */ - switch (layout) { - case H5D_COMPACT: - strcpy(dset_name1, "dataset1-compact"); - strcpy(dset_name2, "dataset2-compact"); - dset_dspace_id = small_dspace_id; - dset_select_dspace_id = small_select_dspace_id; - dset_elmts = SPACE4_DIM_SMALL; - break; - - case H5D_CONTIGUOUS: - strcpy(dset_name1, "dataset1-contig"); - strcpy(dset_name2, "dataset2-contig"); - dset_dspace_id = large_dspace_id; - dset_select_dspace_id = large_select_dspace_id; - dset_elmts = SPACE4_DIM_LARGE; - break; - - case H5D_CHUNKED: -#ifdef H5_HAVE_FILTER_DEFLATE - if (test_loop == 1) { - strcpy(dset_name1, "dataset1-chunked-compressed"); - strcpy(dset_name2, "dataset2-chunked-compressed"); - } /* end if */ - else { -#endif /* H5_HAVE_FILTER_DEFLATE */ - strcpy(dset_name1, "dataset1-chunked"); - strcpy(dset_name2, "dataset2-chunked"); -#ifdef H5_HAVE_FILTER_DEFLATE - } /* end else */ -#endif /* H5_HAVE_FILTER_DEFLATE */ - dset_dspace_id = large_dspace_id; - dset_select_dspace_id = large_select_dspace_id; - dset_elmts = SPACE4_DIM_LARGE; - break; - - case H5D_VIRTUAL: - assert(0 && "Invalid layout type!"); - break; - - case H5D_LAYOUT_ERROR: - case H5D_NLAYOUTS: - default: - assert(0 && "Unknown layout type!"); - break; - } /* end switch */ - - /* Copy the dataset's dataspace */ - single_dspace_id = H5Scopy(dset_dspace_id); - CHECK(single_dspace_id, FAIL, "H5Scopy"); - - /* Set a single element in the dataspace */ - ret = H5Sselect_hyperslab(single_dspace_id, H5S_SELECT_SET, single_offset, NULL, single_block, - NULL); - CHECK(ret, FAIL, "H5Sselect_hyperslab"); - - /* Open first data set */ - dset_id = H5Dopen2(file_id, dset_name1, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dopen2"); - - /* Write one element in the dataset */ - ret = H5Dwrite(dset_id, dtype1_id, scalar_dspace_id, single_dspace_id, xfer_pid, &wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Dread(dset_id, dtype1_id, dset_dspace_id, dset_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < dset_elmts; i++) { - if (i == single_offset[0]) { - if (strcmp(rbuf[i].str_id, wdata.str_id) != 0 || rbuf[i].str_name || - strcmp(rbuf[i].str_desc, wdata.str_desc) != 0 || - strcmp(rbuf[i].str_orig, wdata.str_orig) != 0 || - strcmp(rbuf[i].str_stat, wdata.str_stat) != 0 || - strcmp(rbuf[i].str_form, wdata.str_form) != 0 || - strcmp(rbuf[i].str_unit, wdata.str_unit) != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i)=%d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end if */ - else { - if (strcmp(rbuf[i].str_id, "foobar") != 0 || strcmp(rbuf[i].str_name, "") != 0 || - rbuf[i].str_desc || strcmp(rbuf[i].str_orig, "\0") != 0 || - strcmp(rbuf[i].str_stat, "dead") != 0 || strcmp(rbuf[i].str_form, "liquid") != 0 || - strcmp(rbuf[i].str_unit, "meter") != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i)=%d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end if */ - } /* end for */ - - /* Release the space */ - ret = H5Treclaim(dtype1_id, dset_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Clear the read buffer */ - memset(rbuf, 0, dset_elmts * sizeof(dtype1_struct)); - - /* Read in non-contiguous selection from dataset */ - ret = H5Dread(dset_id, dtype1_id, dset_select_dspace_id, dset_select_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < dset_elmts; i++) { - if (i == single_offset[0]) { - if (strcmp(rbuf[i].str_id, wdata.str_id) != 0 || rbuf[i].str_name || - strcmp(rbuf[i].str_desc, wdata.str_desc) != 0 || - strcmp(rbuf[i].str_orig, wdata.str_orig) != 0 || - strcmp(rbuf[i].str_stat, wdata.str_stat) != 0 || - strcmp(rbuf[i].str_form, wdata.str_form) != 0 || - strcmp(rbuf[i].str_unit, wdata.str_unit) != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i)=%d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end if */ - else { - if ((i % 2) == select_offset[0]) { - if (strcmp(rbuf[i].str_id, "foobar") != 0 || strcmp(rbuf[i].str_name, "") != 0 || - rbuf[i].str_desc || strcmp(rbuf[i].str_orig, "\0") != 0 || - strcmp(rbuf[i].str_stat, "dead") != 0 || - strcmp(rbuf[i].str_form, "liquid") != 0 || - strcmp(rbuf[i].str_unit, "meter") != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i) = %d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end if */ - else { - if (rbuf[i].str_id || rbuf[i].str_name || rbuf[i].str_desc || rbuf[i].str_orig || - rbuf[i].str_stat || rbuf[i].str_form || rbuf[i].str_unit) { - TestErrPrintf("%d: VL data doesn't match!, index(i) = %d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end else */ - } /* end else */ - } /* end for */ - - /* Release the space */ - ret = H5Treclaim(dtype1_id, dset_select_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Treclaim"); - - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Open the second data set to check the value of data */ - dset_id = H5Dopen2(file_id, dset_name2, H5P_DEFAULT); - CHECK(dset_id, FAIL, "H5Dopen2"); - - /* Write one element in the dataset */ - ret = H5Dwrite(dset_id, dtype1_id, scalar_dspace_id, single_dspace_id, xfer_pid, &wdata); - CHECK(ret, FAIL, "H5Dwrite"); - - ret = H5Dread(dset_id, dtype1_id, dset_dspace_id, dset_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < dset_elmts; i++) { - if (i == single_offset[0]) { - if (strcmp(rbuf[i].str_id, wdata.str_id) != 0 || rbuf[i].str_name || - strcmp(rbuf[i].str_desc, wdata.str_desc) != 0 || - strcmp(rbuf[i].str_orig, wdata.str_orig) != 0 || - strcmp(rbuf[i].str_stat, wdata.str_stat) != 0 || - strcmp(rbuf[i].str_form, wdata.str_form) != 0 || - strcmp(rbuf[i].str_unit, wdata.str_unit) != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i)=%d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end if */ - else { - if (strcmp(rbuf[i].str_id, "foobar") != 0 || strcmp(rbuf[i].str_name, "") != 0 || - rbuf[i].str_desc || strcmp(rbuf[i].str_orig, "\0") != 0 || - strcmp(rbuf[i].str_stat, "dead") != 0 || strcmp(rbuf[i].str_form, "liquid") != 0 || - strcmp(rbuf[i].str_unit, "meter") != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i)=%d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end if */ - } /* end for */ - - /* Release the space */ - ret = H5Treclaim(dtype1_id, dset_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Treclaim"); - - /* Clear the read buffer */ - memset(rbuf, 0, dset_elmts * sizeof(dtype1_struct)); - - /* Read in non-contiguous selection from dataset */ - ret = H5Dread(dset_id, dtype1_id, dset_select_dspace_id, dset_select_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Dread"); - - /* Compare data read in */ - for (i = 0; i < dset_elmts; i++) { - if (i == single_offset[0]) { - if (strcmp(rbuf[i].str_id, wdata.str_id) != 0 || rbuf[i].str_name || - strcmp(rbuf[i].str_desc, wdata.str_desc) != 0 || - strcmp(rbuf[i].str_orig, wdata.str_orig) != 0 || - strcmp(rbuf[i].str_stat, wdata.str_stat) != 0 || - strcmp(rbuf[i].str_form, wdata.str_form) != 0 || - strcmp(rbuf[i].str_unit, wdata.str_unit) != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i)=%d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end if */ - else { - if ((i % 2) == select_offset[0]) { - if (strcmp(rbuf[i].str_id, "foobar") != 0 || strcmp(rbuf[i].str_name, "") != 0 || - rbuf[i].str_desc || strcmp(rbuf[i].str_orig, "\0") != 0 || - strcmp(rbuf[i].str_stat, "dead") != 0 || - strcmp(rbuf[i].str_form, "liquid") != 0 || - strcmp(rbuf[i].str_unit, "meter") != 0) { - TestErrPrintf("%d: VL data doesn't match!, index(i) = %d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end if */ - else { - if (rbuf[i].str_id || rbuf[i].str_name || rbuf[i].str_desc || rbuf[i].str_orig || - rbuf[i].str_stat || rbuf[i].str_form || rbuf[i].str_unit) { - TestErrPrintf("%d: VL data doesn't match!, index(i) = %d\n", __LINE__, (int)i); - continue; - } /* end if */ - } /* end else */ - } /* end else */ - } /* end for */ - - /* Release the space */ - ret = H5Treclaim(dtype1_id, dset_select_dspace_id, xfer_pid, rbuf); - CHECK(ret, FAIL, "H5Treclaim"); - - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - - /* Close the dataspace for the writes */ - ret = H5Sclose(single_dspace_id); - CHECK(ret, FAIL, "H5Sclose"); - } /* end for */ - } /* end for */ - - ret = H5Fclose(file_id); - CHECK(ret, FAIL, "H5Fclose"); - - /* Clean up rest of IDs */ - ret = H5Pclose(xfer_pid); - CHECK(ret, FAIL, "H5Pclose"); - - ret = H5Sclose(small_dspace_id); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(large_dspace_id); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(small_select_dspace_id); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(large_select_dspace_id); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Sclose(scalar_dspace_id); - CHECK(ret, FAIL, "H5Sclose"); - - ret = H5Tclose(dtype1_id); - CHECK(ret, FAIL, "H5Tclose"); - - /* Release buffer */ - free(rbuf); -} /* end test_vltypes_fill_value() */ - -/**************************************************************** -** -** test_vltypes(): Main VL datatype testing routine. -** -****************************************************************/ -void -test_vltypes(void) -{ - /* Output message about test being performed */ - MESSAGE(5, ("Testing Variable-Length Datatypes\n")); - - /* These next tests use the same file */ - test_vltypes_dataset_create(); /* Check dataset of VL when fill value - * won't be rewritten to it.*/ - test_vltypes_funcs(); /* Test functions with VL types */ - test_vltypes_vlen_atomic(); /* Test VL atomic datatypes */ - rewrite_vltypes_vlen_atomic(); /* Check VL memory leak */ - test_vltypes_vlen_compound(); /* Test VL compound datatypes */ - rewrite_vltypes_vlen_compound(); /* Check VL memory leak */ - test_vltypes_compound_vlen_atomic(); /* Test compound datatypes with VL atomic components */ - rewrite_vltypes_compound_vlen_atomic(); /* Check VL memory leak */ - test_vltypes_vlen_vlen_atomic(); /* Test VL datatype with VL atomic components */ - rewrite_longer_vltypes_vlen_vlen_atomic(); /*overwrite with VL data of longer sequence*/ - rewrite_shorter_vltypes_vlen_vlen_atomic(); /*overwrite with VL data of shorted sequence*/ - test_vltypes_compound_vlen_vlen(); /* Test compound datatypes with VL atomic components */ - test_vltypes_compound_vlstr(); /* Test data rewritten of nested VL data */ - test_vltypes_fill_value(); /* Test fill value for VL data */ -} /* test_vltypes() */ - -/*------------------------------------------------------------------------- - * Function: cleanup_vltypes - * - * Purpose: Cleanup temporary test files - * - * Return: none - *------------------------------------------------------------------------- - */ -void -cleanup_vltypes(void) -{ - H5Fdelete(FILENAME, H5P_DEFAULT); -} diff --git a/test/h5test.c b/test/h5test.c index ef580cf..8efebd7 100644 --- a/test/h5test.c +++ b/test/h5test.c @@ -2068,6 +2068,86 @@ error: } /* end h5_check_if_file_locking_enabled() */ /*------------------------------------------------------------------------- + * Function: h5_using_native_vol + * + * Purpose: Checks if the VOL connector being used is (or the VOL + * connector stack being used resolves to) the native VOL + * connector. Either or both of fapl_id and obj_id may be + * provided, but checking of obj_id takes precedence. + * H5I_INVALID_HID should be specified for the parameter that + * is not provided. + * + * obj_id must be the ID of an HDF5 object that is accessed + * with the VOL connector to check. If obj_id is provided, the + * entire VOL connector stack is checked to see if it resolves + * to the native VOL connector. If only fapl_id is provided, + * only the top-most VOL connector set on fapl_id is checked + * against the native VOL connector. + * + * The HDF5_VOL_CONNECTOR environment variable is not checked + * here, as that only overrides the setting for the default + * File Access Property List, which may not be the File Access + * Property List used for accessing obj_id. There is also + * complexity in determining whether the connector stack + * resolves to the native VOL connector when the only + * information available is a string. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +h5_using_native_vol(hid_t fapl_id, hid_t obj_id, bool *is_native_vol) +{ + hbool_t is_native = false; + hid_t native_id = H5I_INVALID_HID; + hid_t vol_id = H5I_INVALID_HID; + herr_t ret_value = SUCCEED; + + assert((fapl_id >= 0) || (obj_id >= 0)); + assert(is_native_vol); + + if (fapl_id == H5P_DEFAULT) + fapl_id = H5P_FILE_ACCESS_DEFAULT; + + if (obj_id >= 0) { + if (H5VLobject_is_native(obj_id, &is_native) < 0) { + ret_value = FAIL; + goto done; + } + } + else { + if (true != H5VLis_connector_registered_by_value(H5VL_NATIVE_VALUE)) { + ret_value = FAIL; + goto done; + } + + if ((native_id = H5VLget_connector_id_by_value(H5VL_NATIVE_VALUE)) < 0) { + ret_value = FAIL; + goto done; + } + + if (H5Pget_vol_id(fapl_id, &vol_id) < 0) { + ret_value = FAIL; + goto done; + } + + if (vol_id == native_id) + is_native = true; + } + + *is_native_vol = is_native; + +done: + if (vol_id != H5I_INVALID_HID) + H5VLclose(vol_id); + if (native_id != H5I_INVALID_HID) + H5VLclose(native_id); + + return ret_value; +} + +/*------------------------------------------------------------------------- * Function: h5_using_default_driver * * Purpose: Checks if the specified VFD name matches the library's @@ -2104,7 +2184,7 @@ h5_using_default_driver(const char *drv_name) * which are not currently supported for parallel HDF5, such * as writing of VL or region reference datatypes. * - * Return: true/false + * Return: Non-negative on success/Negative on failure * *------------------------------------------------------------------------- */ diff --git a/test/h5test.h b/test/h5test.h index 8bba077..8115207 100644 --- a/test/h5test.h +++ b/test/h5test.h @@ -290,6 +290,7 @@ H5TEST_DLL const char *h5_get_version_string(H5F_libver_t libver); H5TEST_DLL int h5_compare_file_bytes(char *fname1, char *fname2); H5TEST_DLL int h5_duplicate_file_by_bytes(const char *orig, const char *dest); H5TEST_DLL herr_t h5_check_if_file_locking_enabled(bool *are_enabled); +H5TEST_DLL herr_t h5_using_native_vol(hid_t fapl_id, hid_t obj_id, bool *is_native_vol); H5TEST_DLL bool h5_using_default_driver(const char *drv_name); H5TEST_DLL herr_t h5_using_parallel_driver(hid_t fapl_id, bool *driver_is_parallel); H5TEST_DLL herr_t h5_driver_is_default_vfd_compatible(hid_t fapl_id, bool *default_vfd_compatible); diff --git a/test/tarray.c b/test/tarray.c index 494b65c..09f300d 100644 --- a/test/tarray.c +++ b/test/tarray.c @@ -1918,6 +1918,7 @@ test_compat(void) size_t off; /* Offset of compound field */ hid_t mtid; /* Datatype ID for field */ int i; /* Index variables */ + bool vol_is_native; bool driver_is_default_compatible; herr_t ret; /* Generic return value */ @@ -1934,17 +1935,26 @@ test_compat(void) * the tarrold.h5 file. */ - if (h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible) < 0) - TestErrPrintf("can't check if VFD is default VFD compatible\n"); - if (!driver_is_default_compatible) { - printf(" -- SKIPPED --\n"); - return; - } - /* Open the testfile */ fid1 = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); CHECK_I(fid1, "H5Fopen"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid1, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid1), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Check if VFD used is native file format compatible */ + CHECK(h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible), FAIL, + "h5_driver_is_default_vfd_compatible"); + if (!driver_is_default_compatible) { + CHECK(H5Fclose(fid1), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Only try to proceed if the file is around */ if (fid1 >= 0) { /* Open the first dataset (with no array fields) */ diff --git a/test/tattr.c b/test/tattr.c index 2e391c5..d38fdaa 100644 --- a/test/tattr.c +++ b/test/tattr.c @@ -197,16 +197,24 @@ test_attr_basic_write(hid_t fapl) hsize_t dims3[] = {ATTR2_DIM1, ATTR2_DIM2}; int read_data1[ATTR1_DIM1] = {0}; /* Buffer for reading 1st attribute */ int i; + bool vol_is_native; hid_t ret_id; /* Generic hid_t return value */ herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Basic Scalar Attribute Writing Functions\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create file */ fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(fid1, FAIL, "H5Fcreate"); + CHECK(h5_using_native_vol(fapl, fid1, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Create dataspace for dataset */ sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); CHECK(sid1, FAIL, "H5Screate_simple"); @@ -267,9 +275,11 @@ test_attr_basic_write(hid_t fapl) ret = H5Awrite(attr2, H5T_NATIVE_INT, attr_data1a); CHECK(ret, FAIL, "H5Awrite"); - /* Check storage size for attribute */ - attr_size = H5Aget_storage_size(attr); - VERIFY(attr_size, (ATTR1_DIM1 * sizeof(int)), "H5A_get_storage_size"); + if (vol_is_native) { + /* Check storage size for attribute */ + attr_size = H5Aget_storage_size(attr); + VERIFY(attr_size, (ATTR1_DIM1 * sizeof(int)), "H5A_get_storage_size"); + } /* Read attribute information immediately, without closing attribute */ ret = H5Aread(attr, H5T_NATIVE_INT, read_data1); @@ -388,9 +398,11 @@ test_attr_basic_write(hid_t fapl) attr = H5Acreate2(group, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check storage size for attribute */ - attr_size = H5Aget_storage_size(attr); - VERIFY(attr_size, (ATTR2_DIM1 * ATTR2_DIM2 * sizeof(int)), "H5Aget_storage_size"); + if (vol_is_native) { + /* Check storage size for attribute */ + attr_size = H5Aget_storage_size(attr); + VERIFY(attr_size, (ATTR2_DIM1 * ATTR2_DIM2 * sizeof(int)), "H5Aget_storage_size"); + } /* Try to create the same attribute again (should fail) */ H5E_BEGIN_TRY @@ -404,9 +416,11 @@ test_attr_basic_write(hid_t fapl) ret = H5Awrite(attr, H5T_NATIVE_INT, attr_data2); CHECK(ret, FAIL, "H5Awrite"); - /* Check storage size for attribute */ - attr_size = H5Aget_storage_size(attr); - VERIFY(attr_size, (ATTR2_DIM1 * ATTR2_DIM2 * sizeof(int)), "H5A_get_storage_size"); + if (vol_is_native) { + /* Check storage size for attribute */ + attr_size = H5Aget_storage_size(attr); + VERIFY(attr_size, (ATTR2_DIM1 * ATTR2_DIM2 * sizeof(int)), "H5A_get_storage_size"); + } /* Close attribute */ ret = H5Aclose(attr); @@ -537,6 +551,12 @@ test_attr_flush(hid_t fapl) /* Output message about test being performed */ MESSAGE(5, ("Testing Attribute Flushing\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_FILL_VALUES) || + !(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_MORE)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + fil = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(fil, FAIL, "H5Fcreate"); @@ -728,6 +748,11 @@ test_attr_compound_write(hid_t fapl) /* Output message about test being performed */ MESSAGE(5, ("Testing Multiple Attribute Functions\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create file */ fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(fid1, FAIL, "H5Fcreate"); @@ -970,6 +995,11 @@ test_attr_scalar_write(hid_t fapl) /* Output message about test being performed */ MESSAGE(5, ("Testing Basic Attribute Functions\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create file */ fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(fid1, FAIL, "H5Fcreate"); @@ -1113,6 +1143,11 @@ test_attr_mult_write(hid_t fapl) /* Output message about test being performed */ MESSAGE(5, ("Testing Multiple Attribute Functions\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create file */ fid1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(fid1, FAIL, "H5Fcreate"); @@ -1578,6 +1613,11 @@ test_attr_delete(hid_t fapl) /* Output message about test being performed */ MESSAGE(5, ("Testing Basic Attribute Deletion Functions\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Open file */ fid1 = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); CHECK(fid1, FAIL, "H5Fopen"); @@ -1694,33 +1734,45 @@ test_attr_delete(hid_t fapl) static void test_attr_dtype_shared(hid_t fapl) { - hid_t file_id; /* File ID */ - hid_t dset_id; /* Dataset ID */ - hid_t space_id; /* Dataspace ID for dataset & attribute */ - hid_t type_id; /* Datatype ID for named datatype */ - hid_t attr_id; /* Attribute ID */ - int data = 8; /* Data to write */ - int rdata = 0; /* Read read in */ - H5O_info2_t oinfo; /* Object's information */ - h5_stat_size_t empty_filesize; /* Size of empty file */ - h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + hid_t file_id; /* File ID */ + hid_t dset_id; /* Dataset ID */ + hid_t space_id; /* Dataspace ID for dataset & attribute */ + hid_t type_id; /* Datatype ID for named datatype */ + hid_t attr_id; /* Attribute ID */ + int data = 8; /* Data to write */ + int rdata = 0; /* Read read in */ + H5O_info2_t oinfo; /* Object's information */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ + h5_stat_size_t filesize; /* Size of file after modifications */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Shared Datatypes with Attributes\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || + !(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create a file */ file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(file_id, FAIL, "H5Fopen"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, file_id, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(file_id); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -1854,9 +1906,11 @@ test_attr_dtype_shared(hid_t fapl) ret = H5Fclose(file_id); CHECK(ret, FAIL, "H5Fclose"); - /* Check size of file */ - filesize = h5_get_file_size(FILENAME, fapl); - VERIFY(filesize, empty_filesize, "h5_get_file_size"); + if (vol_is_native) { + /* Check size of file */ + filesize = h5_get_file_size(FILENAME, fapl); + VERIFY(filesize, empty_filesize, "h5_get_file_size"); + } } /* test_attr_dtype_shared() */ /**************************************************************** @@ -2194,25 +2248,36 @@ test_attr_dense_create(hid_t fcpl, hid_t fapl) unsigned min_dense; /* Minimum # of attributes to store "densely" */ htri_t is_dense; /* Are attributes stored densely? */ unsigned u; /* Local index variable */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Dense Attribute Storage Creation\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create file */ fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -2244,9 +2309,11 @@ test_attr_dense_create(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add attributes, until just before converting to dense storage */ for (u = 0; u < max_compact; u++) { @@ -2264,9 +2331,11 @@ test_attr_dense_create(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); } /* end for */ - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add one more attribute, to push into "dense" storage */ /* Create attribute */ @@ -2274,9 +2343,11 @@ test_attr_dense_create(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Write data into the attribute */ ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); @@ -2310,7 +2381,7 @@ test_attr_dense_create(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -2336,9 +2407,10 @@ test_attr_dense_open(hid_t fcpl, hid_t fapl) unsigned min_dense; /* Minimum # of attributes to store "densely" */ htri_t is_dense; /* Are attributes stored densely? */ unsigned u; /* Local index variable */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Opening Attributes in Dense Storage\n")); @@ -2347,14 +2419,19 @@ test_attr_dense_open(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -2390,9 +2467,11 @@ test_attr_dense_open(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add attributes, until just before converting to dense storage */ for (u = 0; u < max_compact; u++) { @@ -2414,9 +2493,11 @@ test_attr_dense_open(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "test_attr_dense_verify"); } /* end for */ - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add one more attribute, to push into "dense" storage */ /* Create attribute */ @@ -2424,9 +2505,11 @@ test_attr_dense_open(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Write data into the attribute */ ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); @@ -2456,7 +2539,7 @@ test_attr_dense_open(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -2482,10 +2565,11 @@ test_attr_dense_delete(hid_t fcpl, hid_t fapl) unsigned min_dense; /* Minimum # of attributes to store "densely" */ htri_t is_dense; /* Are attributes stored densely? */ unsigned u; /* Local index variable */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ H5O_info2_t oinfo; /* Object info */ int use_min_dset_oh = (dcpl_g != H5P_DEFAULT); + bool vol_is_native; herr_t ret; /* Generic return value */ /* Only run this test for sec2/default driver */ @@ -2509,14 +2593,19 @@ test_attr_dense_delete(hid_t fcpl, hid_t fapl) if (use_min_dset_oh) CHECK(H5Pclose(fcpl), FAIL, "H5Pclose"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -2552,9 +2641,11 @@ test_attr_dense_delete(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add attributes, until well into dense storage */ for (u = 0; u < (max_compact * 2); u++) { @@ -2577,9 +2668,11 @@ test_attr_dense_delete(hid_t fcpl, hid_t fapl) VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info3"); } /* end for */ - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Close dataspace */ ret = H5Sclose(sid); @@ -2613,18 +2706,22 @@ test_attr_dense_delete(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "test_attr_dense_verify"); } /* end for */ - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Delete one more attribute, which should cause reversion to compact storage */ snprintf(attrname, sizeof(attrname), "attr %02u", u); ret = H5Adelete(dataset, attrname); CHECK(ret, FAIL, "H5Adelete"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Verify attributes still left */ ret = test_attr_dense_verify(dataset, (u - 1)); @@ -2635,9 +2732,11 @@ test_attr_dense_delete(hid_t fcpl, hid_t fapl) ret = H5Adelete(dataset, attrname); CHECK(ret, FAIL, "H5Adelete"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Verify attributes still left */ ret = test_attr_dense_verify(dataset, (u - 2)); @@ -2655,7 +2754,7 @@ test_attr_dense_delete(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -2681,13 +2780,14 @@ test_attr_dense_rename(hid_t fcpl, hid_t fapl) unsigned max_compact; /* Maximum # of attributes to store compactly */ unsigned min_dense; /* Minimum # of attributes to store "densely" */ htri_t is_dense; /* Are attributes stored densely? */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ H5O_info2_t oinfo; /* Object info */ unsigned u; /* Local index variable */ int use_min_dset_oh = (dcpl_g != H5P_DEFAULT); unsigned use_corder; /* Track creation order or not */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Only run this test for sec2/default driver */ if (!h5_using_default_driver(NULL)) @@ -2710,14 +2810,19 @@ test_attr_dense_rename(hid_t fcpl, hid_t fapl) if (use_min_dset_oh) CHECK(H5Pclose(fcpl), FAIL, "H5Pclose"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -2753,9 +2858,11 @@ test_attr_dense_rename(hid_t fcpl, hid_t fapl) dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add attributes, until well into dense storage */ for (u = 0; u < (max_compact * 2); u++) { @@ -2785,9 +2892,11 @@ test_attr_dense_rename(hid_t fcpl, hid_t fapl) VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info3"); } /* end for */ - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Close Dataset */ ret = H5Dclose(dataset); @@ -2852,7 +2961,7 @@ test_attr_dense_rename(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -2878,11 +2987,12 @@ test_attr_dense_unlink(hid_t fcpl, hid_t fapl) unsigned min_dense; /* Minimum # of attributes to store "densely" */ htri_t is_dense; /* Are attributes stored densely? */ size_t mesg_count; /* # of shared messages */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ H5O_info2_t oinfo; /* Object info */ unsigned u; /* Local index variable */ int use_min_dset_oh = (dcpl_g != H5P_DEFAULT); + bool vol_is_native; herr_t ret; /* Generic return value */ /* Only run this test for sec2/default driver */ @@ -2906,12 +3016,17 @@ test_attr_dense_unlink(hid_t fcpl, hid_t fapl) if (use_min_dset_oh) CHECK(H5Pclose(fcpl), FAIL, "H5Pclose"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -2943,9 +3058,11 @@ test_attr_dense_unlink(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add attributes, until well into dense storage */ for (u = 0; u < (max_compact * 2); u++) { @@ -2968,9 +3085,11 @@ test_attr_dense_unlink(hid_t fcpl, hid_t fapl) VERIFY(oinfo.num_attrs, (u + 1), "H5Oget_info3"); } /* end for */ - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Close dataspace */ ret = H5Sclose(sid); @@ -2992,16 +3111,18 @@ test_attr_dense_unlink(hid_t fcpl, hid_t fapl) ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); CHECK(ret, FAIL, "H5Ldelete"); - /* Check on dataset's attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); + CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); + VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); + } /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -3027,9 +3148,10 @@ test_attr_dense_limits(hid_t fcpl, hid_t fapl) unsigned min_dense, rmin_dense; /* Minimum # of attributes to store "densely" */ htri_t is_dense; /* Are attributes stored densely? */ unsigned u; /* Local index variable */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Phase Change Limits For Attributes in Dense Storage\n")); @@ -3038,14 +3160,19 @@ test_attr_dense_limits(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -3085,9 +3212,11 @@ test_attr_dense_limits(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add first attribute, which should be immediately in dense storage */ @@ -3105,9 +3234,11 @@ test_attr_dense_limits(hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Add second attribute, to allow deletions to be checked easily */ @@ -3125,9 +3256,11 @@ test_attr_dense_limits(hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Delete second attribute, attributes should still be stored densely */ @@ -3135,9 +3268,11 @@ test_attr_dense_limits(hid_t fcpl, hid_t fapl) ret = H5Adelete(dataset, attrname); CHECK(ret, FAIL, "H5Adelete"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Delete first attribute, attributes should not be stored densely */ @@ -3147,9 +3282,11 @@ test_attr_dense_limits(hid_t fcpl, hid_t fapl) ret = H5Adelete(dataset, attrname); CHECK(ret, FAIL, "H5Adelete"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Close dataspace */ ret = H5Sclose(sid); @@ -3167,7 +3304,7 @@ test_attr_dense_limits(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -3199,7 +3336,8 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) unsigned min_dense; /* Minimum # of attributes to store "densely" */ htri_t is_dense; /* Are attributes stored densely? */ unsigned u, i; /* Local index variable */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing operations with two IDs for Dense Storage\n")); @@ -3211,6 +3349,9 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); @@ -3245,9 +3386,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add attributes, until just before converting to dense storage */ for (u = 0; u < max_compact; u++) { @@ -3265,9 +3408,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); } /* end for */ - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add one more attribute, to push into "dense" storage */ /* Create dataspace for attribute */ @@ -3279,9 +3424,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Open the attribute just created and get a second ID */ attr2 = H5Aopen(dataset, attrname, H5P_DEFAULT); @@ -3314,9 +3461,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); CHECK(dataset, FAIL, "H5Dopen2"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Open first attribute for the dataset */ attr = H5Aopen(dataset, attrname, H5P_DEFAULT); @@ -3366,9 +3515,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); CHECK(dataset, FAIL, "H5Dopen2"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Open first attribute for the dataset */ attr = H5Aopen(dataset, attrname, H5P_DEFAULT); @@ -3429,9 +3580,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); CHECK(dataset, FAIL, "H5Dopen2"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Open first attribute for the dataset */ attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)4, H5P_DEFAULT, H5P_DEFAULT); @@ -3483,9 +3636,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); CHECK(dataset, FAIL, "H5Dopen2"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Open attribute of the dataset for the first time */ attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)2, H5P_DEFAULT, H5P_DEFAULT); @@ -3497,9 +3652,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Adelete_by_idx"); } - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Open attribute for the second time */ attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)2, H5P_DEFAULT, H5P_DEFAULT); @@ -3547,9 +3704,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); CHECK(dataset, FAIL, "H5Dopen2"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Open attribute of the dataset for the first time */ attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)3, H5P_DEFAULT, H5P_DEFAULT); @@ -3571,9 +3730,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); } - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Open attribute for the second time */ attr2 = H5Aopen_by_idx(dataset, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)3, H5P_DEFAULT, H5P_DEFAULT); @@ -3643,9 +3804,11 @@ test_attr_dense_dup_ids(hid_t fcpl, hid_t fapl) attr = H5Acreate2(gid1, ATTR2_NAME, H5T_NATIVE_INT, sid2, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check on group's attribute storage status */ - is_dense = H5O__is_attr_dense_test(gid1); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on group's attribute storage status */ + is_dense = H5O__is_attr_dense_test(gid1); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Open the hard link just created */ gid2 = H5Gopen2(fid, GROUP2_NAME, H5P_DEFAULT); @@ -3720,9 +3883,10 @@ test_attr_big(hid_t fcpl, hid_t fapl) htri_t is_empty; /* Are there any attributes? */ htri_t is_dense; /* Are attributes stored densely? */ unsigned u; /* Local index variable */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Storing 'Big' Attributes in Dense Storage\n")); @@ -3731,14 +3895,19 @@ test_attr_big(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -3782,11 +3951,13 @@ test_attr_big(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add first "small" attribute, which should be in compact storage */ @@ -3800,11 +3971,13 @@ test_attr_big(hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add second "small" attribute, which should stay in compact storage */ @@ -3818,11 +3991,13 @@ test_attr_big(hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add first "big" attribute, which should push storage into dense form */ @@ -3842,10 +4017,12 @@ test_attr_big(hid_t fcpl, hid_t fapl) * message heap instead of forcing the attribute storage into the dense * form - QAK) */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); + if (vol_is_native) { + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); + } /* Add second "big" attribute, which should leave storage in dense form */ @@ -3864,10 +4041,12 @@ test_attr_big(hid_t fcpl, hid_t fapl) * message heap instead of forcing the attribute storage into the dense * form - QAK) */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); + if (vol_is_native) { + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); + } /* Delete second "small" attribute, attributes should still be stored densely */ @@ -3877,11 +4056,13 @@ test_attr_big(hid_t fcpl, hid_t fapl) ret = H5Adelete(dataset, attrname); CHECK(ret, FAIL, "H5Adelete"); - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); + } /* Delete second "big" attribute, attributes should still be stored densely */ @@ -3891,11 +4072,13 @@ test_attr_big(hid_t fcpl, hid_t fapl) ret = H5Adelete(dataset, attrname); CHECK(ret, FAIL, "H5Adelete"); - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, (nshared_indices ? false : true), "H5O__is_attr_dense_test"); + } /* Delete first "big" attribute, attributes should _not_ be stored densely */ @@ -3905,11 +4088,13 @@ test_attr_big(hid_t fcpl, hid_t fapl) ret = H5Adelete(dataset, attrname); CHECK(ret, FAIL, "H5Adelete"); - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Delete first "small" attribute, should be no attributes now */ @@ -3919,11 +4104,13 @@ test_attr_big(hid_t fcpl, hid_t fapl) ret = H5Adelete(dataset, attrname); CHECK(ret, FAIL, "H5Adelete"); - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + } } /* end if */ - else { + else if (vol_is_native) { /* Shouldn't be able to create "big" attributes with older version of format */ VERIFY(attr, FAIL, "H5Acreate2"); @@ -3956,7 +4143,7 @@ test_attr_big(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -3981,11 +4168,12 @@ test_attr_null_space(hid_t fcpl, hid_t fapl) char attrname[NAME_BUF_SIZE]; /* Name of attribute */ unsigned value; /* Attribute value */ htri_t cmp; /* Results of comparison */ - hsize_t storage_size; /* Size of storage for attribute */ + hsize_t storage_size = 0; /* Size of storage for attribute */ H5A_info_t ainfo; /* Attribute info */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Storing Attributes with 'null' dataspace\n")); @@ -3994,14 +4182,19 @@ test_attr_null_space(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -4046,14 +4239,19 @@ test_attr_null_space(hid_t fcpl, hid_t fapl) ret = H5Sclose(attr_sid); CHECK(ret, FAIL, "H5Sclose"); - /* Check the storage size for the attribute */ - storage_size = H5Aget_storage_size(attr); - VERIFY(storage_size, 0, "H5Aget_storage_size"); + if (vol_is_native) { + /* Check the storage size for the attribute */ + storage_size = H5Aget_storage_size(attr); + VERIFY(storage_size, 0, "H5Aget_storage_size"); + } /* Get the attribute info */ ret = H5Aget_info(attr, &ainfo); CHECK(ret, FAIL, "H5Aget_info"); - VERIFY(ainfo.data_size, storage_size, "H5Aget_info"); + + if (vol_is_native) { + VERIFY(ainfo.data_size, storage_size, "H5Aget_info"); + } /* Close attribute */ ret = H5Aclose(attr); @@ -4120,14 +4318,19 @@ test_attr_null_space(hid_t fcpl, hid_t fapl) ret = H5Sclose(attr_sid); CHECK(ret, FAIL, "H5Sclose"); - /* Check the storage size for the attribute */ - storage_size = H5Aget_storage_size(attr); - VERIFY(storage_size, 0, "H5Aget_storage_size"); + if (vol_is_native) { + /* Check the storage size for the attribute */ + storage_size = H5Aget_storage_size(attr); + VERIFY(storage_size, 0, "H5Aget_storage_size"); + } /* Get the attribute info */ ret = H5Aget_info(attr, &ainfo); CHECK(ret, FAIL, "H5Aget_info"); - VERIFY(ainfo.data_size, storage_size, "H5Aget_info"); + + if (vol_is_native) { + VERIFY(ainfo.data_size, storage_size, "H5Aget_info"); + } /* Close attribute */ ret = H5Aclose(attr); @@ -4167,7 +4370,7 @@ test_attr_null_space(hid_t fcpl, hid_t fapl) ret = H5Sclose(null_sid); CHECK(ret, FAIL, "H5Sclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -4424,7 +4627,8 @@ test_attr_corder_create_basic(hid_t fcpl, hid_t fapl) unsigned crt_order_flags; /* Creation order flags */ htri_t is_empty; /* Are there any attributes? */ htri_t is_dense; /* Are attributes stored densely? */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Basic Code for Attributes with Creation Order Info\n")); @@ -4433,6 +4637,9 @@ test_attr_corder_create_basic(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Create dataset creation property list */ if (dcpl_g == H5P_DEFAULT) { dcpl = H5Pcreate(H5P_DATASET_CREATE); @@ -4478,11 +4685,13 @@ test_attr_corder_create_basic(hid_t fcpl, hid_t fapl) ret = H5Sclose(sid); CHECK(ret, FAIL, "H5Sclose"); - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Close Dataset */ ret = H5Dclose(dataset); @@ -4504,11 +4713,13 @@ test_attr_corder_create_basic(hid_t fcpl, hid_t fapl) dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT); CHECK(dataset, FAIL, "H5Dopen2"); - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Retrieve dataset creation property list for group */ dcpl = H5Dget_create_plist(dataset); @@ -4555,7 +4766,8 @@ test_attr_corder_create_compact(hid_t fcpl, hid_t fapl) char attrname[NAME_BUF_SIZE]; /* Name of attribute */ unsigned curr_dset; /* Current dataset to work on */ unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Compact Storage of Attributes with Creation Order Info\n")); @@ -4564,6 +4776,9 @@ test_attr_corder_create_compact(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Create dataset creation property list */ if (dcpl_g == H5P_DEFAULT) { dcpl = H5Pcreate(H5P_DATASET_CREATE); @@ -4613,11 +4828,13 @@ test_attr_corder_create_compact(hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Create several attributes, but keep storage in compact form */ for (u = 0; u < max_compact; u++) { @@ -4634,14 +4851,16 @@ test_attr_corder_create_compact(hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } } /* end for */ } /* end for */ @@ -4696,14 +4915,16 @@ test_attr_corder_create_compact(hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Loop through attributes, checking their creation order values */ /* (the name index is used, but the creation order value is in the same order) */ @@ -4759,7 +4980,8 @@ test_attr_corder_create_dense(hid_t fcpl, hid_t fapl) char attrname[NAME_BUF_SIZE]; /* Name of attribute */ unsigned curr_dset; /* Current dataset to work on */ unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Dense Storage of Attributes with Creation Order Info\n")); @@ -4768,6 +4990,9 @@ test_attr_corder_create_dense(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Create dataset creation property list */ if (dcpl_g == H5P_DEFAULT) { dcpl = H5Pcreate(H5P_DATASET_CREATE); @@ -4817,11 +5042,13 @@ test_attr_corder_create_dense(hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Create several attributes, but keep storage in compact form */ for (u = 0; u < max_compact; u++) { @@ -4838,14 +5065,16 @@ test_attr_corder_create_dense(hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } } /* end for */ /* Create another attribute, to push into dense storage */ @@ -4861,19 +5090,21 @@ test_attr_corder_create_dense(hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + } } /* end for */ /* Close Datasets */ @@ -4927,14 +5158,16 @@ test_attr_corder_create_dense(hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Loop through attributes, checking their creation order values */ /* (the name index is used, but the creation order value is in the same order) */ @@ -5096,7 +5329,8 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) char attrname[NAME_BUF_SIZE]; /* Name of attribute */ unsigned curr_dset; /* Current dataset to work on */ unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Storage Transitions of Attributes with Creation Order Info\n")); @@ -5105,6 +5339,9 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Create dataset creation property list */ if (dcpl_g == H5P_DEFAULT) { dcpl = H5Pcreate(H5P_DATASET_CREATE); @@ -5158,11 +5395,13 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } } /* end for */ /* Close Datasets */ @@ -5227,14 +5466,16 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (u + 1), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } } /* end for */ /* Create another attribute, to push into dense storage */ @@ -5250,30 +5491,11 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - - /* Delete several attributes from object, until attribute storage resumes compact form */ - for (u = max_compact; u >= min_dense; u--) { - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); - + if (vol_is_native) { /* Verify state of object */ ret = H5O__num_attrs_test(my_dataset, &nattrs); CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, u, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); is_empty = H5O__is_attr_empty_test(my_dataset); VERIFY(is_empty, false, "H5O__is_attr_empty_test"); is_dense = H5O__is_attr_dense_test(my_dataset); @@ -5283,6 +5505,29 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); CHECK(ret, FAIL, "H5O__attr_dense_info_test"); VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + } + + /* Delete several attributes from object, until attribute storage resumes compact form */ + for (u = max_compact; u >= min_dense; u--) { + snprintf(attrname, sizeof(attrname), "attr %02u", u); + ret = H5Adelete(my_dataset, attrname); + CHECK(ret, FAIL, "H5Adelete"); + + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, u, "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + } } /* end for */ /* Delete another attribute, to push attribute storage into compact form */ @@ -5290,14 +5535,16 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) ret = H5Adelete(my_dataset, attrname); CHECK(ret, FAIL, "H5Adelete"); - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (min_dense - 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (min_dense - 1), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Re-add attributes to get back into dense form */ for (u = (min_dense - 1); u < (max_compact + 1); u++) { @@ -5315,19 +5562,21 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + } } /* end for */ /* Close Datasets */ @@ -5373,30 +5622,11 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - - /* Delete several attributes from object, until attribute storage resumes compact form */ - for (u = max_compact; u >= min_dense; u--) { - snprintf(attrname, sizeof(attrname), "attr %02u", u); - ret = H5Adelete(my_dataset, attrname); - CHECK(ret, FAIL, "H5Adelete"); - - /* Verify state of object */ + if (vol_is_native) { + /* Check on dataset's attribute storage status */ ret = H5O__num_attrs_test(my_dataset, &nattrs); CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, u, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); is_empty = H5O__is_attr_empty_test(my_dataset); VERIFY(is_empty, false, "H5O__is_attr_empty_test"); is_dense = H5O__is_attr_dense_test(my_dataset); @@ -5406,6 +5636,29 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); CHECK(ret, FAIL, "H5O__attr_dense_info_test"); VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + } + + /* Delete several attributes from object, until attribute storage resumes compact form */ + for (u = max_compact; u >= min_dense; u--) { + snprintf(attrname, sizeof(attrname), "attr %02u", u); + ret = H5Adelete(my_dataset, attrname); + CHECK(ret, FAIL, "H5Adelete"); + + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, u, "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + } } /* end for */ /* Delete another attribute, to push attribute storage into compact form */ @@ -5413,14 +5666,16 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) ret = H5Adelete(my_dataset, attrname); CHECK(ret, FAIL, "H5Adelete"); - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (min_dense - 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (min_dense - 1), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Re-add attributes to get back into dense form */ for (u = (min_dense - 1); u < (max_compact + 1); u++) { @@ -5438,19 +5693,21 @@ test_attr_corder_transition(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact + 1), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + } /* Delete all attributes */ for (u = max_compact; u > 0; u--) { @@ -5506,7 +5763,8 @@ test_attr_corder_delete(hid_t fcpl, hid_t fapl) char attrname[NAME_BUF_SIZE]; /* Name of attribute */ unsigned curr_dset; /* Current dataset to work on */ unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Deleting Object w/Dense Attribute Storage and Creation Order Info\n")); @@ -5538,7 +5796,10 @@ test_attr_corder_delete(hid_t fcpl, hid_t fapl) for (reopen_file = false; reopen_file <= true; reopen_file++) { /* Create test file */ fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fopen"); + CHECK(fid, FAIL, "H5Fcreate"); + + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); /* Create datasets */ dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT); @@ -5567,11 +5828,13 @@ test_attr_corder_delete(hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Create attributes, until attribute storage is in dense form */ for (u = 0; u < max_compact * 2; u++) { @@ -5589,19 +5852,21 @@ test_attr_corder_delete(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + } } /* end for */ /* Close Datasets */ @@ -5706,22 +5971,32 @@ attr_info_by_idx_check(hid_t obj_id, const char *attrname, hsize_t n, bool use_i * index. */ if (use_index) { + H5_iter_order_t order; + bool vol_is_native; + + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, obj_id, &vol_is_native), FAIL, "h5_using_native_vol"); + + if (vol_is_native) + order = H5_ITER_NATIVE; + else + order = H5_ITER_INC; + /* Verify the information for first attribute, in native creation order */ memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_NATIVE, (hsize_t)0, &ainfo, - H5P_DEFAULT); + ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, order, (hsize_t)0, &ainfo, H5P_DEFAULT); CHECK(ret, FAIL, "H5Aget_info_by_idx"); VERIFY(ainfo.corder, 0, "H5Aget_info_by_idx"); /* Verify the information for new attribute, in native creation order */ memset(&ainfo, 0, sizeof(ainfo)); - ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_NATIVE, n, &ainfo, H5P_DEFAULT); + ret = H5Aget_info_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, order, n, &ainfo, H5P_DEFAULT); CHECK(ret, FAIL, "H5Aget_info_by_idx"); VERIFY(ainfo.corder, n, "H5Aget_info_by_idx"); /* Verify the name for new link, in increasing native order */ memset(tmpname, 0, (size_t)NAME_BUF_SIZE); - ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_NATIVE, n, tmpname, + ret = (herr_t)H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, order, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); CHECK(ret, FAIL, "H5Aget_name_by_idx"); if (strcmp(attrname, tmpname) != 0) @@ -5827,7 +6102,8 @@ test_attr_info_by_idx(bool new_format, hid_t fcpl, hid_t fapl) char tmpname[NAME_BUF_SIZE]; /* Temporary attribute name */ unsigned curr_dset; /* Current dataset to work on */ unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Create dataspace for dataset & attributes */ sid = H5Screate(H5S_SCALAR); @@ -5859,6 +6135,9 @@ test_attr_info_by_idx(bool new_format, hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Set attribute creation order tracking & indexing for object */ if (new_format == true) { ret = H5Pset_attr_creation_order( @@ -5893,11 +6172,13 @@ test_attr_info_by_idx(bool new_format, hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Check for query on non-existent attribute */ H5E_BEGIN_TRY @@ -5935,14 +6216,16 @@ test_attr_info_by_idx(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Check for out of bound offset queries */ H5E_BEGIN_TRY @@ -5982,32 +6265,36 @@ test_attr_info_by_idx(bool new_format, hid_t fcpl, hid_t fapl) ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Verify state of object */ - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); + } /* Verify information for new attribute */ ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ + if (new_format) { + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + if (use_index) + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); + } /* end if */ + } /* Check for out of bound offset queries */ H5E_BEGIN_TRY @@ -6311,10 +6598,16 @@ test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) char tmpname[NAME_BUF_SIZE]; /* Temporary attribute name */ unsigned curr_dset; /* Current dataset to work on */ unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ MESSAGE(5, ("Testing Deleting Attribute By Index\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create dataspace for dataset & attributes */ sid = H5Screate(H5S_SCALAR); CHECK(sid, FAIL, "H5Screate"); @@ -6381,6 +6674,9 @@ test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Set attribute creation order tracking & indexing for object */ if (new_format == true) { ret = H5Pset_attr_creation_order( @@ -6415,11 +6711,13 @@ test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Check for deleting non-existent attribute */ H5E_BEGIN_TRY @@ -6450,14 +6748,16 @@ test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Check for out of bound deletions */ H5E_BEGIN_TRY @@ -6522,9 +6822,11 @@ test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); CHECK(ret, FAIL, "H5Adelete_by_idx"); - /* Verify state of attribute storage (empty) */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + if (vol_is_native) { + /* Verify state of attribute storage (empty) */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + } } /* end for */ /* Work on all the datasets */ @@ -6563,33 +6865,35 @@ test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); /* Verify state of object */ - if (u >= max_compact) { + if (vol_is_native && (u >= max_compact)) { is_dense = H5O__is_attr_dense_test(my_dataset); VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - } /* end if */ + } /* Verify information for new attribute */ ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ + if (new_format) { + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + if (use_index) + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); + } /* end if */ + } /* Check for out of bound deletion */ H5E_BEGIN_TRY @@ -6654,9 +6958,11 @@ test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); CHECK(ret, FAIL, "H5Adelete_by_idx"); - /* Verify state of attribute storage (empty) */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + if (vol_is_native) { + /* Verify state of attribute storage (empty) */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + } /* Check for deletion on empty attribute storage again */ H5E_BEGIN_TRY @@ -6705,7 +7011,7 @@ test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); /* Verify state of object */ - if (u >= max_compact) { + if (vol_is_native && (u >= max_compact)) { is_dense = H5O__is_attr_dense_test(my_dataset); VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); } /* end if */ @@ -6825,9 +7131,11 @@ test_attr_delete_by_idx(bool new_format, hid_t fcpl, hid_t fapl) ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); CHECK(ret, FAIL, "H5Adelete_by_idx"); - /* Verify state of attribute storage (empty) */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + if (vol_is_native) { + /* Verify state of attribute storage (empty) */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + } /* Check for deletion on empty attribute storage again */ H5E_BEGIN_TRY @@ -6978,11 +7286,22 @@ attr_iterate_check(hid_t fid, const char *dsetname, hid_t obj_id, H5_index_t idx unsigned oskip; /* # of attributes to skip on object, with H5Aiterate1 */ #endif /* H5_NO_DEPRECATED_SYMBOLS */ int old_nerrs; /* Number of errors when entering this check */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Retrieve the current # of reported errors */ old_nerrs = GetTestNumErrs(); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE)) { + SKIPPED(); + printf(" API functions for iterate aren't " + "supported with this connector\n"); + return 1; + } + + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, obj_id, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Iterate over attributes on object */ iter_info->nskipped = (unsigned)(skip = 0); iter_info->order = order; @@ -7029,20 +7348,22 @@ attr_iterate_check(hid_t fid, const char *dsetname, hid_t obj_id, H5_index_t idx VERIFY(iter_info->visited[v], true, "H5Aiterate_by_name"); #ifndef H5_NO_DEPRECATED_SYMBOLS - /* Iterate over attributes on object, with H5Aiterate1 */ - iter_info->nskipped = oskip = 0; - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate1"); - - /* Verify that we visited all the attributes */ - VERIFY(skip, max_attrs, "H5Aiterate1"); - for (v = 0; v < max_attrs; v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate1"); + if (vol_is_native) { + /* Iterate over attributes on object, with H5Aiterate1 */ + iter_info->nskipped = oskip = 0; + iter_info->order = order; + iter_info->stop = -1; + iter_info->ncalled = 0; + iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); + memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); + ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); + CHECK(ret, FAIL, "H5Aiterate1"); + + /* Verify that we visited all the attributes */ + VERIFY(skip, max_attrs, "H5Aiterate1"); + for (v = 0; v < max_attrs; v++) + VERIFY(iter_info->visited[v], true, "H5Aiterate1"); + } #endif /* H5_NO_DEPRECATED_SYMBOLS */ /* Skip over some attributes on object */ @@ -7139,36 +7460,38 @@ attr_iterate_check(hid_t fid, const char *dsetname, hid_t obj_id, H5_index_t idx } /* end else */ #ifndef H5_NO_DEPRECATED_SYMBOLS - /* Skip over some attributes on object, with H5Aiterate1 */ - iter_info->nskipped = oskip = max_attrs / 2; - iter_info->order = order; - iter_info->stop = -1; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? (unsigned)oskip : ((max_attrs - 1) - oskip); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate1"); - - /* Verify that we visited all the links */ - VERIFY(oskip, max_attrs, "H5Aiterate1"); - if (order == H5_ITER_INC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v + (max_attrs / 2)], true, "H5Aiterate1"); - } /* end if */ - else if (order == H5_ITER_DEC) { - for (v = 0; v < (max_attrs / 2); v++) - VERIFY(iter_info->visited[v], true, "H5Aiterate1"); - } /* end if */ - else { - unsigned nvisit = 0; /* # of links visited */ + if (vol_is_native) { + /* Skip over some attributes on object, with H5Aiterate1 */ + iter_info->nskipped = oskip = max_attrs / 2; + iter_info->order = order; + iter_info->stop = -1; + iter_info->ncalled = 0; + iter_info->curr = order != H5_ITER_DEC ? (unsigned)oskip : ((max_attrs - 1) - oskip); + memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); + ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); + CHECK(ret, FAIL, "H5Aiterate1"); + + /* Verify that we visited all the links */ + VERIFY(oskip, max_attrs, "H5Aiterate1"); + if (order == H5_ITER_INC) { + for (v = 0; v < (max_attrs / 2); v++) + VERIFY(iter_info->visited[v + (max_attrs / 2)], true, "H5Aiterate1"); + } /* end if */ + else if (order == H5_ITER_DEC) { + for (v = 0; v < (max_attrs / 2); v++) + VERIFY(iter_info->visited[v], true, "H5Aiterate1"); + } /* end if */ + else { + unsigned nvisit = 0; /* # of links visited */ - assert(order == H5_ITER_NATIVE); - for (v = 0; v < max_attrs; v++) - if (iter_info->visited[v] == true) - nvisit++; + assert(order == H5_ITER_NATIVE); + for (v = 0; v < max_attrs; v++) + if (iter_info->visited[v] == true) + nvisit++; - VERIFY(nvisit, max_attrs, "H5Aiterate1"); - } /* end else */ + VERIFY(nvisit, max_attrs, "H5Aiterate1"); + } /* end else */ + } #endif /* H5_NO_DEPRECATED_SYMBOLS */ /* Iterate over attributes on object, stopping in the middle */ @@ -7208,17 +7531,19 @@ attr_iterate_check(hid_t fid, const char *dsetname, hid_t obj_id, H5_index_t idx VERIFY(iter_info->ncalled, 3, "H5Aiterate_by_name"); #ifndef H5_NO_DEPRECATED_SYMBOLS - /* Iterate over attributes on object, stopping in the middle, with H5Aiterate1() */ - iter_info->nskipped = oskip = 0; - iter_info->order = order; - iter_info->stop = 3; - iter_info->ncalled = 0; - iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); - memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); - ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); - CHECK(ret, FAIL, "H5Aiterate1"); - VERIFY(ret, CORDER_ITER_STOP, "H5Aiterate1"); - VERIFY(iter_info->ncalled, 3, "H5Aiterate1"); + if (vol_is_native) { + /* Iterate over attributes on object, stopping in the middle, with H5Aiterate1() */ + iter_info->nskipped = oskip = 0; + iter_info->order = order; + iter_info->stop = 3; + iter_info->ncalled = 0; + iter_info->curr = order != H5_ITER_DEC ? 0 : (max_attrs - 1); + memset(iter_info->visited, 0, sizeof(bool) * iter_info->max_visit); + ret = H5Aiterate1(obj_id, &oskip, attr_iterate1_cb, iter_info); + CHECK(ret, FAIL, "H5Aiterate1"); + VERIFY(ret, CORDER_ITER_STOP, "H5Aiterate1"); + VERIFY(iter_info->ncalled, 3, "H5Aiterate1"); + } #endif /* H5_NO_DEPRECATED_SYMBOLS */ /* Check for iteration routine indicating failure */ @@ -7287,7 +7612,11 @@ test_attr_iterate2(bool new_format, hid_t fcpl, hid_t fapl) char attrname[NAME_BUF_SIZE]; /* Name of attribute */ unsigned curr_dset; /* Current dataset to work on */ unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ + + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) + return; /* Create dataspace for dataset & attributes */ sid = H5Screate(H5S_SCALAR); @@ -7361,6 +7690,9 @@ test_attr_iterate2(bool new_format, hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Set attribute creation order tracking & indexing for object */ if (new_format == true) { ret = H5Pset_attr_creation_order( @@ -7398,11 +7730,13 @@ test_attr_iterate2(bool new_format, hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Check for iterating over object with no attributes (should be OK) */ ret = H5Aiterate2(my_dataset, idx_type, order, NULL, attr_iterate2_cb, NULL); @@ -7437,45 +7771,49 @@ test_attr_iterate2(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - - /* Check for out of bound iteration */ - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate2(my_dataset, idx_type, order, &idx, attr_iterate2_cb, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate2"); - - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &idx, attr_iterate2_cb, NULL, - H5P_DEFAULT); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(my_dataset, ".", idx_type, order, &idx, attr_iterate2_cb, - NULL, H5P_DEFAULT); + if (vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) { + /* Check for out of bound iteration */ + idx = u; + H5E_BEGIN_TRY + { + ret = H5Aiterate2(my_dataset, idx_type, order, &idx, attr_iterate2_cb, NULL); + } + H5E_END_TRY + VERIFY(ret, FAIL, "H5Aiterate2"); + + idx = u; + H5E_BEGIN_TRY + { + ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &idx, attr_iterate2_cb, + NULL, H5P_DEFAULT); + } + H5E_END_TRY + VERIFY(ret, FAIL, "H5Aiterate_by_name"); + + idx = u; + H5E_BEGIN_TRY + { + ret = H5Aiterate_by_name(my_dataset, ".", idx_type, order, &idx, attr_iterate2_cb, + NULL, H5P_DEFAULT); + } + H5E_END_TRY + VERIFY(ret, FAIL, "H5Aiterate_by_name"); + + /* Test iteration over attributes stored compactly */ + ret = attr_iterate_check(fid, dsetname, my_dataset, idx_type, order, u, &iter_info); + CHECK(ret, FAIL, "attr_iterate_check"); } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - /* Test iteration over attributes stored compactly */ - ret = attr_iterate_check(fid, dsetname, my_dataset, idx_type, order, u, &iter_info); - CHECK(ret, FAIL, "attr_iterate_check"); } /* end for */ /* Work on all the datasets */ @@ -7517,7 +7855,7 @@ test_attr_iterate2(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); /* Verify state of object */ - if (u >= max_compact) { + if (vol_is_native && (u >= max_compact)) { is_dense = H5O__is_attr_dense_test(my_dataset); VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); } /* end if */ @@ -7527,55 +7865,59 @@ test_attr_iterate2(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ - - /* Check for out of bound iteration */ - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate2(my_dataset, idx_type, order, &idx, attr_iterate2_cb, NULL); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate2"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &idx, attr_iterate2_cb, NULL, - H5P_DEFAULT); + if (new_format) { + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + if (use_index) + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); + } } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - idx = u; - H5E_BEGIN_TRY - { - ret = H5Aiterate_by_name(my_dataset, ".", idx_type, order, &idx, attr_iterate2_cb, - NULL, H5P_DEFAULT); + if (vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) { + /* Check for out of bound iteration */ + idx = u; + H5E_BEGIN_TRY + { + ret = H5Aiterate2(my_dataset, idx_type, order, &idx, attr_iterate2_cb, NULL); + } + H5E_END_TRY + VERIFY(ret, FAIL, "H5Aiterate2"); + + idx = u; + H5E_BEGIN_TRY + { + ret = H5Aiterate_by_name(fid, dsetname, idx_type, order, &idx, attr_iterate2_cb, + NULL, H5P_DEFAULT); + } + H5E_END_TRY + VERIFY(ret, FAIL, "H5Aiterate_by_name"); + + idx = u; + H5E_BEGIN_TRY + { + ret = H5Aiterate_by_name(my_dataset, ".", idx_type, order, &idx, attr_iterate2_cb, + NULL, H5P_DEFAULT); + } + H5E_END_TRY + VERIFY(ret, FAIL, "H5Aiterate_by_name"); + + /* Test iteration over attributes stored densely */ + ret = attr_iterate_check(fid, dsetname, my_dataset, idx_type, order, u, &iter_info); + CHECK(ret, FAIL, "attr_iterate_check"); } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Aiterate_by_name"); - - /* Test iteration over attributes stored densely */ - ret = attr_iterate_check(fid, dsetname, my_dataset, idx_type, order, u, &iter_info); - CHECK(ret, FAIL, "attr_iterate_check"); - } /* end for */ + } /* Close Datasets */ ret = H5Dclose(dset1); @@ -7687,8 +8029,12 @@ test_attr_open_by_idx(bool new_format, hid_t fcpl, hid_t fapl) char attrname[NAME_BUF_SIZE]; /* Name of attribute */ unsigned curr_dset; /* Current dataset to work on */ unsigned u; /* Local index variable */ - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + hid_t ret_id; /* Generic hid_t return value */ + herr_t ret; /* Generic return value */ + + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) + return; /* Create dataspace for dataset & attributes */ sid = H5Screate(H5S_SCALAR); @@ -7756,6 +8102,9 @@ test_attr_open_by_idx(bool new_format, hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Set attribute creation order tracking & indexing for object */ if (new_format == true) { ret = H5Pset_attr_creation_order( @@ -7790,11 +8139,13 @@ test_attr_open_by_idx(bool new_format, hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Check for opening an attribute on an object with no attributes */ H5E_BEGIN_TRY @@ -7826,14 +8177,16 @@ test_attr_open_by_idx(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Check for out of bound opening an attribute on an object */ H5E_BEGIN_TRY @@ -7885,7 +8238,7 @@ test_attr_open_by_idx(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); /* Verify state of object */ - if (u >= max_compact) { + if (vol_is_native && (u >= max_compact)) { is_dense = H5O__is_attr_dense_test(my_dataset); VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); } /* end if */ @@ -7895,23 +8248,25 @@ test_attr_open_by_idx(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ + if (new_format) { + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + if (use_index) + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); + } /* end if */ + } /* Check for out of bound opening an attribute on an object */ H5E_BEGIN_TRY @@ -8057,8 +8412,9 @@ test_attr_open_by_name(bool new_format, hid_t fcpl, hid_t fapl) char attrname[NAME_BUF_SIZE]; /* Name of attribute */ unsigned curr_dset; /* Current dataset to work on */ unsigned u; /* Local index variable */ - hid_t ret_id; /* Generic hid_t return value */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + hid_t ret_id; /* Generic hid_t return value */ + herr_t ret; /* Generic return value */ /* Create dataspace for dataset & attributes */ sid = H5Screate(H5S_SCALAR); @@ -8090,6 +8446,9 @@ test_attr_open_by_name(bool new_format, hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Set attribute creation order tracking & indexing for object */ if (new_format == true) { ret = H5Pset_attr_creation_order( @@ -8127,11 +8486,13 @@ test_attr_open_by_name(bool new_format, hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Check for opening a non-existent attribute on an object with no attributes */ H5E_BEGIN_TRY @@ -8175,14 +8536,16 @@ test_attr_open_by_name(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Check for opening a non-existent attribute on an object with compact attribute storage */ H5E_BEGIN_TRY @@ -8249,7 +8612,7 @@ test_attr_open_by_name(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); /* Verify state of object */ - if (u >= max_compact) { + if (vol_is_native && (u >= max_compact)) { is_dense = H5O__is_attr_dense_test(my_dataset); VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); } /* end if */ @@ -8259,23 +8622,25 @@ test_attr_open_by_name(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ + if (new_format) { + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + if (use_index) + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); + } /* end if */ + } /* Check for opening a non-existent attribute on an object with dense attribute storage */ H5E_BEGIN_TRY @@ -8353,7 +8718,8 @@ test_attr_create_by_name(bool new_format, hid_t fcpl, hid_t fapl) char attrname[NAME_BUF_SIZE]; /* Name of attribute */ unsigned curr_dset; /* Current dataset to work on */ unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Create dataspace for dataset & attributes */ sid = H5Screate(H5S_SCALAR); @@ -8385,6 +8751,9 @@ test_attr_create_by_name(bool new_format, hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Set attribute creation order tracking & indexing for object */ if (new_format == true) { ret = H5Pset_attr_creation_order( @@ -8422,11 +8791,13 @@ test_attr_create_by_name(bool new_format, hid_t fcpl, hid_t fapl) assert(0 && "Too many datasets!"); } /* end switch */ - /* Check on dataset's attribute storage status */ - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, true, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, true, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Create attributes, up to limit of compact form */ for (u = 0; u < max_compact; u++) { @@ -8449,14 +8820,16 @@ test_attr_create_by_name(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, max_compact, "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Test opening attributes stored compactly */ ret = attr_open_check(fid, dsetname, my_dataset, u); @@ -8502,7 +8875,7 @@ test_attr_create_by_name(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Aclose"); /* Verify state of object */ - if (u >= max_compact) { + if (vol_is_native && (u >= max_compact)) { is_dense = H5O__is_attr_dense_test(my_dataset); VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); } /* end if */ @@ -8512,23 +8885,25 @@ test_attr_create_by_name(bool new_format, hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "attr_info_by_idx_check"); } /* end for */ - /* Verify state of object */ - ret = H5O__num_attrs_test(my_dataset, &nattrs); - CHECK(ret, FAIL, "H5O__num_attrs_test"); - VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); - is_empty = H5O__is_attr_empty_test(my_dataset); - VERIFY(is_empty, false, "H5O__is_attr_empty_test"); - is_dense = H5O__is_attr_dense_test(my_dataset); - VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Verify state of object */ + ret = H5O__num_attrs_test(my_dataset, &nattrs); + CHECK(ret, FAIL, "H5O__num_attrs_test"); + VERIFY(nattrs, (max_compact * 2), "H5O__num_attrs_test"); + is_empty = H5O__is_attr_empty_test(my_dataset); + VERIFY(is_empty, false, "H5O__is_attr_empty_test"); + is_dense = H5O__is_attr_dense_test(my_dataset); + VERIFY(is_dense, (new_format ? true : false), "H5O__is_attr_dense_test"); - if (new_format) { - /* Retrieve & verify # of records in the name & creation order indices */ - ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); - CHECK(ret, FAIL, "H5O__attr_dense_info_test"); - if (use_index) - VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); - VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); - } /* end if */ + if (new_format) { + /* Retrieve & verify # of records in the name & creation order indices */ + ret = H5O__attr_dense_info_test(my_dataset, &name_count, &corder_count); + CHECK(ret, FAIL, "H5O__attr_dense_info_test"); + if (use_index) + VERIFY(name_count, corder_count, "H5O__attr_dense_info_test"); + VERIFY(name_count, (max_compact * 2), "H5O__attr_dense_info_test"); + } /* end if */ + } /* Test opening attributes stored compactly */ ret = attr_open_check(fid, dsetname, my_dataset, u); @@ -8585,9 +8960,10 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) size_t mesg_count; /* # of shared messages */ unsigned test_shared; /* Index over shared component type */ unsigned u; /* Local index variable */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Writing Shared & Unshared Attributes in Compact & Dense Storage\n")); @@ -8644,6 +9020,9 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close FCPL copy */ ret = H5Pclose(my_fcpl); CHECK(ret, FAIL, "H5Pclose"); @@ -8652,10 +9031,12 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -8684,7 +9065,7 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) CHECK(dataset2, FAIL, "H5Dcreate2"); /* Check on dataset's message storage status */ - if (test_shared != 0) { + if (vol_is_native && (test_shared != 0)) { /* Datasets' datatypes can be shared */ ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); @@ -8704,11 +9085,13 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on datasets' attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + is_dense = H5O__is_attr_dense_test(dataset2); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add attributes to each dataset, until after converting to dense storage */ for (u = 0; u < max_compact * 2; u++) { @@ -8721,9 +9104,11 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* Write data into the attribute */ attr_value = u + 1; @@ -8735,36 +9120,42 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* Write data into the attribute */ big_value[0] = u + 1; ret = H5Awrite(attr, attr_tid, big_value); CHECK(ret, FAIL, "H5Awrite"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + if (vol_is_native) { + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } } /* end else */ /* Close attribute */ ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + if (u < max_compact) + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + else + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Alternate between creating "small" & "big" attributes */ if (u % 2) { @@ -8772,9 +9163,11 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* Write data into the attribute */ attr_value = u + 1; @@ -8786,36 +9179,42 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* Write data into the attribute */ big_value[0] = u + 1; ret = H5Awrite(attr, attr_tid, big_value); CHECK(ret, FAIL, "H5Awrite"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); + if (vol_is_native) { + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); + } } /* end else */ /* Close attribute */ ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset2); + if (u < max_compact) + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + else + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } } /* end for */ /* Close attribute's datatype */ @@ -8829,7 +9228,7 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Dclose"); /* Check on shared message status now */ - if (test_shared != 0) { + if (vol_is_native && (test_shared != 0)) { if (test_shared == 1) { /* Check on datatype storage status */ ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); @@ -8841,7 +9240,7 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); VERIFY(mesg_count, 2, "H5F__get_sohm_mesg_count_test"); - } /* end if */ + } /* Unlink datasets with attributes */ ret = H5Ldelete(fid, DSET1_NAME, H5P_DEFAULT); @@ -8855,28 +9254,30 @@ test_attr_shared_write(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Ldelete"); } /* end if */ - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); + if (vol_is_native) { + /* Check on attribute storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ + if (test_shared != 0) { + /* Check on datatype storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); + CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); + VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); + + /* Check on dataspace storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); + CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); + VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); + } /* end if */ + } /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -8922,9 +9323,10 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) size_t mesg_count; /* # of shared messages */ unsigned test_shared; /* Index over shared component type */ unsigned u; /* Local index variable */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Renaming Shared & Unshared Attributes in Compact & Dense Storage\n")); @@ -8981,6 +9383,9 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close FCPL copy */ ret = H5Pclose(my_fcpl); CHECK(ret, FAIL, "H5Pclose"); @@ -8989,10 +9394,12 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -9021,7 +9428,7 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) CHECK(dataset2, FAIL, "H5Dcreate2"); /* Check on dataset's message storage status */ - if (test_shared != 0) { + if (vol_is_native && (test_shared != 0)) { /* Datasets' datatypes can be shared */ ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); @@ -9041,11 +9448,13 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on datasets' attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + is_dense = H5O__is_attr_dense_test(dataset2); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add attributes to each dataset, until after converting to dense storage */ for (u = 0; u < max_compact * 2; u++) { @@ -9058,9 +9467,11 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* Write data into the attribute */ attr_value = u + 1; @@ -9072,36 +9483,42 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* Write data into the attribute */ big_value[0] = u + 1; ret = H5Awrite(attr, attr_tid, big_value); CHECK(ret, FAIL, "H5Awrite"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + if (vol_is_native) { + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } } /* end else */ /* Close attribute */ ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + if (u < max_compact) + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + else + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Alternate between creating "small" & "big" attributes */ if (u % 2) { @@ -9109,9 +9526,11 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* Write data into the attribute */ attr_value = u + 1; @@ -9123,36 +9542,42 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* Write data into the attribute */ big_value[0] = u + 1; ret = H5Awrite(attr, attr_tid, big_value); CHECK(ret, FAIL, "H5Awrite"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); + if (vol_is_native) { + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); + } } /* end else */ /* Close attribute */ ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset2); + if (u < max_compact) + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + else + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Create new attribute name */ snprintf(attrname2, sizeof(attrname2), "new attr %02u", u); @@ -9167,21 +9592,23 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) attr = H5Aopen(dataset2, attrname2, H5P_DEFAULT); CHECK(attr, FAIL, "H5Aopen"); - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ + if (vol_is_native) { + if (u % 2) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* end if */ + else { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); + + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* end else */ + } /* Close attribute */ ret = H5Aclose(attr); @@ -9191,21 +9618,23 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) attr = H5Aopen(dataset, attrname, H5P_DEFAULT); CHECK(attr, FAIL, "H5Aopen"); - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ + if (vol_is_native) { + if (u % 2) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* end if */ + else { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); + + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* end else */ + } /* Close attribute */ ret = H5Aclose(attr); @@ -9221,21 +9650,23 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) attr = H5Aopen(dataset2, attrname, H5P_DEFAULT); CHECK(attr, FAIL, "H5Aopen"); - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); - } /* end else */ + if (vol_is_native) { + if (u % 2) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* end if */ + else { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); + + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); + } /* end else */ + } /* Close attribute */ ret = H5Aclose(attr); @@ -9245,21 +9676,23 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) attr = H5Aopen(dataset, attrname, H5P_DEFAULT); CHECK(attr, FAIL, "H5Aopen"); - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); - } /* end else */ + if (vol_is_native) { + if (u % 2) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* end if */ + else { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); + + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); + } /* end else */ + } /* Close attribute */ ret = H5Aclose(attr); @@ -9277,7 +9710,7 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Dclose"); /* Check on shared message status now */ - if (test_shared != 0) { + if (vol_is_native && (test_shared != 0)) { if (test_shared == 1) { /* Check on datatype storage status */ ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); @@ -9303,28 +9736,30 @@ test_attr_shared_rename(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Ldelete"); } /* end if */ - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); + if (vol_is_native) { + /* Check on attribute storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ + if (test_shared != 0) { + /* Check on datatype storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); + CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); + VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); + + /* Check on dataspace storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); + CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); + VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); + } /* end if */ + } /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -9369,9 +9804,10 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) size_t mesg_count; /* # of shared messages */ unsigned test_shared; /* Index over shared component type */ unsigned u; /* Local index variable */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Deleting Shared & Unshared Attributes in Compact & Dense Storage\n")); @@ -9428,6 +9864,9 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close FCPL copy */ ret = H5Pclose(my_fcpl); CHECK(ret, FAIL, "H5Pclose"); @@ -9436,10 +9875,12 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -9468,7 +9909,7 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) CHECK(dataset2, FAIL, "H5Dcreate2"); /* Check on dataset's message storage status */ - if (test_shared != 0) { + if (vol_is_native && (test_shared != 0)) { /* Datasets' datatypes can be shared */ ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); @@ -9488,11 +9929,13 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on datasets' attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + is_dense = H5O__is_attr_dense_test(dataset2); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add attributes to each dataset, until after converting to dense storage */ for (u = 0; u < max_compact * 2; u++) { @@ -9505,9 +9948,11 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* Write data into the attribute */ attr_value = u + 1; @@ -9519,36 +9964,42 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* Write data into the attribute */ big_value[0] = u + 1; ret = H5Awrite(attr, attr_tid, big_value); CHECK(ret, FAIL, "H5Awrite"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + if (vol_is_native) { + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } } /* end else */ /* Close attribute */ ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + if (u < max_compact) + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + else + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Alternate between creating "small" & "big" attributes */ if (u % 2) { @@ -9556,9 +10007,11 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* Write data into the attribute */ attr_value = u + 1; @@ -9570,36 +10023,42 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* Write data into the attribute */ big_value[0] = u + 1; ret = H5Awrite(attr, attr_tid, big_value); CHECK(ret, FAIL, "H5Awrite"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); + if (vol_is_native) { + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); + } } /* end else */ /* Close attribute */ ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset2); + if (u < max_compact) + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + else + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } } /* end for */ /* Delete attributes from second dataset */ @@ -9617,21 +10076,23 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) attr = H5Aopen(dataset, attrname, H5P_DEFAULT); CHECK(attr, FAIL, "H5Aopen"); - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ + if (vol_is_native) { + if (u % 2) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* end if */ + else { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); + + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* end else */ + } /* Close attribute */ ret = H5Aclose(attr); @@ -9649,7 +10110,7 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Dclose"); /* Check on shared message status now */ - if (test_shared != 0) { + if (vol_is_native && (test_shared != 0)) { if (test_shared == 1) { /* Check on datatype storage status */ ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); @@ -9675,28 +10136,30 @@ test_attr_shared_delete(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Ldelete"); } /* end if */ - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); + if (vol_is_native) { + /* Check on attribute storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ + if (test_shared != 0) { + /* Check on datatype storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); + CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); + VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); + + /* Check on dataspace storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); + CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); + VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); + } /* end if */ + } /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -9741,9 +10204,10 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) size_t mesg_count; /* # of shared messages */ unsigned test_shared; /* Index over shared component type */ unsigned u; /* Local index variable */ - h5_stat_size_t empty_filesize; /* Size of empty file */ + h5_stat_size_t empty_filesize = 0; /* Size of empty file */ h5_stat_size_t filesize; /* Size of file after modifications */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Unlinking Object with Shared Attributes in Compact & Dense Storage\n")); @@ -9800,6 +10264,9 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, my_fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close FCPL copy */ ret = H5Pclose(my_fcpl); CHECK(ret, FAIL, "H5Pclose"); @@ -9808,10 +10275,12 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - /* Get size of file */ - empty_filesize = h5_get_file_size(FILENAME, fapl); - if (empty_filesize < 0) - TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + if (vol_is_native) { + /* Get size of file */ + empty_filesize = h5_get_file_size(FILENAME, fapl); + if (empty_filesize < 0) + TestErrPrintf("Line %d: file size wrong!\n", __LINE__); + } /* Re-open file */ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl); @@ -9840,7 +10309,7 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) CHECK(dataset2, FAIL, "H5Dcreate2"); /* Check on dataset's message storage status */ - if (test_shared != 0) { + if (vol_is_native && (test_shared != 0)) { /* Datasets' datatypes can be shared */ ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); @@ -9860,11 +10329,13 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Check on datasets' attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - is_dense = H5O__is_attr_dense_test(dataset2); - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on datasets' attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + is_dense = H5O__is_attr_dense_test(dataset2); + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + } /* Add attributes to each dataset, until after converting to dense storage */ for (u = 0; u < max_compact * 2; u++) { @@ -9877,9 +10348,11 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* Write data into the attribute */ attr_value = u + 1; @@ -9891,36 +10364,42 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* ChecFk that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); + if (vol_is_native) { + /* ChecFk that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* Write data into the attribute */ big_value[0] = u + 1; ret = H5Awrite(attr, attr_tid, big_value); CHECK(ret, FAIL, "H5Awrite"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + if (vol_is_native) { + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } } /* end else */ /* Close attribute */ ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + if (u < max_compact) + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + else + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Alternate between creating "small" & "big" attributes */ if (u % 2) { @@ -9928,9 +10407,11 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset2, attrname, attr_tid, sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* Write data into the attribute */ attr_value = u + 1; @@ -9942,36 +10423,42 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) attr = H5Acreate2(dataset2, attrname, attr_tid, big_sid, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr, FAIL, "H5Acreate2"); - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); + if (vol_is_native) { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* Write data into the attribute */ big_value[0] = u + 1; ret = H5Awrite(attr, attr_tid, big_value); CHECK(ret, FAIL, "H5Awrite"); - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); + if (vol_is_native) { + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 2, "H5A__get_shared_rc_test"); + } } /* end else */ /* Close attribute */ ret = H5Aclose(attr); CHECK(ret, FAIL, "H5Aclose"); - /* Check on dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset2); - if (u < max_compact) - VERIFY(is_dense, false, "H5O__is_attr_dense_test"); - else - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset2); + if (u < max_compact) + VERIFY(is_dense, false, "H5O__is_attr_dense_test"); + else + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } } /* end for */ /* Close attribute's datatype */ @@ -9986,9 +10473,11 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) ret = H5Ldelete(fid, DSET2_NAME, H5P_DEFAULT); CHECK(ret, FAIL, "H5Ldelete"); - /* Check on first dataset's attribute storage status */ - is_dense = H5O__is_attr_dense_test(dataset); - VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + if (vol_is_native) { + /* Check on first dataset's attribute storage status */ + is_dense = H5O__is_attr_dense_test(dataset); + VERIFY(is_dense, true, "H5O__is_attr_dense_test"); + } /* Check ref count on attributes of first dataset */ for (u = 0; u < max_compact * 2; u++) { @@ -9999,21 +10488,23 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) attr = H5Aopen(dataset, attrname, H5P_DEFAULT); CHECK(attr, FAIL, "H5Aopen"); - if (u % 2) { - /* Check that attribute is not shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, false, "H5A__is_shared_test"); - } /* end if */ - else { - /* Check that attribute is shared */ - is_shared = H5A__is_shared_test(attr); - VERIFY(is_shared, true, "H5A__is_shared_test"); - - /* Check refcount for attribute */ - ret = H5A__get_shared_rc_test(attr, &shared_refcount); - CHECK(ret, FAIL, "H5A__get_shared_rc_test"); - VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); - } /* end else */ + if (vol_is_native) { + if (u % 2) { + /* Check that attribute is not shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, false, "H5A__is_shared_test"); + } /* end if */ + else { + /* Check that attribute is shared */ + is_shared = H5A__is_shared_test(attr); + VERIFY(is_shared, true, "H5A__is_shared_test"); + + /* Check refcount for attribute */ + ret = H5A__get_shared_rc_test(attr, &shared_refcount); + CHECK(ret, FAIL, "H5A__get_shared_rc_test"); + VERIFY(shared_refcount, 1, "H5A__get_shared_rc_test"); + } /* end else */ + } /* Close attribute */ ret = H5Aclose(attr); @@ -10034,28 +10525,30 @@ test_attr_shared_unlink(hid_t fcpl, hid_t fapl) CHECK(ret, FAIL, "H5Ldelete"); } /* end if */ - /* Check on attribute storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - - if (test_shared != 0) { - /* Check on datatype storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); + if (vol_is_native) { + /* Check on attribute storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_ATTR_ID, &mesg_count); CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - /* Check on dataspace storage status */ - ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); - CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); - VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); - } /* end if */ + if (test_shared != 0) { + /* Check on datatype storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_DTYPE_ID, &mesg_count); + CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); + VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); + + /* Check on dataspace storage status */ + ret = H5F__get_sohm_mesg_count_test(fid, H5O_SDSPACE_ID, &mesg_count); + CHECK(ret, FAIL, "H5F__get_sohm_mesg_count_test"); + VERIFY(mesg_count, 0, "H5F__get_sohm_mesg_count_test"); + } /* end if */ + } /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); - if (h5_using_default_driver(NULL)) { + if (vol_is_native && h5_using_default_driver(NULL)) { /* Check size of file */ filesize = h5_get_file_size(FILENAME, fapl); VERIFY(filesize, empty_filesize, "h5_get_file_size"); @@ -10825,16 +11318,26 @@ test_attr_bug7(hid_t fcpl, hid_t fapl) hsize_t dims_s = 140; /* Small attribute dimensions */ hsize_t dims_l = 65480; /* Large attribute dimensions */ H5A_info_t ainfo; /* Attribute info */ - herr_t ret; /* Generic return status */ + bool vol_is_native; + herr_t ret; /* Generic return status */ /* Output message about test being performed */ MESSAGE(5, ("Testing adding and deleting large attributes\n")); + fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); + CHECK(fid, FAIL, "H5Fcreate"); + + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create committed datatype to operate on. Use a committed datatype so that * there is nothing after the object header and the first chunk can expand and * contract as necessary. */ - fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(fid, FAIL, "H5Fcreate"); tid = H5Tcopy(H5T_STD_I32LE); CHECK(tid, FAIL, "H5Tcopy"); ret = H5Tcommit2(fid, TYPE1_NAME, tid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); @@ -11337,7 +11840,8 @@ test_attr_delete_last_dense(hid_t fcpl, hid_t fapl) hsize_t dim2[2] = {DIM0, DIM1}; /* Dimension sizes */ int i, j; /* Local index variables */ double *data = NULL; /* Pointer to the data buffer */ - herr_t ret; /* Generic return status */ + bool vol_is_native; + herr_t ret; /* Generic return status */ /* Output message about test being performed */ MESSAGE(5, ("Testing Deleting the last large attribute stored densely\n")); @@ -11346,6 +11850,14 @@ test_attr_delete_last_dense(hid_t fcpl, hid_t fapl) fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create the group */ gid = H5Gcreate2(fid, GRPNAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(gid, FAIL, "H5Gcreate"); diff --git a/test/testhdf5.c b/test/testhdf5.c index 93da1d8..660fee9 100644 --- a/test/testhdf5.c +++ b/test/testhdf5.c @@ -37,6 +37,15 @@ int main(int argc, char *argv[]) { + hid_t fapl_id = H5I_INVALID_HID; + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + CHECK(fapl_id, H5I_INVALID_HID, "H5Pcreate"); + + CHECK(H5Pget_vol_cap_flags(fapl_id, &vol_cap_flags_g), FAIL, "H5Pget_vol_cap_flags"); + + H5Pclose(fapl_id); + /* Initialize testing framework */ TestInit(argv[0], NULL, NULL); diff --git a/test/tfile.c b/test/tfile.c index 24cc7ce..0f5bbd3 100644 --- a/test/tfile.c +++ b/test/tfile.c @@ -233,6 +233,11 @@ test_file_create(void) /* Output message about test being performed */ MESSAGE(5, ("Testing Low-Level File Creation I/O\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* First ensure the file does not exist */ H5E_BEGIN_TRY { @@ -540,6 +545,7 @@ test_file_open(const char *env_h5_drvr) unsigned iparm; unsigned iparm2; unsigned intent; + bool vol_is_native; herr_t ret; /*generic return value */ /* @@ -557,6 +563,9 @@ test_file_open(const char *env_h5_drvr) fid1 = H5Fopen(FILE2, H5F_ACC_RDWR, H5P_DEFAULT); CHECK(fid1, FAIL, "H5Fopen"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid1, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Get the intent */ ret = H5Fget_intent(fid1, &intent); CHECK(ret, FAIL, "H5Fget_intent"); @@ -598,57 +607,59 @@ test_file_open(const char *env_h5_drvr) /* Output message about test being performed */ MESSAGE(5, ("Testing 2 File Openings\n")); - /* Create file access property list */ - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - CHECK(fapl_id, FAIL, "H5Pcreate"); + if (vol_is_native) { + /* Create file access property list */ + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + CHECK(fapl_id, FAIL, "H5Pcreate"); - /* Set file close mode to H5F_CLOSE_WEAK */ - ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_WEAK); - CHECK(ret, FAIL, "H5Pset_fclose_degree"); + /* Set file close mode to H5F_CLOSE_WEAK */ + ret = H5Pset_fclose_degree(fapl_id, H5F_CLOSE_WEAK); + CHECK(ret, FAIL, "H5Pset_fclose_degree"); - /* Open file for first time */ - fid1 = H5Fopen(FILE2, H5F_ACC_RDONLY, fapl_id); - CHECK(fid1, FAIL, "H5Fopen"); + /* Open file for first time */ + fid1 = H5Fopen(FILE2, H5F_ACC_RDONLY, fapl_id); + CHECK(fid1, FAIL, "H5Fopen"); - /* Check the intent */ - ret = H5Fget_intent(fid1, &intent); - CHECK(ret, FAIL, "H5Fget_intent"); - VERIFY(intent, H5F_ACC_RDONLY, "H5Fget_intent"); + /* Check the intent */ + ret = H5Fget_intent(fid1, &intent); + CHECK(ret, FAIL, "H5Fget_intent"); + VERIFY(intent, H5F_ACC_RDONLY, "H5Fget_intent"); - /* Open dataset */ - did = H5Dopen2(fid1, F2_DSET, H5P_DEFAULT); - CHECK(did, FAIL, "H5Dopen2"); + /* Open dataset */ + did = H5Dopen2(fid1, F2_DSET, H5P_DEFAULT); + CHECK(did, FAIL, "H5Dopen2"); - /* Check that the intent works even if NULL is passed in */ - ret = H5Fget_intent(fid1, NULL); - CHECK(ret, FAIL, "H5Fget_intent"); + /* Check that the intent works even if NULL is passed in */ + ret = H5Fget_intent(fid1, NULL); + CHECK(ret, FAIL, "H5Fget_intent"); - /* Close first open */ - ret = H5Fclose(fid1); - CHECK(ret, FAIL, "H5Fclose"); + /* Close first open */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); - /* Open file for second time, which should fail. */ - H5E_BEGIN_TRY - { - fid2 = H5Fopen(FILE2, H5F_ACC_RDWR, fapl_id); - } - H5E_END_TRY - VERIFY(fid2, FAIL, "H5Fopen"); + /* Open file for second time, which should fail. */ + H5E_BEGIN_TRY + { + fid2 = H5Fopen(FILE2, H5F_ACC_RDWR, fapl_id); + } + H5E_END_TRY + VERIFY(fid2, FAIL, "H5Fopen"); - /* Check that the intent fails for an invalid ID */ - H5E_BEGIN_TRY - { - ret = H5Fget_intent(fid1, &intent); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fget_intent"); + /* Check that the intent fails for an invalid ID */ + H5E_BEGIN_TRY + { + ret = H5Fget_intent(fid1, &intent); + } + H5E_END_TRY + VERIFY(ret, FAIL, "H5Fget_intent"); - /* Close dataset from first open */ - ret = H5Dclose(did); - CHECK(ret, FAIL, "H5Dclose"); + /* Close dataset from first open */ + ret = H5Dclose(did); + CHECK(ret, FAIL, "H5Dclose"); - ret = H5Pclose(fapl_id); - CHECK(ret, FAIL, "H5Pclose"); + ret = H5Pclose(fapl_id); + CHECK(ret, FAIL, "H5Pclose"); + } } /* test_file_open() */ /**************************************************************** @@ -722,6 +733,7 @@ test_file_close(void) hid_t fapl_id, access_id; hid_t dataset_id, group_id1, group_id2, group_id3; H5F_close_degree_t fc_degree; + bool vol_is_native; herr_t ret; /* Output message about test being performed */ @@ -733,6 +745,14 @@ test_file_close(void) fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid1, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid1, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid1), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + fapl_id = H5Pcreate(H5P_FILE_ACCESS); CHECK(fapl_id, FAIL, "H5Pcreate"); @@ -1164,6 +1184,118 @@ create_objects(hid_t fid1, hid_t fid2, hid_t *ret_did, hid_t *ret_gid1, hid_t *r /**************************************************************** ** +** test_obj_count_and_id(): test object count and ID list functions. +** +****************************************************************/ +static void +test_obj_count_and_id(hid_t fid1, hid_t fid2, hid_t did, hid_t gid1, hid_t gid2, hid_t gid3) +{ + hid_t fid3, fid4; + ssize_t oid_count, ret_count; + herr_t ret; + + /* Create two new files */ + fid3 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + CHECK(fid3, FAIL, "H5Fcreate"); + fid4 = H5Fcreate(FILE3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + CHECK(fid4, FAIL, "H5Fcreate"); + + /* test object count of all files IDs open */ + oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_FILE); + CHECK(oid_count, FAIL, "H5Fget_obj_count"); + VERIFY(oid_count, OBJ_ID_COUNT_4, "H5Fget_obj_count"); + + /* test object count of all datasets open */ + oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_DATASET); + CHECK(oid_count, FAIL, "H5Fget_obj_count"); + VERIFY(oid_count, OBJ_ID_COUNT_1, "H5Fget_obj_count"); + + /* test object count of all groups open */ + oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_GROUP); + CHECK(oid_count, FAIL, "H5Fget_obj_count"); + VERIFY(oid_count, OBJ_ID_COUNT_3, "H5Fget_obj_count"); + + /* test object count of all named datatypes open */ + oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_DATATYPE); + CHECK(oid_count, FAIL, "H5Fget_obj_count"); + VERIFY(oid_count, OBJ_ID_COUNT_0, "H5Fget_obj_count"); + + /* test object count of all attributes open */ + oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_ATTR); + CHECK(oid_count, FAIL, "H5Fget_obj_count"); + VERIFY(oid_count, OBJ_ID_COUNT_0, "H5Fget_obj_count"); + + /* test object count of all objects currently open */ + oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL); + CHECK(oid_count, FAIL, "H5Fget_obj_count"); + VERIFY(oid_count, OBJ_ID_COUNT_8, "H5Fget_obj_count"); + + if (oid_count > 0) { + hid_t *oid_list; + + oid_list = (hid_t *)calloc((size_t)oid_count, sizeof(hid_t)); + if (oid_list != NULL) { + int i; + + ret_count = H5Fget_obj_ids((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL, (size_t)oid_count, oid_list); + CHECK(ret_count, FAIL, "H5Fget_obj_ids"); + + for (i = 0; i < oid_count; i++) { + H5I_type_t id_type; + + id_type = H5Iget_type(oid_list[i]); + switch (id_type) { + case H5I_FILE: + if (oid_list[i] != fid1 && oid_list[i] != fid2 && oid_list[i] != fid3 && + oid_list[i] != fid4) + ERROR("H5Fget_obj_ids"); + break; + + case H5I_GROUP: + if (oid_list[i] != gid1 && oid_list[i] != gid2 && oid_list[i] != gid3) + ERROR("H5Fget_obj_ids"); + break; + + case H5I_DATASET: + VERIFY(oid_list[i], did, "H5Fget_obj_ids"); + break; + + case H5I_MAP: + /* TODO: Not supported in native VOL connector yet */ + + case H5I_UNINIT: + case H5I_BADID: + case H5I_DATATYPE: + case H5I_DATASPACE: + case H5I_ATTR: + case H5I_VFL: + case H5I_VOL: + case H5I_GENPROP_CLS: + case H5I_GENPROP_LST: + case H5I_ERROR_CLASS: + case H5I_ERROR_MSG: + case H5I_ERROR_STACK: + case H5I_SPACE_SEL_ITER: + case H5I_EVENTSET: + case H5I_NTYPES: + default: + ERROR("H5Fget_obj_ids"); + } /* end switch */ + } /* end for */ + + free(oid_list); + } /* end if */ + } /* end if */ + + /* close the two new files */ + ret = H5Fclose(fid3); + CHECK(ret, FAIL, "H5Fclose"); + ret = H5Fclose(fid4); + CHECK(ret, FAIL, "H5Fclose"); +} + +/**************************************************************** +** ** test_get_obj_ids(): Test the bug and the fix for Jira 8528. ** H5Fget_obj_ids overfilled the list of ** object IDs by one. This is an enhancement @@ -1185,6 +1317,11 @@ test_get_obj_ids(void) MESSAGE(5, ("Testing retrieval of object IDs\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_MORE)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create a new file */ fid = H5Fcreate(FILE7, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); @@ -1460,118 +1597,6 @@ check_file_id(hid_t fid, hid_t object_id) /**************************************************************** ** -** test_obj_count_and_id(): test object count and ID list functions. -** -****************************************************************/ -static void -test_obj_count_and_id(hid_t fid1, hid_t fid2, hid_t did, hid_t gid1, hid_t gid2, hid_t gid3) -{ - hid_t fid3, fid4; - ssize_t oid_count, ret_count; - herr_t ret; - - /* Create two new files */ - fid3 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid3, FAIL, "H5Fcreate"); - fid4 = H5Fcreate(FILE3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid4, FAIL, "H5Fcreate"); - - /* test object count of all files IDs open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_FILE); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_4, "H5Fget_obj_count"); - - /* test object count of all datasets open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_DATASET); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_1, "H5Fget_obj_count"); - - /* test object count of all groups open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_GROUP); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_3, "H5Fget_obj_count"); - - /* test object count of all named datatypes open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_DATATYPE); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_0, "H5Fget_obj_count"); - - /* test object count of all attributes open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_ATTR); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_0, "H5Fget_obj_count"); - - /* test object count of all objects currently open */ - oid_count = H5Fget_obj_count((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL); - CHECK(oid_count, FAIL, "H5Fget_obj_count"); - VERIFY(oid_count, OBJ_ID_COUNT_8, "H5Fget_obj_count"); - - if (oid_count > 0) { - hid_t *oid_list; - - oid_list = (hid_t *)calloc((size_t)oid_count, sizeof(hid_t)); - if (oid_list != NULL) { - int i; - - ret_count = H5Fget_obj_ids((hid_t)H5F_OBJ_ALL, H5F_OBJ_ALL, (size_t)oid_count, oid_list); - CHECK(ret_count, FAIL, "H5Fget_obj_ids"); - - for (i = 0; i < oid_count; i++) { - H5I_type_t id_type; - - id_type = H5Iget_type(oid_list[i]); - switch (id_type) { - case H5I_FILE: - if (oid_list[i] != fid1 && oid_list[i] != fid2 && oid_list[i] != fid3 && - oid_list[i] != fid4) - ERROR("H5Fget_obj_ids"); - break; - - case H5I_GROUP: - if (oid_list[i] != gid1 && oid_list[i] != gid2 && oid_list[i] != gid3) - ERROR("H5Fget_obj_ids"); - break; - - case H5I_DATASET: - VERIFY(oid_list[i], did, "H5Fget_obj_ids"); - break; - - case H5I_MAP: - /* TODO: Not supported in native VOL connector yet */ - - case H5I_UNINIT: - case H5I_BADID: - case H5I_DATATYPE: - case H5I_DATASPACE: - case H5I_ATTR: - case H5I_VFL: - case H5I_VOL: - case H5I_GENPROP_CLS: - case H5I_GENPROP_LST: - case H5I_ERROR_CLASS: - case H5I_ERROR_MSG: - case H5I_ERROR_STACK: - case H5I_SPACE_SEL_ITER: - case H5I_EVENTSET: - case H5I_NTYPES: - default: - ERROR("H5Fget_obj_ids"); - } /* end switch */ - } /* end for */ - - free(oid_list); - } /* end if */ - } /* end if */ - - /* close the two new files */ - ret = H5Fclose(fid3); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Fclose(fid4); - CHECK(ret, FAIL, "H5Fclose"); -} - -/**************************************************************** -** ** test_file_perm(): low-level file test routine. ** This test verifies that a file can be opened for both ** read-only and read-write access and things will be handled @@ -1736,6 +1761,7 @@ test_file_is_accessible(const char *env_h5_drvr) unsigned char buf[1024]; /* Buffer of data to write */ htri_t is_hdf5; /* Whether a file is an HDF5 file */ int posix_ret; /* Return value from POSIX calls */ + bool vol_is_native; bool driver_is_default_compatible; herr_t ret; /* Return value from HDF5 calls */ @@ -1765,6 +1791,9 @@ test_file_is_accessible(const char *env_h5_drvr) fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl_id, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); @@ -1828,7 +1857,7 @@ test_file_is_accessible(const char *env_h5_drvr) VERIFY(is_hdf5, true, "H5Fis_accessible"); } /* end if */ - if (driver_is_default_compatible) { + if (vol_is_native && driver_is_default_compatible) { /***********************/ /* EMPTY non-HDF5 file */ /***********************/ @@ -1902,7 +1931,8 @@ test_file_ishdf5(const char *env_h5_drvr) unsigned char buf[1024]; /* Buffer of data to write */ htri_t is_hdf5; /* Whether a file is an HDF5 file */ int posix_ret; /* Return value from POSIX calls */ - herr_t ret; /* Return value from HDF5 calls */ + bool vol_is_native; + herr_t ret; /* Return value from HDF5 calls */ if (!h5_using_default_driver(env_h5_drvr)) return; @@ -1930,6 +1960,15 @@ test_file_ishdf5(const char *env_h5_drvr) fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl_id, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Pclose(fapl_id), FAIL, "H5Pclose"); + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Close file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); @@ -2017,6 +2056,7 @@ test_file_delete(hid_t fapl_id) htri_t is_hdf5; /* Whether a file is an HDF5 file */ int fd; /* POSIX file descriptor */ int iret; + bool vol_is_native; herr_t ret; /* Output message about test being performed */ @@ -2033,6 +2073,9 @@ test_file_delete(hid_t fapl_id) fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); CHECK(fid, H5I_INVALID_HID, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl_id, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close file */ ret = H5Fclose(fid); VERIFY(ret, SUCCEED, "H5Fclose"); @@ -2054,49 +2097,50 @@ test_file_delete(hid_t fapl_id) H5E_END_TRY VERIFY(is_hdf5, FAIL, "H5Fis_accessible"); - /* Just in case deletion fails - silent on errors */ - h5_delete_test_file(FILE_DELETE, fapl_id); + if (vol_is_native) { + /* Just in case deletion fails - silent on errors */ + h5_delete_test_file(FILE_DELETE, fapl_id); - /*****************/ - /* NON-HDF5 FILE */ - /*****************/ + /*****************/ + /* NON-HDF5 FILE */ + /*****************/ - /* Get fapl-dependent filename */ - h5_fixname(FILE_DELETE_NOT_HDF5, fapl_id, filename, sizeof(filename)); + /* Get fapl-dependent filename */ + h5_fixname(FILE_DELETE_NOT_HDF5, fapl_id, filename, sizeof(filename)); - /* Create a non-HDF5 file */ - fd = HDopen(filename, O_RDWR | O_CREAT | O_TRUNC, H5_POSIX_CREATE_MODE_RW); - CHECK_I(fd, "HDopen"); + /* Create a non-HDF5 file */ + fd = HDopen(filename, O_RDWR | O_CREAT | O_TRUNC, H5_POSIX_CREATE_MODE_RW); + CHECK_I(fd, "HDopen"); - /* Close the file */ - ret = HDclose(fd); - VERIFY(ret, 0, "HDclose"); - - /* Verify that the file is not an HDF5 file */ - /* Note that you can get a FAIL result when h5_fixname() - * perturbs the filename as a file with that exact name - * may not have been created since we created it with - * open(2) and not the library. - */ - H5E_BEGIN_TRY - { - is_hdf5 = H5Fis_accessible(filename, fapl_id); - } - H5E_END_TRY - CHECK(is_hdf5, true, "H5Fis_accessible"); + /* Close the file */ + ret = HDclose(fd); + VERIFY(ret, 0, "HDclose"); - /* Try to delete it (should fail) */ - H5E_BEGIN_TRY - { - ret = H5Fdelete(filename, fapl_id); - } - H5E_END_TRY - VERIFY(ret, FAIL, "H5Fdelete"); + /* Verify that the file is not an HDF5 file */ + /* Note that you can get a FAIL result when h5_fixname() + * perturbs the filename as a file with that exact name + * may not have been created since we created it with + * open(2) and not the library. + */ + H5E_BEGIN_TRY + { + is_hdf5 = H5Fis_accessible(filename, fapl_id); + } + H5E_END_TRY + CHECK(is_hdf5, true, "H5Fis_accessible"); - /* Delete the file */ - iret = HDremove(filename); - VERIFY(iret, 0, "HDremove"); + /* Try to delete it (should fail) */ + H5E_BEGIN_TRY + { + ret = H5Fdelete(filename, fapl_id); + } + H5E_END_TRY + VERIFY(ret, FAIL, "H5Fdelete"); + /* Delete the file */ + iret = HDremove(filename); + VERIFY(iret, 0, "HDremove"); + } } /* end test_file_delete() */ /**************************************************************** @@ -2263,6 +2307,11 @@ test_file_open_overlap(void) /* Output message about test being performed */ MESSAGE(5, ("Testing opening overlapping file opens\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_MORE)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create file */ fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid1, FAIL, "H5Fcreate"); @@ -2623,6 +2672,11 @@ test_file_double_file_dataset_open(bool new_format) /* Output message about test being performed */ MESSAGE(5, ("Testing double file and dataset open/close\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Setting up test file */ fapl = h5_fileaccess(); CHECK(fapl, FAIL, "H5Pcreate"); @@ -3011,7 +3065,8 @@ test_userblock_file_size(const char *env_h5_drvr) hsize_t dims[2] = {3, 4}; hsize_t filesize1, filesize2, filesize; unsigned long fileno1, fileno2; /* File number */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Don't run with multi/split, family or direct drivers */ if (!strcmp(env_h5_drvr, "multi") || !strcmp(env_h5_drvr, "split") || !strcmp(env_h5_drvr, "family") || @@ -3021,6 +3076,11 @@ test_userblock_file_size(const char *env_h5_drvr) /* Output message about test being performed */ MESSAGE(5, ("Testing file size with user block\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_MORE)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create property list with userblock size set */ fcpl2_id = H5Pcreate(H5P_FILE_CREATE); CHECK(fcpl2_id, FAIL, "H5Pcreate"); @@ -3033,6 +3093,9 @@ test_userblock_file_size(const char *env_h5_drvr) file2_id = H5Fcreate(FILE2, H5F_ACC_TRUNC, fcpl2_id, H5P_DEFAULT); CHECK(file2_id, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, file1_id, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Check the file numbers */ fileno1 = 0; ret = H5Fget_fileno(file1_id, &fileno1); @@ -3084,15 +3147,17 @@ test_userblock_file_size(const char *env_h5_drvr) file2_id = H5Fopen(FILE2, H5F_ACC_RDWR, H5P_DEFAULT); CHECK(file2_id, FAIL, "H5Fopen"); - /* Check file sizes */ - ret = H5Fget_filesize(file1_id, &filesize1); - CHECK(ret, FAIL, "H5Fget_filesize"); - ret = H5Fget_filesize(file2_id, &filesize2); - CHECK(ret, FAIL, "H5Fget_filesize"); + if (vol_is_native) { + /* Check file sizes */ + ret = H5Fget_filesize(file1_id, &filesize1); + CHECK(ret, FAIL, "H5Fget_filesize"); + ret = H5Fget_filesize(file2_id, &filesize2); + CHECK(ret, FAIL, "H5Fget_filesize"); - /* Verify that the file sizes differ exactly by the userblock size */ - VERIFY_TYPE((unsigned long long)filesize2, (unsigned long long)(filesize1 + USERBLOCK_SIZE), - unsigned long long, "%llu", "H5Fget_filesize"); + /* Verify that the file sizes differ exactly by the userblock size */ + VERIFY_TYPE((unsigned long long)filesize2, (unsigned long long)(filesize1 + USERBLOCK_SIZE), + unsigned long long, "%llu", "H5Fget_filesize"); + } /* Close files */ ret = H5Fclose(file1_id); @@ -3106,13 +3171,15 @@ test_userblock_file_size(const char *env_h5_drvr) file2_id = H5Fopen(FILE2, H5F_ACC_RDWR, H5P_DEFAULT); CHECK(file2_id, FAIL, "H5Fopen"); - /* Verify file sizes did not change */ - ret = H5Fget_filesize(file1_id, &filesize); - CHECK(ret, FAIL, "H5Fget_filesize"); - VERIFY(filesize, filesize1, "H5Fget_filesize"); - ret = H5Fget_filesize(file2_id, &filesize); - CHECK(ret, FAIL, "H5Fget_filesize"); - VERIFY(filesize, filesize2, "H5Fget_filesize"); + if (vol_is_native) { + /* Verify file sizes did not change */ + ret = H5Fget_filesize(file1_id, &filesize); + CHECK(ret, FAIL, "H5Fget_filesize"); + VERIFY(filesize, filesize1, "H5Fget_filesize"); + ret = H5Fget_filesize(file2_id, &filesize); + CHECK(ret, FAIL, "H5Fget_filesize"); + VERIFY(filesize, filesize2, "H5Fget_filesize"); + } /* Close files */ ret = H5Fclose(file1_id); @@ -3135,6 +3202,7 @@ test_cached_stab_info(void) { hid_t file_id; hid_t group_id; + bool vol_is_native; herr_t ret; /* Generic return value */ /* Output message about test being performed */ @@ -3144,6 +3212,14 @@ test_cached_stab_info(void) file_id = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(file_id, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, file_id, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(file_id), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create group */ group_id = H5Gcreate2(file_id, GROUP1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(group_id, FAIL, "H5Gcreate2"); @@ -3229,6 +3305,7 @@ test_rw_noupdate(void) herr_t ret; /* Generic return value */ hid_t fid; /* File ID */ uint32_t chksum1, chksum2; /* Checksum value */ + bool vol_is_native; /* Output message about test being performed */ MESSAGE(5, ("Testing to verify that nothing is written if nothing is changed.\n")); @@ -3237,6 +3314,14 @@ test_rw_noupdate(void) fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Close the file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); @@ -3273,12 +3358,20 @@ test_userblock_alignment_helper1(hid_t fcpl, hid_t fapl) { hid_t fid; /* File ID */ int curr_num_errs = GetTestNumErrs(); /* Retrieve the current # of errors */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Create a file with FAPL & FCPL */ fid = H5Fcreate(FILE1, H5F_ACC_TRUNC, fcpl, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + return 0; + } + /* Only proceed further if file ID is OK */ if (fid > 0) { hid_t gid; /* Group ID */ @@ -3331,12 +3424,20 @@ test_userblock_alignment_helper2(hid_t fapl, bool open_rw) { hid_t fid; /* File ID */ int curr_num_errs = GetTestNumErrs(); /* Retrieve the current # of errors */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Re-open file */ fid = H5Fopen(FILE1, (open_rw ? H5F_ACC_RDWR : H5F_ACC_RDONLY), fapl); CHECK(fid, FAIL, "H5Fopen"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + return 0; + } + /* Only proceed further if file ID is OK */ if (fid > 0) { hid_t gid; /* Group ID */ @@ -4052,7 +4153,8 @@ test_filespace_info(const char *env_h5_drvr) hsize_t fsp_size; /* File space page size */ char filename[FILENAME_LEN]; /* Filename to use */ bool contig_addr_vfd; /* Whether VFD used has a contiguous address space */ - herr_t ret; /* Return value */ + bool vol_is_native; + herr_t ret; /* Return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing file creation public routines: H5Pget/set_file_space_strategy & " @@ -4063,6 +4165,13 @@ test_filespace_info(const char *env_h5_drvr) fapl = h5_fileaccess(); h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Get a copy of the file access property list */ new_fapl = H5Pcopy(fapl); CHECK(new_fapl, FAIL, "H5Pcopy"); @@ -4465,143 +4574,151 @@ test_file_freespace(const char *env_h5_drvr) bool split_vfd, multi_vfd; /* Indicate multi/split driver */ hsize_t expected_freespace; /* Freespace expected */ hsize_t expected_fs_del; /* Freespace expected after delete */ - herr_t ret; /* Return value */ + bool vol_is_native; + herr_t ret; /* Return value */ split_vfd = !strcmp(env_h5_drvr, "split"); multi_vfd = !strcmp(env_h5_drvr, "multi"); - if (!split_vfd && !multi_vfd) { - fapl = h5_fileaccess(); - h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename); - - new_fapl = H5Pcopy(fapl); - CHECK(new_fapl, FAIL, "H5Pcopy"); + if (split_vfd || multi_vfd) + return; - /* Set the "use the latest version of the format" bounds */ - ret = H5Pset_libver_bounds(new_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); + fapl = h5_fileaccess(); + h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename); - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); + new_fapl = H5Pcopy(fapl); + CHECK(new_fapl, FAIL, "H5Pcopy"); - /* Test with old & new format */ - for (new_format = false; new_format <= true; new_format++) { - hid_t my_fapl; + /* Set the "use the latest version of the format" bounds */ + ret = H5Pset_libver_bounds(new_fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); + CHECK(ret, FAIL, "H5Pset_libver_bounds"); - /* Set the FAPL for the type of format */ - if (new_format) { - MESSAGE(5, ("Testing with new group format\n")); + fcpl = H5Pcreate(H5P_FILE_CREATE); + CHECK(fcpl, FAIL, "H5Pcreate"); - my_fapl = new_fapl; + /* Test with old & new format */ + for (new_format = false; new_format <= true; new_format++) { + hid_t my_fapl; - if (multi_vfd || split_vfd) { - ret = set_multi_split(new_fapl, FSP_SIZE_DEF, split_vfd); - CHECK(ret, FAIL, "set_multi_split"); - } + /* Set the FAPL for the type of format */ + if (new_format) { + MESSAGE(5, ("Testing with new group format\n")); - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, false, (hsize_t)1); - CHECK(ret, FAIL, "H5P_set_file_space_strategy"); + my_fapl = new_fapl; - expected_freespace = 4534; - if (split_vfd) - expected_freespace = 427; - if (multi_vfd) - expected_freespace = 248; - expected_fs_del = 0; - } /* end if */ - else { - MESSAGE(5, ("Testing with old group format\n")); - /* Default: non-paged aggregation, non-persistent free-space */ - my_fapl = fapl; - expected_freespace = 2464; - if (split_vfd) - expected_freespace = 264; - if (multi_vfd) - expected_freespace = 0; - expected_fs_del = 4096; - - } /* end else */ - - /* Create an "empty" file */ - file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, my_fapl); - CHECK(file, FAIL, "H5Fcreate"); + if (multi_vfd || split_vfd) { + ret = set_multi_split(new_fapl, FSP_SIZE_DEF, split_vfd); + CHECK(ret, FAIL, "set_multi_split"); + } - ret = H5Fclose(file); - CHECK_I(ret, "H5Fclose"); + ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, false, (hsize_t)1); + CHECK(ret, FAIL, "H5P_set_file_space_strategy"); - /* Get the "empty" file size */ - empty_filesize = h5_get_file_size(filename, H5P_DEFAULT); + expected_freespace = 4534; + if (split_vfd) + expected_freespace = 427; + if (multi_vfd) + expected_freespace = 248; + expected_fs_del = 0; + } /* end if */ + else { + MESSAGE(5, ("Testing with old group format\n")); + /* Default: non-paged aggregation, non-persistent free-space */ + my_fapl = fapl; + expected_freespace = 2464; + if (split_vfd) + expected_freespace = 264; + if (multi_vfd) + expected_freespace = 0; + expected_fs_del = 4096; - /* Re-open the file (with read-write permission) */ - file = H5Fopen(filename, H5F_ACC_RDWR, my_fapl); - CHECK_I(file, "H5Fopen"); + } /* end else */ - /* Check that the free space is 0 */ - free_space = H5Fget_freespace(file); - CHECK(free_space, FAIL, "H5Fget_freespace"); - VERIFY(free_space, 0, "H5Fget_freespace"); + /* Create an "empty" file */ + file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, my_fapl); + CHECK(file, FAIL, "H5Fcreate"); - /* Create dataspace for datasets */ - dspace = H5Screate(H5S_SCALAR); - CHECK(dspace, FAIL, "H5Screate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(my_fapl, file, &vol_is_native), FAIL, "h5_using_native_vol"); - /* Create a dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); + ret = H5Fclose(file); + CHECK_I(ret, "H5Fclose"); - /* Set the space allocation time to early */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); - CHECK(ret, FAIL, "H5Pset_alloc_time"); + if (!vol_is_native) + continue; - /* Create datasets in file */ - for (u = 0; u < 10; u++) { - snprintf(name, sizeof(name), "Dataset %u", u); - dset = H5Dcreate2(file, name, H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); + /* Get the "empty" file size */ + empty_filesize = h5_get_file_size(filename, H5P_DEFAULT); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - } /* end for */ + /* Re-open the file (with read-write permission) */ + file = H5Fopen(filename, H5F_ACC_RDWR, my_fapl); + CHECK_I(file, "H5Fopen"); - /* Close dataspace */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); + /* Check that the free space is 0 */ + free_space = H5Fget_freespace(file); + CHECK(free_space, FAIL, "H5Fget_freespace"); + VERIFY(free_space, 0, "H5Fget_freespace"); - /* Close dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); + /* Create dataspace for datasets */ + dspace = H5Screate(H5S_SCALAR); + CHECK(dspace, FAIL, "H5Screate"); - /* Check that there is the right amount of free space in the file */ - free_space = H5Fget_freespace(file); - CHECK(free_space, FAIL, "H5Fget_freespace"); - VERIFY(free_space, expected_freespace, "H5Fget_freespace"); + /* Create a dataset creation property list */ + dcpl = H5Pcreate(H5P_DATASET_CREATE); + CHECK(dcpl, FAIL, "H5Pcreate"); - /* Delete datasets in file */ - for (k = 9; k >= 0; k--) { - snprintf(name, sizeof(name), "Dataset %u", (unsigned)k); - ret = H5Ldelete(file, name, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end for */ + /* Set the space allocation time to early */ + ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); + CHECK(ret, FAIL, "H5Pset_alloc_time"); - /* Check that there is the right amount of free space in the file */ - free_space = H5Fget_freespace(file); - CHECK(free_space, FAIL, "H5Fget_freespace"); - VERIFY(free_space, expected_fs_del, "H5Fget_freespace"); + /* Create datasets in file */ + for (u = 0; u < 10; u++) { + snprintf(name, sizeof(name), "Dataset %u", u); + dset = H5Dcreate2(file, name, H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); + CHECK(dset, FAIL, "H5Dcreate2"); - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); + ret = H5Dclose(dset); + CHECK(ret, FAIL, "H5Dclose"); + } /* end for */ - /* Get the file size after modifications*/ - mod_filesize = h5_get_file_size(filename, H5P_DEFAULT); + /* Close dataspace */ + ret = H5Sclose(dspace); + CHECK(ret, FAIL, "H5Sclose"); - /* Check that the file reverted to empty size */ - VERIFY(mod_filesize, empty_filesize, "H5Fget_freespace"); + /* Close dataset creation property list */ + ret = H5Pclose(dcpl); + CHECK(ret, FAIL, "H5Pclose"); - h5_clean_files(FILESPACE_NAME, my_fapl); + /* Check that there is the right amount of free space in the file */ + free_space = H5Fget_freespace(file); + CHECK(free_space, FAIL, "H5Fget_freespace"); + VERIFY(free_space, expected_freespace, "H5Fget_freespace"); + /* Delete datasets in file */ + for (k = 9; k >= 0; k--) { + snprintf(name, sizeof(name), "Dataset %u", (unsigned)k); + ret = H5Ldelete(file, name, H5P_DEFAULT); + CHECK(ret, FAIL, "H5Ldelete"); } /* end for */ - } + + /* Check that there is the right amount of free space in the file */ + free_space = H5Fget_freespace(file); + CHECK(free_space, FAIL, "H5Fget_freespace"); + VERIFY(free_space, expected_fs_del, "H5Fget_freespace"); + + /* Close file */ + ret = H5Fclose(file); + CHECK(ret, FAIL, "H5Fclose"); + + /* Get the file size after modifications*/ + mod_filesize = h5_get_file_size(filename, H5P_DEFAULT); + + /* Check that the file reverted to empty size */ + VERIFY(mod_filesize, empty_filesize, "H5Fget_freespace"); + + h5_clean_files(FILESPACE_NAME, my_fapl); + + } /* end for */ } /* end test_file_freespace() */ @@ -4638,6 +4755,7 @@ test_sects_freespace(const char *env_h5_drvr, bool new_format) unsigned u; /* Local index variable */ H5FD_mem_t type; bool split_vfd = false, multi_vfd = false; + bool vol_is_native; herr_t ret; /* Return value */ /* Output message about test being performed */ @@ -4646,210 +4764,223 @@ test_sects_freespace(const char *env_h5_drvr, bool new_format) split_vfd = !strcmp(env_h5_drvr, "split"); multi_vfd = !strcmp(env_h5_drvr, "multi"); - if (!split_vfd && !multi_vfd) { + if (split_vfd || multi_vfd) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } - fapl = h5_fileaccess(); - h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename); + fapl = h5_fileaccess(); + h5_fixname(FILESPACE_NAME[0], fapl, filename, sizeof filename); - /* Create file-creation template */ - fcpl = H5Pcreate(H5P_FILE_CREATE); - CHECK(fcpl, FAIL, "H5Pcreate"); + /* Create file-creation template */ + fcpl = H5Pcreate(H5P_FILE_CREATE); + CHECK(fcpl, FAIL, "H5Pcreate"); - if (new_format) { - ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); - CHECK(ret, FAIL, "H5Pset_libver_bounds"); + if (new_format) { + ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); + CHECK(ret, FAIL, "H5Pset_libver_bounds"); - /* Set to paged aggregation and persistent free-space */ - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, true, (hsize_t)1); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); + /* Set to paged aggregation and persistent free-space */ + ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_PAGE, true, (hsize_t)1); + CHECK(ret, FAIL, "H5Pget_file_space_strategy"); - /* Set up paged aligned address space for multi/split driver */ - if (multi_vfd || split_vfd) { - ret = set_multi_split(fapl, FSP_SIZE_DEF, split_vfd); - CHECK(ret, FAIL, "set_multi_split"); - } - } - else { - ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, true, (hsize_t)1); - CHECK(ret, FAIL, "H5Pget_file_space_strategy"); + /* Set up paged aligned address space for multi/split driver */ + if (multi_vfd || split_vfd) { + ret = set_multi_split(fapl, FSP_SIZE_DEF, split_vfd); + CHECK(ret, FAIL, "set_multi_split"); } + } + else { + ret = H5Pset_file_space_strategy(fcpl, H5F_FSPACE_STRATEGY_FSM_AGGR, true, (hsize_t)1); + CHECK(ret, FAIL, "H5Pget_file_space_strategy"); + } - /* Create the file */ - file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl); - CHECK(file, FAIL, "H5Fcreate"); + /* Create the file */ + file = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl); + CHECK(file, FAIL, "H5Fcreate"); - /* Create a dataset creation property list */ - dcpl = H5Pcreate(H5P_DATASET_CREATE); - CHECK(dcpl, FAIL, "H5Pcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, file, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(file), FAIL, "H5Fclose"); + CHECK(H5Pclose(fcpl), FAIL, "H5Pclose"); + h5_clean_files(FILESPACE_NAME, fapl); + CHECK(H5Pclose(fapl), FAIL, "H5Pclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } - /* Set the space allocation time to early */ - ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); - CHECK(ret, FAIL, "H5Pset_alloc_time"); + /* Create a dataset creation property list */ + dcpl = H5Pcreate(H5P_DATASET_CREATE); + CHECK(dcpl, FAIL, "H5Pcreate"); - /* Create 1 large dataset */ - dims[0] = 1200; - dspace = H5Screate_simple(1, dims, NULL); - dset = H5Dcreate2(file, "Dataset_large", H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); + /* Set the space allocation time to early */ + ret = H5Pset_alloc_time(dcpl, H5D_ALLOC_TIME_EARLY); + CHECK(ret, FAIL, "H5Pset_alloc_time"); - /* Close dataset */ - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); + /* Create 1 large dataset */ + dims[0] = 1200; + dspace = H5Screate_simple(1, dims, NULL); + dset = H5Dcreate2(file, "Dataset_large", H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); + CHECK(dset, FAIL, "H5Dcreate2"); - /* Close dataspace */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); + /* Close dataset */ + ret = H5Dclose(dset); + CHECK(ret, FAIL, "H5Dclose"); - /* Create dataspace for datasets */ - dspace = H5Screate(H5S_SCALAR); - CHECK(dspace, FAIL, "H5Screate"); + /* Close dataspace */ + ret = H5Sclose(dspace); + CHECK(ret, FAIL, "H5Sclose"); - /* Create datasets in file */ - for (u = 0; u < 10; u++) { - snprintf(name, sizeof(name), "Dataset %u", u); - dset = H5Dcreate2(file, name, H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); - CHECK(dset, FAIL, "H5Dcreate2"); + /* Create dataspace for datasets */ + dspace = H5Screate(H5S_SCALAR); + CHECK(dspace, FAIL, "H5Screate"); - ret = H5Dclose(dset); - CHECK(ret, FAIL, "H5Dclose"); - } /* end for */ + /* Create datasets in file */ + for (u = 0; u < 10; u++) { + snprintf(name, sizeof(name), "Dataset %u", u); + dset = H5Dcreate2(file, name, H5T_STD_U32LE, dspace, H5P_DEFAULT, dcpl, H5P_DEFAULT); + CHECK(dset, FAIL, "H5Dcreate2"); - /* Close dataspace */ - ret = H5Sclose(dspace); - CHECK(ret, FAIL, "H5Sclose"); + ret = H5Dclose(dset); + CHECK(ret, FAIL, "H5Dclose"); + } /* end for */ - /* Close dataset creation property list */ - ret = H5Pclose(dcpl); - CHECK(ret, FAIL, "H5Pclose"); + /* Close dataspace */ + ret = H5Sclose(dspace); + CHECK(ret, FAIL, "H5Sclose"); - /* Delete odd-numbered datasets in file */ - for (u = 0; u < 10; u++) { - snprintf(name, sizeof(name), "Dataset %u", u); - if (u % 2) { - ret = H5Ldelete(file, name, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Ldelete"); - } /* end if */ - } /* end for */ + /* Close dataset creation property list */ + ret = H5Pclose(dcpl); + CHECK(ret, FAIL, "H5Pclose"); - /* Close file */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); + /* Delete odd-numbered datasets in file */ + for (u = 0; u < 10; u++) { + snprintf(name, sizeof(name), "Dataset %u", u); + if (u % 2) { + ret = H5Ldelete(file, name, H5P_DEFAULT); + CHECK(ret, FAIL, "H5Ldelete"); + } /* end if */ + } /* end for */ - /* Re-open the file with read-only permission */ - file = H5Fopen(filename, H5F_ACC_RDONLY, fapl); - CHECK_I(file, "H5Fopen"); + /* Close file */ + ret = H5Fclose(file); + CHECK(ret, FAIL, "H5Fclose"); - /* Get the amount of free space in the file */ - free_space = H5Fget_freespace(file); - CHECK(free_space, FAIL, "H5Fget_freespace"); + /* Re-open the file with read-only permission */ + file = H5Fopen(filename, H5F_ACC_RDONLY, fapl); + CHECK_I(file, "H5Fopen"); + + /* Get the amount of free space in the file */ + free_space = H5Fget_freespace(file); + CHECK(free_space, FAIL, "H5Fget_freespace"); + + /* Get the total # of free-space sections in the file */ + nall = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, NULL); + CHECK(nall, FAIL, "H5Fget_free_sections"); + + /* Should return failure when nsects is 0 with a nonnull sect_info */ + nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, all_sect_info); + VERIFY(nsects, FAIL, "H5Fget_free_sections"); + + /* Retrieve and verify free space info for all the sections */ + memset(all_sect_info, 0, sizeof(all_sect_info)); + nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)nall, all_sect_info); + VERIFY(nsects, nall, "H5Fget_free_sections"); + + /* Verify the amount of free-space is correct */ + for (u = 0; u < nall; u++) + total += all_sect_info[u].size; + VERIFY(free_space, total, "H5Fget_free_sections"); + + /* Save the last section's size */ + last_size = all_sect_info[nall - 1].size; + + /* Retrieve and verify free space info for -1 sections */ + memset(sect_info, 0, sizeof(sect_info)); + nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)(nall - 1), sect_info); + VERIFY(nsects, nall, "H5Fget_free_sections"); + + /* Verify the amount of free-space is correct */ + total = 0; + for (u = 0; u < (nall - 1); u++) { + VERIFY(sect_info[u].addr, all_sect_info[u].addr, "H5Fget_free_sections"); + VERIFY(sect_info[u].size, all_sect_info[u].size, "H5Fget_free_sections"); + total += sect_info[u].size; + } + VERIFY(((hsize_t)free_space - last_size), total, "H5Fget_free_sections"); + + /* Retrieve and verify free-space info for +1 sections */ + memset(sect_info, 0, sizeof(sect_info)); + nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)(nall + 1), sect_info); + VERIFY(nsects, nall, "H5Fget_free_sections"); + + /* Verify amount of free-space is correct */ + total = 0; + for (u = 0; u < nall; u++) { + VERIFY(sect_info[u].addr, all_sect_info[u].addr, "H5Fget_free_sections"); + VERIFY(sect_info[u].size, all_sect_info[u].size, "H5Fget_free_sections"); + total += sect_info[u].size; + } + VERIFY(sect_info[nall].addr, 0, "H5Fget_free_sections"); + VERIFY(sect_info[nall].size, 0, "H5Fget_free_sections"); + VERIFY(free_space, total, "H5Fget_free_sections"); - /* Get the total # of free-space sections in the file */ - nall = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, NULL); - CHECK(nall, FAIL, "H5Fget_free_sections"); - - /* Should return failure when nsects is 0 with a nonnull sect_info */ - nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)0, all_sect_info); - VERIFY(nsects, FAIL, "H5Fget_free_sections"); - - /* Retrieve and verify free space info for all the sections */ - memset(all_sect_info, 0, sizeof(all_sect_info)); - nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)nall, all_sect_info); - VERIFY(nsects, nall, "H5Fget_free_sections"); - - /* Verify the amount of free-space is correct */ - for (u = 0; u < nall; u++) - total += all_sect_info[u].size; - VERIFY(free_space, total, "H5Fget_free_sections"); - - /* Save the last section's size */ - last_size = all_sect_info[nall - 1].size; - - /* Retrieve and verify free space info for -1 sections */ - memset(sect_info, 0, sizeof(sect_info)); - nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)(nall - 1), sect_info); - VERIFY(nsects, nall, "H5Fget_free_sections"); - - /* Verify the amount of free-space is correct */ - total = 0; - for (u = 0; u < (nall - 1); u++) { - VERIFY(sect_info[u].addr, all_sect_info[u].addr, "H5Fget_free_sections"); - VERIFY(sect_info[u].size, all_sect_info[u].size, "H5Fget_free_sections"); - total += sect_info[u].size; - } - VERIFY(((hsize_t)free_space - last_size), total, "H5Fget_free_sections"); - - /* Retrieve and verify free-space info for +1 sections */ - memset(sect_info, 0, sizeof(sect_info)); - nsects = H5Fget_free_sections(file, H5FD_MEM_DEFAULT, (size_t)(nall + 1), sect_info); - VERIFY(nsects, nall, "H5Fget_free_sections"); - - /* Verify amount of free-space is correct */ - total = 0; - for (u = 0; u < nall; u++) { - VERIFY(sect_info[u].addr, all_sect_info[u].addr, "H5Fget_free_sections"); - VERIFY(sect_info[u].size, all_sect_info[u].size, "H5Fget_free_sections"); - total += sect_info[u].size; - } - VERIFY(sect_info[nall].addr, 0, "H5Fget_free_sections"); - VERIFY(sect_info[nall].size, 0, "H5Fget_free_sections"); - VERIFY(free_space, total, "H5Fget_free_sections"); + memset(meta_sect_info, 0, sizeof(meta_sect_info)); + if (multi_vfd) { + hssize_t ntmp; - memset(meta_sect_info, 0, sizeof(meta_sect_info)); - if (multi_vfd) { - hssize_t ntmp; + for (type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; type++) { + if (type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP) + continue; + /* Get the # of free-space sections in the file for metadata */ + ntmp = H5Fget_free_sections(file, type, (size_t)0, NULL); + CHECK(ntmp, FAIL, "H5Fget_free_sections"); - for (type = H5FD_MEM_SUPER; type < H5FD_MEM_NTYPES; type++) { - if (type == H5FD_MEM_DRAW || type == H5FD_MEM_GHEAP) - continue; - /* Get the # of free-space sections in the file for metadata */ - ntmp = H5Fget_free_sections(file, type, (size_t)0, NULL); - CHECK(ntmp, FAIL, "H5Fget_free_sections"); - - if (ntmp > 0) { - nsects = H5Fget_free_sections(file, type, (size_t)ntmp, &meta_sect_info[nmeta]); - VERIFY(nsects, ntmp, "H5Fget_free_sections"); - nmeta += ntmp; - } + if (ntmp > 0) { + nsects = H5Fget_free_sections(file, type, (size_t)ntmp, &meta_sect_info[nmeta]); + VERIFY(nsects, ntmp, "H5Fget_free_sections"); + nmeta += ntmp; } } - else { - /* Get the # of free-space sections in the file for metadata */ - nmeta = H5Fget_free_sections(file, H5FD_MEM_SUPER, (size_t)0, NULL); - CHECK(nmeta, FAIL, "H5Fget_free_sections"); + } + else { + /* Get the # of free-space sections in the file for metadata */ + nmeta = H5Fget_free_sections(file, H5FD_MEM_SUPER, (size_t)0, NULL); + CHECK(nmeta, FAIL, "H5Fget_free_sections"); - /* Retrieve and verify free-space sections for metadata */ - nsects = H5Fget_free_sections(file, H5FD_MEM_SUPER, (size_t)nmeta, meta_sect_info); - VERIFY(nsects, nmeta, "H5Fget_free_sections"); - } + /* Retrieve and verify free-space sections for metadata */ + nsects = H5Fget_free_sections(file, H5FD_MEM_SUPER, (size_t)nmeta, meta_sect_info); + VERIFY(nsects, nmeta, "H5Fget_free_sections"); + } - /* Get the # of free-space sections in the file for raw data */ - nraw = H5Fget_free_sections(file, H5FD_MEM_DRAW, (size_t)0, NULL); - CHECK(nraw, FAIL, "H5Fget_free_sections"); + /* Get the # of free-space sections in the file for raw data */ + nraw = H5Fget_free_sections(file, H5FD_MEM_DRAW, (size_t)0, NULL); + CHECK(nraw, FAIL, "H5Fget_free_sections"); - /* Retrieve and verify free-space sections for raw data */ - memset(raw_sect_info, 0, sizeof(raw_sect_info)); - nsects = H5Fget_free_sections(file, H5FD_MEM_DRAW, (size_t)nraw, raw_sect_info); - VERIFY(nsects, nraw, "H5Fget_free_sections"); + /* Retrieve and verify free-space sections for raw data */ + memset(raw_sect_info, 0, sizeof(raw_sect_info)); + nsects = H5Fget_free_sections(file, H5FD_MEM_DRAW, (size_t)nraw, raw_sect_info); + VERIFY(nsects, nraw, "H5Fget_free_sections"); - /* Sum all the free-space sections */ - for (u = 0; u < nmeta; u++) - tmp_tot += meta_sect_info[u].size; + /* Sum all the free-space sections */ + for (u = 0; u < nmeta; u++) + tmp_tot += meta_sect_info[u].size; - for (u = 0; u < nraw; u++) - tmp_tot += raw_sect_info[u].size; + for (u = 0; u < nraw; u++) + tmp_tot += raw_sect_info[u].size; - /* Verify free-space info */ - VERIFY(nmeta + nraw, nall, "H5Fget_free_sections"); - VERIFY(tmp_tot, total, "H5Fget_free_sections"); + /* Verify free-space info */ + VERIFY(nmeta + nraw, nall, "H5Fget_free_sections"); + VERIFY(tmp_tot, total, "H5Fget_free_sections"); - /* Closing */ - ret = H5Fclose(file); - CHECK(ret, FAIL, "H5Fclose"); - ret = H5Pclose(fcpl); - CHECK(fcpl, FAIL, "H5Pclose"); + /* Closing */ + ret = H5Fclose(file); + CHECK(ret, FAIL, "H5Fclose"); + ret = H5Pclose(fcpl); + CHECK(fcpl, FAIL, "H5Pclose"); - h5_clean_files(FILESPACE_NAME, fapl); - } + h5_clean_files(FILESPACE_NAME, fapl); } /* end test_sects_freespace() */ @@ -4878,11 +5009,19 @@ test_filespace_compatible(void) bool persist; /* Persist free-space or not */ hsize_t threshold; /* Free-space section threshold */ H5F_fspace_strategy_t strategy; /* File space handling strategy */ - herr_t ret; /* Return value */ + bool vol_is_native; + herr_t ret; /* Return value */ /* Output message about test being performed */ MESSAGE(5, ("File space compatibility testing for 1.6 and 1.8 files\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + for (j = 0; j < NELMTS(OLD_FILENAME); j++) { const char *filename = H5_get_srcdir_filename(OLD_FILENAME[j]); /* Corrected test file name */ @@ -5007,11 +5146,19 @@ test_filespace_1_10_0_compatible(void) int rdbuf[24]; /* Buffer for dataset data */ int status; /* Status from copying the existing file */ unsigned i, j; /* Local index variable */ - herr_t ret; /* Return value */ + bool vol_is_native; + herr_t ret; /* Return value */ /* Output message about test being performed */ MESSAGE(5, ("File space compatibility testing for 1.10.0 files\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + for (j = 0; j < NELMTS(OLD_1_10_0_FILENAME); j++) { /* Make a copy of the test file */ status = h5_make_local_copy(OLD_1_10_0_FILENAME[j], FILE5); @@ -5319,11 +5466,19 @@ test_filespace_round_compatible(void) hsize_t threshold; /* Free-space section threshold */ hssize_t free_space; /* Amount of free space in the file */ int status; /* Status from copying the existing file */ - herr_t ret; /* Return value */ + bool vol_is_native; + herr_t ret; /* Return value */ /* Output message about test being performed */ MESSAGE(5, ("File space compatibility testing for files from trunk to 1_8 to trunk\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + for (j = 0; j < NELMTS(FSPACE_FILENAMES); j++) { /* Make a copy of the test file */ status = h5_make_local_copy(FSPACE_FILENAMES[j], FILE5); @@ -5371,7 +5526,8 @@ test_libver_bounds_real(H5F_libver_t libver_create, unsigned oh_vers_create, H5F hid_t file, group; /* Handles */ hid_t fapl; /* File access property list */ H5O_native_info_t ninfo; /* Object info */ - herr_t ret; /* Return value */ + bool vol_is_native; + herr_t ret; /* Return value */ /* * Create a new file using the creation properties. @@ -5385,6 +5541,15 @@ test_libver_bounds_real(H5F_libver_t libver_create, unsigned oh_vers_create, H5F file = H5Fcreate("tfile5.h5", H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(file, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, file, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Pclose(fapl), FAIL, "H5Pclose"); + CHECK(H5Fclose(file), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* * Make sure the root group has the correct object header version */ @@ -5485,11 +5650,19 @@ test_libver_bounds_open(void) hsize_t dim[1] = {SPACE1_DIM1}; /* Dataset dimensions */ H5F_libver_t low, high; /* File format bounds */ hsize_t chunk_dim[1] = {SPACE1_DIM1}; /* Chunk dimensions */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Opening File in Various Version Bounds\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create a file access property list */ fapl = H5Pcreate(H5P_FILE_ACCESS); CHECK(fapl, FAIL, "H5Pcreate"); @@ -5618,16 +5791,24 @@ test_libver_bounds_copy(void) hid_t fapl = H5I_INVALID_HID; /* File access property list ID */ const char *src_fname; /* Source file name */ herr_t ret; /* Generic return value */ + bool vol_is_native; bool driver_is_default_compatible; /* Output message about the test being performed */ MESSAGE(5, ("Testing H5Ocopy a dataset in a 1.8 library file to a 1.10 library file\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); CHECK_I(ret, "h5_driver_is_default_vfd_compatible"); if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); + MESSAGE(5, (" -- SKIPPED --\n")); return; } @@ -5722,11 +5903,19 @@ test_libver_bounds_low_high(const char *env_h5_drvr) { hid_t fapl = H5I_INVALID_HID; /* File access property list */ H5F_libver_t low, high; /* Low and high bounds */ - herr_t ret; /* The return value */ + bool vol_is_native; + herr_t ret; /* The return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing setting (low, high) format version bounds\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create a file access property list */ fapl = H5Pcreate(H5P_FILE_ACCESS); CHECK(fapl, H5I_INVALID_HID, "H5Pcreate"); @@ -7653,11 +7842,19 @@ test_incr_filesize(void) haddr_t stored_eoa; /* The stored EOA value */ hid_t driver_id = H5I_INVALID_HID; /* ID for this VFD */ unsigned long driver_flags = 0; /* VFD feature flags */ - herr_t ret; /* Return value */ + bool vol_is_native; + herr_t ret; /* Return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing H5Fincrement_filesize() and H5Fget_eoa())\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + fapl = h5_fileaccess(); h5_fixname(FILE_INCR_FILESIZE, fapl, filename, sizeof filename); @@ -7775,6 +7972,7 @@ test_min_dset_ohdr(void) hid_t file_id = H5I_INVALID_HID; hid_t file2_id = H5I_INVALID_HID; bool minimize; + bool vol_is_native; herr_t ret; MESSAGE(5, ("Testing dataset object header minimization\n")); @@ -7788,6 +7986,14 @@ test_min_dset_ohdr(void) file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK_I(file_id, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, file_id, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(file_id), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /*********/ /* TESTS */ /*********/ @@ -7909,7 +8115,8 @@ test_deprec(const char *env_h5_drvr) unsigned stab; /* Symbol table entry version # */ unsigned shhdr; /* Shared object header version # */ H5F_info1_t finfo; /* global information about file */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing deprecated routines\n")); @@ -7922,6 +8129,14 @@ test_deprec(const char *env_h5_drvr) file = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(file, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, file, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(file), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Get the file's version information */ ret = H5Fget_info1(file, &finfo); CHECK(ret, FAIL, "H5Fget_info1"); diff --git a/test/th5o.c b/test/th5o.c index 17cfad7..801091f 100644 --- a/test/th5o.c +++ b/test/th5o.c @@ -267,7 +267,8 @@ test_h5o_open_by_addr(void) H5I_type_t id_type; /* Type of IDs returned from H5Oopen */ H5G_info_t ginfo; /* Group info struct */ H5T_class_t type_class; /* Class of the datatype */ - herr_t ret; /* Value returned from API calls */ + bool vol_is_native; + herr_t ret; /* Value returned from API calls */ h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); @@ -275,6 +276,13 @@ test_h5o_open_by_addr(void) fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + return; + } + /* Create a group, dataset, and committed datatype within the file */ /* Create the group */ grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); @@ -1109,6 +1117,7 @@ test_h5o_comment(void) char check_comment[64]; ssize_t comment_len = 0; ssize_t len; + bool vol_is_native; herr_t ret; /* Value returned from API calls */ int ret_value; @@ -1118,6 +1127,13 @@ test_h5o_comment(void) fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + return; + } + /* Create an attribute for the file */ attr_space = H5Screate_simple(1, &attr_dims, NULL); CHECK(attr_space, FAIL, "H5Screate_simple"); @@ -1284,6 +1300,7 @@ test_h5o_comment_by_name(void) char check_comment[64]; ssize_t comment_len = 0; ssize_t len; + bool vol_is_native; herr_t ret; /* Value returned from API calls */ int ret_value; @@ -1293,6 +1310,13 @@ test_h5o_comment_by_name(void) fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + return; + } + /* Create an attribute for the file */ attr_space = H5Screate_simple(1, &attr_dims, NULL); CHECK(attr_space, FAIL, "H5Screate_simple"); @@ -1556,7 +1580,8 @@ test_h5o_open_by_addr_deprec(void) H5I_type_t id_type; /* Type of IDs returned from H5Oopen */ H5G_info_t ginfo; /* Group info struct */ H5T_class_t type_class; /* Class of the datatype */ - herr_t ret; /* Value returned from API calls */ + bool vol_is_native; + herr_t ret; /* Value returned from API calls */ h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); @@ -1564,6 +1589,13 @@ test_h5o_open_by_addr_deprec(void) fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + return; + } + /* Create a group, dataset, and committed datatype within the file */ /* Create the group */ grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); @@ -1739,7 +1771,8 @@ test_h5o_getinfo_visit(void) H5O_info1_t oinfo1, oinfo2; /* Object info structs */ char attrname[25]; /* Attribute name */ int j; /* Local index variable */ - herr_t ret; /* Value returned from API calls */ + bool vol_is_native; + herr_t ret; /* Value returned from API calls */ /* Output message about test being performed */ MESSAGE(5, ("Testing info returned by H5Oget_info vs H5Ovisit\n")); @@ -1750,6 +1783,14 @@ test_h5o_getinfo_visit(void) fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create "group1" in the file */ gid1 = H5Gcreate2(fid, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(gid1, FAIL, "H5Gcreate2"); diff --git a/test/th5s.c b/test/th5s.c index 7343653..f0e4959 100644 --- a/test/th5s.c +++ b/test/th5s.c @@ -125,12 +125,18 @@ test_h5s_basic(void) hsize_t tdims[4]; /* Dimension array to test with */ hsize_t tmax[4]; hssize_t n; /* Number of dataspace elements */ + bool vol_is_native; bool driver_is_default_compatible; herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Dataspace Manipulation\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + sid1 = H5Screate_simple(SPACE1_RANK, dims1, max2); CHECK(sid1, FAIL, "H5Screate_simple"); @@ -194,10 +200,13 @@ test_h5s_basic(void) * If this test fails and the H5S_MAX_RANK variable has changed, follow * the instructions in space_overflow.c for regenerating the th5s.h5 file. */ + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Check if VFD used is native file format compatible */ ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); CHECK_I(ret, "h5_driver_is_default_vfd_compatible"); - if (driver_is_default_compatible) { + if (vol_is_native && driver_is_default_compatible) { const char *testfile = H5_get_srcdir_filename(TESTFILE); /* Corrected test file name */ fid1 = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); @@ -603,6 +612,11 @@ test_h5s_zero_dim(void) /* Output message about test being performed */ MESSAGE(5, ("Testing Dataspace with zero dimension size\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_MORE)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Initialize the data */ for (i = 0; i < SPACE1_DIM2; i++) for (j = 0; j < SPACE1_DIM3; j++) { @@ -3353,7 +3367,8 @@ test_versionbounds(void) hsize_t dim[1]; /* Dataset dimensions */ H5F_libver_t low, high; /* File format bounds */ H5S_t *spacep = NULL; /* Pointer to internal dataspace */ - herr_t ret = 0; /* Generic return value */ + bool vol_is_native; + herr_t ret = 0; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Version Bounds\n")); @@ -3362,6 +3377,9 @@ test_versionbounds(void) fapl = H5Pcreate(H5P_FILE_ACCESS); CHECK(fapl, FAIL, "H5Pcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Create dataspace */ dim[0] = 10; space = H5Screate_simple(1, dim, NULL); @@ -3389,11 +3407,14 @@ test_versionbounds(void) /* Get the internal dataspace pointer */ dset_space = H5Dget_space(dset); CHECK(dset_space, FAIL, "H5Dget_space"); - spacep = (H5S_t *)H5I_object(dset_space); - CHECK_PTR(spacep, "H5I_object"); - /* Dataspace version should remain as H5O_SDSPACE_VERSION_1 */ - VERIFY(spacep->extent.version, H5O_SDSPACE_VERSION_1, "basic dataspace version bound"); + if (vol_is_native) { + spacep = (H5S_t *)H5I_object(dset_space); + CHECK_PTR(spacep, "H5I_object"); + + /* Dataspace version should remain as H5O_SDSPACE_VERSION_1 */ + VERIFY(spacep->extent.version, H5O_SDSPACE_VERSION_1, "basic dataspace version bound"); + } /* Close dataspace */ ret = H5Sclose(dset_space); @@ -3426,11 +3447,14 @@ test_versionbounds(void) /* Get the internal dataspace pointer */ dset_space = H5Dget_space(dset); CHECK(dset_space, FAIL, "H5Dget_space"); - spacep = (H5S_t *)H5I_object(dset_space); - CHECK_PTR(spacep, "H5I_object"); - /* Verify the dataspace version */ - VERIFY(spacep->extent.version, H5O_sdspace_ver_bounds[low], "upgraded dataspace version"); + if (vol_is_native) { + spacep = (H5S_t *)H5I_object(dset_space); + CHECK_PTR(spacep, "H5I_object"); + + /* Verify the dataspace version */ + VERIFY(spacep->extent.version, H5O_sdspace_ver_bounds[low], "upgraded dataspace version"); + } /* Close everything */ ret = H5Sclose(dset_space); diff --git a/test/titerate.c b/test/titerate.c index 57b4d06..3c0b82e 100644 --- a/test/titerate.c +++ b/test/titerate.c @@ -90,6 +90,13 @@ liter_cb(hid_t H5_ATTR_UNUSED group, const char *name, const H5L_info2_t H5_ATTR static int count = 0; static int count2 = 0; + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE)) { + SKIPPED(); + printf(" API functions for iterate aren't " + "supported with this connector\n"); + return 1; + } + strcpy(info->name, name); switch (info->command) { @@ -138,6 +145,14 @@ test_iter_group(hid_t fapl, bool new_format) /* Output message about test being performed */ MESSAGE(5, ("Testing Group Iteration Functionality\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) || + !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_MORE) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || + !(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES) || !(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_MORE) || + !(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create the test file with the datasets */ file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(file, FAIL, "H5Fcreate"); @@ -306,6 +321,7 @@ test_iter_group(hid_t fapl, bool new_format) info.command = RET_TWO; i = 0; idx = 0; + memset(info.name, 0, NAMELEN); while ((ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) > 0) { /* Verify return value from iterator gets propagated correctly */ VERIFY(ret, 2, "H5Literate2"); @@ -315,11 +331,13 @@ test_iter_group(hid_t fapl, bool new_format) /* Verify that the index is the correct value */ VERIFY(idx, (hsize_t)i, "H5Literate2"); + if (idx != (hsize_t)i) + break; if (idx > (NDATASETS + 2)) TestErrPrintf("Group iteration function walked too far!\n"); /* Verify that the correct name is retrieved */ - if (strcmp(info.name, lnames[(size_t)(idx - 1)]) != 0) + if (strncmp(info.name, lnames[(size_t)(idx - 1)], NAMELEN) != 0) TestErrPrintf( "Group iteration function didn't return name correctly for link - lnames[%u] = '%s'!\n", (unsigned)(idx - 1), lnames[(size_t)(idx - 1)]); @@ -335,6 +353,7 @@ test_iter_group(hid_t fapl, bool new_format) info.command = new_format ? RET_CHANGE2 : RET_CHANGE; i = 0; idx = 0; + memset(info.name, 0, NAMELEN); while ((ret = H5Literate2(file, H5_INDEX_NAME, H5_ITER_INC, &idx, liter_cb, &info)) >= 0) { /* Verify return value from iterator gets propagated correctly */ VERIFY(ret, 1, "H5Literate2"); @@ -344,11 +363,13 @@ test_iter_group(hid_t fapl, bool new_format) /* Verify that the index is the correct value */ VERIFY(idx, (hsize_t)(i + 10), "H5Literate2"); + if (idx != (hsize_t)(i + 10)) + break; if (idx > (NDATASETS + 2)) TestErrPrintf("Group iteration function walked too far!\n"); /* Verify that the correct name is retrieved */ - if (strcmp(info.name, lnames[(size_t)(idx - 1)]) != 0) + if (strncmp(info.name, lnames[(size_t)(idx - 1)], NAMELEN) != 0) TestErrPrintf( "Group iteration function didn't return name correctly for link - lnames[%u] = '%s'!\n", (unsigned)(idx - 1), lnames[(size_t)(idx - 1)]); @@ -424,6 +445,14 @@ test_iter_attr(hid_t fapl, bool new_format) /* Output message about test being performed */ MESSAGE(5, ("Testing Attribute Iteration Functionality\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || + !(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + + memset(&info, 0, sizeof(iter_info)); + /* Create the test file with the datasets */ file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(file, FAIL, "H5Fcreate"); @@ -509,10 +538,14 @@ test_iter_attr(hid_t fapl, bool new_format) /* Don't check name when new format is used */ if (!new_format) { /* Verify that the correct name is retrieved */ - if (strcmp(info.name, anames[(size_t)idx - 1]) != 0) - TestErrPrintf("%u: Attribute iteration function didn't set names correctly, info.name = " - "'%s', anames[%u] = '%s'!\n", - __LINE__, info.name, (unsigned)(idx - 1), anames[(size_t)idx - 1]); + if (idx > 0) { + if (strcmp(info.name, anames[(size_t)idx - 1]) != 0) + TestErrPrintf("%u: Attribute iteration function didn't set names correctly, info.name = " + "'%s', anames[%u] = '%s'!\n", + __LINE__, info.name, (unsigned)(idx - 1), anames[(size_t)idx - 1]); + } + else + TestErrPrintf("%u: 'idx' was not set correctly!\n", __LINE__); } /* end if */ } /* end while */ VERIFY(ret, -1, "H5Aiterate2"); @@ -538,10 +571,14 @@ test_iter_attr(hid_t fapl, bool new_format) /* Don't check name when new format is used */ if (!new_format) { /* Verify that the correct name is retrieved */ - if (strcmp(info.name, anames[(size_t)idx - 1]) != 0) - TestErrPrintf("%u: Attribute iteration function didn't set names correctly, info.name = " - "'%s', anames[%u] = '%s'!\n", - __LINE__, info.name, (unsigned)(idx - 1), anames[(size_t)idx - 1]); + if (idx > 0) { + if (strcmp(info.name, anames[(size_t)idx - 1]) != 0) + TestErrPrintf("%u: Attribute iteration function didn't set names correctly, info.name = " + "'%s', anames[%u] = '%s'!\n", + __LINE__, info.name, (unsigned)(idx - 1), anames[(size_t)idx - 1]); + } + else + TestErrPrintf("%u: 'idx' was not set correctly!\n", __LINE__); } /* end if */ } /* end while */ VERIFY(ret, -1, "H5Aiterate2"); @@ -584,6 +621,13 @@ liter_cb2(hid_t loc_id, const char *name, const H5L_info2_t H5_ATTR_UNUSED *link H5O_info2_t oinfo; herr_t ret; /* Generic return value */ + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) || !(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_BASIC)) { + SKIPPED(); + printf(" API functions for iterate and basic links aren't " + "supported with this connector\n"); + return 1; + } + if (strcmp(name, test_info->name) != 0) { TestErrPrintf("name = '%s', test_info = '%s'\n", name, test_info->name); return (H5_ITER_ERROR); @@ -638,6 +682,13 @@ test_iter_group_large(hid_t fapl) /* Output message about test being performed */ MESSAGE(5, ("Testing Large Group Iteration Functionality\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) || + !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || + !(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES) || !(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create file */ file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(file, FAIL, "H5Fcreate"); @@ -1008,6 +1059,7 @@ test_corrupted_attnamelen(void) searched_err_t err_caught; /* Data to be passed to callback func */ int err_status; /* Status returned by H5Aiterate2 */ herr_t ret; /* Return value */ + bool vol_is_native; bool driver_is_default_compatible; const char *testfile = H5_get_srcdir_filename(CORRUPTED_ATNAMELEN_FILE); /* Corrected test file name */ @@ -1020,11 +1072,18 @@ test_corrupted_attnamelen(void) /* Output message about test being performed */ MESSAGE(5, ("Testing the Handling of Corrupted Attribute's Name Length\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); + MESSAGE(5, (" -- SKIPPED --\n")); return; } @@ -1078,6 +1137,7 @@ test_links_deprec(hid_t fapl) hid_t gid, gid1; H5G_info_t ginfo; /* Buffer for querying object's info */ hsize_t i; + bool vol_is_native; herr_t ret; /* Generic return value */ /* Output message about test being performed */ @@ -1087,6 +1147,14 @@ test_links_deprec(hid_t fapl) file = H5Fcreate(DATAFILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(file, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, file, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(file), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* create groups */ gid = H5Gcreate2(file, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(gid, FAIL, "H5Gcreate2"); diff --git a/test/tmisc.c b/test/tmisc.c index c43f54f..a8103af 100644 --- a/test/tmisc.c +++ b/test/tmisc.c @@ -451,6 +451,9 @@ test_misc2_write_attribute(void) char *string_att1 = strdup("string attribute in file one"); char *string_att2 = strdup("string attribute in file two"); + memset(&data, 0, sizeof(data)); + memset(&data_check, 0, sizeof(data_check)); + type = misc2_create_type(); dataspace = H5Screate(H5S_SCALAR); @@ -1148,6 +1151,7 @@ test_misc7(void) { hid_t fid, did, tid, sid; int enum_value = 1; + bool vol_is_native; herr_t ret; /* Output message about test being performed */ @@ -1159,6 +1163,14 @@ test_misc7(void) fid = H5Fcreate(MISC7_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create the dataspace */ sid = H5Screate(H5S_SCALAR); CHECK(sid, FAIL, "H5Screate"); @@ -1255,10 +1267,10 @@ test_misc8(void) hsize_t storage_size; /* Number of bytes of raw data storage used */ int *wdata; /* Data to write */ int *tdata; /* Temporary pointer to data write */ -#ifdef VERIFY_DATA - int *rdata; /* Data to read */ - int *tdata2; /* Temporary pointer to data to read */ -#endif /* VERIFY_DATA */ +#ifndef H5_HAVE_PARALLEL + int *rdata; /* Data to read */ + int *tdata2; /* Temporary pointer to data to read */ +#endif unsigned u, v; /* Local index variables */ int mdc_nelmts; /* Metadata number of elements */ size_t rdcc_nelmts; /* Raw data number of elements */ @@ -1266,25 +1278,12 @@ test_misc8(void) double rdcc_w0; /* Raw data write percentage */ hsize_t start[MISC8_RANK]; /* Hyperslab start */ hsize_t count[MISC8_RANK]; /* Hyperslab block count */ + bool vol_is_native; herr_t ret; /* Output message about test being performed */ MESSAGE(5, ("Testing dataset storage sizes\n")); - /* Allocate space for the data to write & read */ - wdata = (int *)malloc(sizeof(int) * MISC8_DIM0 * MISC8_DIM1); - CHECK_PTR(wdata, "malloc"); -#ifdef VERIFY_DATA - rdata = (int *)malloc(sizeof(int) * MISC8_DIM0 * MISC8_DIM1); - CHECK_PTR(rdata, "malloc"); -#endif /* VERIFY_DATA */ - - /* Initialize values */ - tdata = wdata; - for (u = 0; u < MISC8_DIM0; u++) - for (v = 0; v < MISC8_DIM1; v++) - *tdata++ = (int)(((u * MISC8_DIM1) + v) % 13); - /* Create a file access property list */ fapl = H5Pcreate(H5P_FILE_ACCESS); CHECK(fapl, FAIL, "H5Pcreate"); @@ -1308,6 +1307,28 @@ test_misc8(void) ret = H5Pclose(fapl); CHECK(ret, FAIL, "H5Pclose"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5I_INVALID_HID, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + + /* Allocate space for the data to write & read */ + wdata = (int *)malloc(sizeof(int) * MISC8_DIM0 * MISC8_DIM1); + CHECK_PTR(wdata, "malloc"); +#ifndef H5_HAVE_PARALLEL + rdata = (int *)malloc(sizeof(int) * MISC8_DIM0 * MISC8_DIM1); + CHECK_PTR(rdata, "malloc"); +#endif + + /* Initialize values */ + tdata = wdata; + for (u = 0; u < MISC8_DIM0; u++) + for (v = 0; v < MISC8_DIM1; v++) + *tdata++ = (int)(((u * MISC8_DIM1) + v) % 13); + /* Create a simple dataspace */ sid = H5Screate_simple(rank, dims, NULL); CHECK(sid, FAIL, "H5Screate_simple"); @@ -1537,7 +1558,6 @@ test_misc8(void) ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); CHECK(ret, FAIL, "H5Dwrite"); -#ifdef VERIFY_DATA /* Read data */ ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); CHECK(ret, FAIL, "H5Dread"); @@ -1550,7 +1570,6 @@ test_misc8(void) if (*tdata != *tdata2) TestErrPrintf("Error on line %d: u=%u, v=%d, *tdata=%d, *tdata2=%d\n", __LINE__, (unsigned)u, (unsigned)v, (int)*tdata, (int)*tdata2); -#endif /* VERIFY_DATA */ /* Check the storage size after data is written */ storage_size = H5Dget_storage_size(did); @@ -1632,7 +1651,6 @@ test_misc8(void) ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); CHECK(ret, FAIL, "H5Dwrite"); -#ifdef VERIFY_DATA /* Read data */ ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); CHECK(ret, FAIL, "H5Dread"); @@ -1645,7 +1663,6 @@ test_misc8(void) if (*tdata != *tdata2) TestErrPrintf("Error on line %d: u=%u, v=%d, *tdata=%d, *tdata2=%d\n", __LINE__, (unsigned)u, (unsigned)v, (int)*tdata, (int)*tdata2); -#endif /* VERIFY_DATA */ /* Check the storage size after data is written */ storage_size = H5Dget_storage_size(did); @@ -1697,7 +1714,6 @@ test_misc8(void) ret = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); CHECK(ret, FAIL, "H5Dwrite"); -#ifdef VERIFY_DATA /* Read data */ ret = H5Dread(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); CHECK(ret, FAIL, "H5Dread"); @@ -1710,7 +1726,6 @@ test_misc8(void) if (*tdata != *tdata2) TestErrPrintf("Error on line %d: u=%u, v=%d, *tdata=%d, *tdata2=%d\n", __LINE__, (unsigned)u, (unsigned)v, (int)*tdata, (int)*tdata2); -#endif /* VERIFY_DATA */ /* Check the storage size after data is written */ storage_size = H5Dget_storage_size(did); @@ -1744,9 +1759,9 @@ test_misc8(void) /* Free the read & write buffers */ free(wdata); -#ifdef VERIFY_DATA +#ifndef H5_HAVE_PARALLEL free(rdata); -#endif /* VERIFY_DATA */ +#endif } /* end test_misc8() */ /**************************************************************** @@ -1800,25 +1815,35 @@ test_misc10(void) hid_t dcpl; /* Dataset creation property list */ hid_t space, type; /* Old dataset's dataspace & datatype */ const char *testfile = H5_get_srcdir_filename(MISC10_FILE_OLD); /* Corrected test file name */ + bool vol_is_native; bool driver_is_default_compatible; herr_t ret; /* Output message about test being performed */ MESSAGE(5, ("Testing using old dataset creation property list\n")); - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); - - if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); - return; - } - /* * Open the old file and the dataset and get old settings. */ file = H5Fopen(testfile, H5F_ACC_RDONLY, H5P_DEFAULT); CHECK(file, FAIL, "H5Fopen"); + + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, file, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(file), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Check if VFD used is native file format compatible */ + CHECK(h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible), FAIL, + "h5_driver_is_default_vfd_compatible"); + if (!driver_is_default_compatible) { + CHECK(H5Fclose(file), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + fcpl = H5Fget_create_plist(file); CHECK(fcpl, FAIL, "H5Fget_create_plist"); @@ -1884,7 +1909,8 @@ test_misc11(void) H5F_fspace_strategy_t strategy; /* File space strategy */ hsize_t threshold; /* Free-space section threshold */ bool persist; /* To persist free-space or not */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing file creation properties retrieved correctly\n")); @@ -1897,12 +1923,17 @@ test_misc11(void) file = H5Fcreate(MISC11_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(file, FAIL, "H5Fcreate"); - /* Get the file's version information */ - ret = H5Fget_info2(file, &finfo); - CHECK(ret, FAIL, "H5Fget_info2"); - VERIFY(finfo.super.version, 0, "H5Fget_info2"); - VERIFY(finfo.free.version, 0, "H5Fget_info2"); - VERIFY(finfo.sohm.version, 0, "H5Fget_info2"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, file, &vol_is_native), FAIL, "h5_using_native_vol"); + + if (vol_is_native) { + /* Get the file's version information */ + ret = H5Fget_info2(file, &finfo); + CHECK(ret, FAIL, "H5Fget_info2"); + VERIFY(finfo.super.version, 0, "H5Fget_info2"); + VERIFY(finfo.free.version, 0, "H5Fget_info2"); + VERIFY(finfo.sohm.version, 0, "H5Fget_info2"); + } /* Close file */ ret = H5Fclose(file); @@ -1955,16 +1986,21 @@ test_misc11(void) file = H5Fcreate(MISC11_FILE, H5F_ACC_TRUNC, fcpl, H5P_DEFAULT); CHECK(file, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, file, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Close FCPL */ ret = H5Pclose(fcpl); CHECK(ret, FAIL, "H5Pclose"); - /* Get the file's version information */ - ret = H5Fget_info2(file, &finfo); - CHECK(ret, FAIL, "H5Fget_info2"); - VERIFY(finfo.super.version, 2, "H5Fget_info2"); - VERIFY(finfo.free.version, 0, "H5Fget_info2"); - VERIFY(finfo.sohm.version, 0, "H5Fget_info2"); + if (vol_is_native) { + /* Get the file's version information */ + ret = H5Fget_info2(file, &finfo); + CHECK(ret, FAIL, "H5Fget_info2"); + VERIFY(finfo.super.version, 2, "H5Fget_info2"); + VERIFY(finfo.free.version, 0, "H5Fget_info2"); + VERIFY(finfo.sohm.version, 0, "H5Fget_info2"); + } /* Close file */ ret = H5Fclose(file); @@ -1974,16 +2010,21 @@ test_misc11(void) file = H5Fopen(MISC11_FILE, H5F_ACC_RDONLY, H5P_DEFAULT); CHECK(file, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, file, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Get the file's creation property list */ fcpl = H5Fget_create_plist(file); CHECK(fcpl, FAIL, "H5Fget_create_plist"); - /* Get the file's version information */ - ret = H5Fget_info2(file, &finfo); - CHECK(ret, FAIL, "H5Fget_info2"); - VERIFY(finfo.super.version, 2, "H5Fget_info2"); - VERIFY(finfo.free.version, 0, "H5Fget_info2"); - VERIFY(finfo.sohm.version, 0, "H5Fget_info2"); + if (vol_is_native) { + /* Get the file's version information */ + ret = H5Fget_info2(file, &finfo); + CHECK(ret, FAIL, "H5Fget_info2"); + VERIFY(finfo.super.version, 2, "H5Fget_info2"); + VERIFY(finfo.free.version, 0, "H5Fget_info2"); + VERIFY(finfo.sohm.version, 0, "H5Fget_info2"); + } /* Retrieve all the property values & check them */ ret = H5Pget_userblock(fcpl, &userblock); @@ -2500,6 +2541,12 @@ test_misc13(void) unsigned *data = NULL; /* Data to write to dataset */ hsize_t userblock_size; /* Correct size of userblock */ bool check_for_new_dataset; /* Whether to check for the post-userblock-creation dataset */ + bool vol_is_native; + + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) + return; /* Create a data buffer for the datasets */ data = (unsigned *)calloc(MISC13_DIM1, sizeof(unsigned)); @@ -2830,6 +2877,9 @@ test_misc16(void) hsize_t dims[] = {MISC16_SPACE_DIM}; int i; + memset(wdata, 0, sizeof(wdata)); + memset(rdata, 0, sizeof(rdata)); + /* Initialize the data */ /* (Note that these are supposed to stress the code, so are a little weird) */ memcpy(wdata[0], "1234567", MISC16_STR_SIZE); @@ -2918,6 +2968,9 @@ test_misc17(void) hsize_t dims[] = {MISC17_SPACE_DIM1, MISC17_SPACE_DIM2}; int i; + memset(wdata, 0, sizeof(wdata)); + memset(rdata, 0, sizeof(rdata)); + /* Initialize the data */ /* (Note that these are supposed to stress the code, so are a little weird) */ memcpy(wdata[0], "1234567", MISC17_SPACE_DIM2); @@ -3003,12 +3056,16 @@ test_misc18(void) H5O_native_info_t ninfo; /* Native file format information about object */ char attr_name[32]; /* Attribute name buffer */ unsigned u; /* Local index variable */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Create the file */ fid = H5Fcreate(MISC18_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Create dataspace for attributes */ sid = H5Screate(H5S_SCALAR); CHECK(sid, FAIL, "H5Screate"); @@ -3021,22 +3078,25 @@ test_misc18(void) ret = H5Oget_info_by_name3(fid, MISC18_DSET1_NAME, &oinfo, H5O_INFO_NUM_ATTRS, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name"); VERIFY(oinfo.num_attrs, 0, "H5Oget_info_by_name"); + + if (vol_is_native) { #ifndef H5_NO_DEPRECATED_SYMBOLS - ret = H5Oget_info_by_name2(fid, MISC18_DSET1_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nmesgs, 6, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nchunks, 1, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.total, 272, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.free, 152, "H5Oget_info_by_name"); - VERIFY(old_oinfo.num_attrs, 0, "H5Oget_info_by_name"); + ret = H5Oget_info_by_name2(fid, MISC18_DSET1_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, + H5P_DEFAULT); + CHECK(ret, FAIL, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.nmesgs, 6, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.nchunks, 1, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.space.total, 272, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.space.free, 152, "H5Oget_info_by_name"); + VERIFY(old_oinfo.num_attrs, 0, "H5Oget_info_by_name"); #endif /* H5_NO_DEPRECATED_SYMBOLS */ - ret = H5Oget_native_info_by_name(fid, MISC18_DSET1_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nmesgs, 6, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nchunks, 1, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.total, 272, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.free, 152, "H5Oget_native_info_by_name"); + ret = H5Oget_native_info_by_name(fid, MISC18_DSET1_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); + CHECK(ret, FAIL, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.nmesgs, 6, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.nchunks, 1, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.space.total, 272, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.space.free, 152, "H5Oget_native_info_by_name"); + } /* Create second dataset */ did2 = H5Dcreate2(fid, MISC18_DSET2_NAME, H5T_STD_U32LE, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); @@ -3046,22 +3106,25 @@ test_misc18(void) ret = H5Oget_info_by_name3(fid, MISC18_DSET2_NAME, &oinfo, H5O_INFO_NUM_ATTRS, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name"); VERIFY(oinfo.num_attrs, 0, "H5Oget_info_by_name"); + + if (vol_is_native) { #ifndef H5_NO_DEPRECATED_SYMBOLS - ret = H5Oget_info_by_name2(fid, MISC18_DSET2_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nmesgs, 6, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nchunks, 1, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.total, 272, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.free, 152, "H5Oget_info_by_name"); - VERIFY(old_oinfo.num_attrs, 0, "H5Oget_info_by_name"); + ret = H5Oget_info_by_name2(fid, MISC18_DSET2_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, + H5P_DEFAULT); + CHECK(ret, FAIL, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.nmesgs, 6, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.nchunks, 1, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.space.total, 272, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.space.free, 152, "H5Oget_info_by_name"); + VERIFY(old_oinfo.num_attrs, 0, "H5Oget_info_by_name"); #endif /* H5_NO_DEPRECATED_SYMBOLS */ - ret = H5Oget_native_info_by_name(fid, MISC18_DSET2_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nmesgs, 6, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nchunks, 1, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.total, 272, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.free, 152, "H5Oget_native_info_by_name"); + ret = H5Oget_native_info_by_name(fid, MISC18_DSET2_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); + CHECK(ret, FAIL, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.nmesgs, 6, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.nchunks, 1, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.space.total, 272, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.space.free, 152, "H5Oget_native_info_by_name"); + } /* Loop creating attributes on each dataset, flushing them to the file each time */ for (u = 0; u < 10; u++) { @@ -3091,43 +3154,49 @@ test_misc18(void) ret = H5Oget_info_by_name3(fid, MISC18_DSET1_NAME, &oinfo, H5O_INFO_NUM_ATTRS, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name"); VERIFY(oinfo.num_attrs, 10, "H5Oget_info_by_name"); + + if (vol_is_native) { #ifndef H5_NO_DEPRECATED_SYMBOLS - ret = H5Oget_info_by_name2(fid, MISC18_DSET1_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nmesgs, 24, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nchunks, 9, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.total, 888, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.free, 16, "H5Oget_info_by_name"); - VERIFY(old_oinfo.num_attrs, 10, "H5Oget_info_by_name"); + ret = H5Oget_info_by_name2(fid, MISC18_DSET1_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, + H5P_DEFAULT); + CHECK(ret, FAIL, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.nmesgs, 24, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.nchunks, 9, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.space.total, 888, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.space.free, 16, "H5Oget_info_by_name"); + VERIFY(old_oinfo.num_attrs, 10, "H5Oget_info_by_name"); #endif /* H5_NO_DEPRECATED_SYMBOLS */ - ret = H5Oget_native_info_by_name(fid, MISC18_DSET1_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nmesgs, 24, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nchunks, 9, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.total, 888, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.free, 16, "H5Oget_native_info_by_name"); + ret = H5Oget_native_info_by_name(fid, MISC18_DSET1_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); + CHECK(ret, FAIL, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.nmesgs, 24, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.nchunks, 9, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.space.total, 888, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.space.free, 16, "H5Oget_native_info_by_name"); + } /* Get object information for dataset #2 now */ ret = H5Oget_info_by_name3(fid, MISC18_DSET2_NAME, &oinfo, H5O_INFO_NUM_ATTRS, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name"); VERIFY(oinfo.num_attrs, 10, "H5Oget_info_by_name"); + + if (vol_is_native) { #ifndef H5_NO_DEPRECATED_SYMBOLS - ret = H5Oget_info_by_name2(fid, MISC18_DSET2_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, - H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nmesgs, 24, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.nchunks, 9, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.total, 888, "H5Oget_info_by_name"); - VERIFY(old_oinfo.hdr.space.free, 16, "H5Oget_info_by_name"); - VERIFY(old_oinfo.num_attrs, 10, "H5Oget_info_by_name"); + ret = H5Oget_info_by_name2(fid, MISC18_DSET2_NAME, &old_oinfo, H5O_INFO_HDR | H5O_INFO_NUM_ATTRS, + H5P_DEFAULT); + CHECK(ret, FAIL, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.nmesgs, 24, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.nchunks, 9, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.space.total, 888, "H5Oget_info_by_name"); + VERIFY(old_oinfo.hdr.space.free, 16, "H5Oget_info_by_name"); + VERIFY(old_oinfo.num_attrs, 10, "H5Oget_info_by_name"); #endif /* H5_NO_DEPRECATED_SYMBOLS */ - ret = H5Oget_native_info_by_name(fid, MISC18_DSET2_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oget_mative_info_by_name"); - VERIFY(ninfo.hdr.nmesgs, 24, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.nchunks, 9, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.total, 888, "H5Oget_native_info_by_name"); - VERIFY(ninfo.hdr.space.free, 16, "H5Oget_native_info_by_name"); + ret = H5Oget_native_info_by_name(fid, MISC18_DSET2_NAME, &ninfo, H5O_NATIVE_INFO_HDR, H5P_DEFAULT); + CHECK(ret, FAIL, "H5Oget_mative_info_by_name"); + VERIFY(ninfo.hdr.nmesgs, 24, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.nchunks, 9, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.space.total, 888, "H5Oget_native_info_by_name"); + VERIFY(ninfo.hdr.space.free, 16, "H5Oget_native_info_by_name"); + } /* Close second dataset */ ret = H5Dclose(did2); @@ -3702,17 +3771,30 @@ test_misc20(void) unsigned version; /* Version of storage layout info */ hsize_t contig_size; /* Size of contiguous storage size from layout into */ const char *testfile = H5_get_srcdir_filename(MISC20_FILE_OLD); /* Corrected test file name */ + bool vol_is_native; bool driver_is_default_compatible; herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing large dimension truncation fix\n")); - ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); - CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); + /* Create the file */ + fid = H5Fcreate(MISC20_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Check if VFD used is native file format compatible */ + CHECK(h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible), FAIL, + "h5_driver_is_default_vfd_compatible"); if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); + CHECK(H5Fclose(fid), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); return; } @@ -3730,10 +3812,6 @@ test_misc20(void) * been truncated. */ - /* Create the file */ - fid = H5Fcreate(MISC20_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid, FAIL, "H5Fcreate"); - /* Create dataspace with _really_ big dimensions */ sid = H5Screate_simple(rank, big_dims, NULL); CHECK(sid, FAIL, "H5Screate_simple"); @@ -4400,22 +4478,27 @@ test_misc23(void) * test H5Lcreate_external() **********************************************************************/ - status = H5Lcreate_external("fake_filename", "fake_path", file_id, "/A/B20/grp", create_id, access_id); - CHECK(status, FAIL, "H5Lcreate_external"); + if (vol_cap_flags_g & H5VL_CAP_FLAG_EXTERNAL_LINKS) { + status = + H5Lcreate_external("fake_filename", "fake_path", file_id, "/A/B20/grp", create_id, access_id); + CHECK(status, FAIL, "H5Lcreate_external"); - tri_status = H5Lexists(file_id, "/A/B20/grp", access_id); - VERIFY(tri_status, true, "H5Lexists"); + tri_status = H5Lexists(file_id, "/A/B20/grp", access_id); + VERIFY(tri_status, true, "H5Lexists"); + } /********************************************************************** * test H5Lcreate_ud() **********************************************************************/ - status = - H5Lcreate_ud(file_id, "/A/B21/grp", H5L_TYPE_EXTERNAL, "file\0obj", (size_t)9, create_id, access_id); - CHECK(status, FAIL, "H5Lcreate_ud"); + if (vol_cap_flags_g & H5VL_CAP_FLAG_UD_LINKS) { + status = H5Lcreate_ud(file_id, "/A/B21/grp", H5L_TYPE_EXTERNAL, "file\0obj", (size_t)9, create_id, + access_id); + CHECK(status, FAIL, "H5Lcreate_ud"); - tri_status = H5Lexists(file_id, "/A/B21/grp", access_id); - VERIFY(tri_status, true, "H5Lexists"); + tri_status = H5Lexists(file_id, "/A/B21/grp", access_id); + VERIFY(tri_status, true, "H5Lexists"); + } /********************************************************************** * close @@ -4998,17 +5081,25 @@ test_misc25b(void) hid_t fid; /* File ID */ hid_t gid; /* Group ID */ const char *testfile = H5_get_srcdir_filename(MISC25B_FILE); /* Corrected test file name */ + bool vol_is_native; bool driver_is_default_compatible; herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Exercise null object header message bug\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); + MESSAGE(5, (" -- SKIPPED --\n")); return; } @@ -5259,17 +5350,25 @@ test_misc27(void) hid_t fid; /* File ID */ hid_t gid; /* Group ID */ const char *testfile = H5_get_srcdir_filename(MISC27_FILE); /* Corrected test file name */ + bool vol_is_native; bool driver_is_default_compatible; herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Corrupt object header handling\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); + MESSAGE(5, (" -- SKIPPED --\n")); return; } @@ -5324,6 +5423,7 @@ test_misc28(void) int nused; char buf[MISC28_SIZE]; int i; + bool vol_is_native; herr_t ret; /* Generic return value */ /* Output message about test being performed */ @@ -5350,17 +5450,22 @@ test_misc28(void) fid = H5Fcreate(MISC28_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(fid, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(fapl, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + sidf = H5Screate_simple(2, dims, NULL); CHECK(sidf, FAIL, "H5Screate_simple"); did = H5Dcreate2(fid, "dataset", H5T_NATIVE_CHAR, sidf, H5P_DEFAULT, dcpl, H5P_DEFAULT); CHECK(did, FAIL, "H5Dcreate2"); - /* Verify that the chunk cache is empty */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)0, "H5D__current_cache_size_test"); - VERIFY(nused, 0, "H5D__current_cache_size_test"); + if (vol_is_native) { + /* Verify that the chunk cache is empty */ + ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); + CHECK(ret, FAIL, "H5D__current_cache_size_test"); + VERIFY(nbytes_used, (size_t)0, "H5D__current_cache_size_test"); + VERIFY(nused, 0, "H5D__current_cache_size_test"); + } /* Initialize write buffer */ for (i = 0; i < MISC28_SIZE; i++) @@ -5377,11 +5482,13 @@ test_misc28(void) ret = H5Dwrite(did, H5T_NATIVE_CHAR, sidm, sidf, H5P_DEFAULT, buf); CHECK(ret, FAIL, "H5Dwrite"); - /* Verify that all 10 chunks written have been cached */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); - VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); + if (vol_is_native) { + /* Verify that all 10 chunks written have been cached */ + ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); + CHECK(ret, FAIL, "H5D__current_cache_size_test"); + VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); + VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); + } /* Initialize write buffer */ for (i = 0; i < MISC28_SIZE; i++) @@ -5396,11 +5503,13 @@ test_misc28(void) ret = H5Dwrite(did, H5T_NATIVE_CHAR, sidm, sidf, H5P_DEFAULT, buf); CHECK(ret, FAIL, "H5Dwrite"); - /* Verify that the size of the cache remains at 10 */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); - VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); + if (vol_is_native) { + /* Verify that the size of the cache remains at 10 */ + ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); + CHECK(ret, FAIL, "H5D__current_cache_size_test"); + VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); + VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); + } /* Close dataset */ ret = H5Dclose(did); @@ -5410,11 +5519,13 @@ test_misc28(void) did = H5Dopen2(fid, "dataset", H5P_DEFAULT); CHECK(did, FAIL, "H5Dopen2"); - /* Verify that the chunk cache is empty */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)0, "H5D__current_cache_size_test"); - VERIFY(nused, 0, "H5D__current_cache_size_test"); + if (vol_is_native) { + /* Verify that the chunk cache is empty */ + ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); + CHECK(ret, FAIL, "H5D__current_cache_size_test"); + VERIFY(nbytes_used, (size_t)0, "H5D__current_cache_size_test"); + VERIFY(nused, 0, "H5D__current_cache_size_test"); + } /* Select hyperslabe for reading */ start[1] = 0; @@ -5429,11 +5540,13 @@ test_misc28(void) for (i = 0; i < MISC28_SIZE; i++) VERIFY(buf[i], i, "H5Dread"); - /* Verify that all 10 chunks read have been cached */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); - VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); + if (vol_is_native) { + /* Verify that all 10 chunks read have been cached */ + ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); + CHECK(ret, FAIL, "H5D__current_cache_size_test"); + VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); + VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); + } /* Select new hyperslab */ start[1] = 1; @@ -5448,11 +5561,13 @@ test_misc28(void) for (i = 0; i < MISC28_SIZE; i++) VERIFY(buf[i], MISC28_SIZE - 1 - i, "H5Dread"); - /* Verify that the size of the cache remains at 10 */ - ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); - CHECK(ret, FAIL, "H5D__current_cache_size_test"); - VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); - VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); + if (vol_is_native) { + /* Verify that the size of the cache remains at 10 */ + ret = H5D__current_cache_size_test(did, &nbytes_used, &nused); + CHECK(ret, FAIL, "H5D__current_cache_size_test"); + VERIFY(nbytes_used, (size_t)MISC28_SIZE, "H5D__current_cache_size_test"); + VERIFY(nused, MISC28_SIZE, "H5D__current_cache_size_test"); + } /* Close dataset */ ret = H5Dclose(did); @@ -5482,6 +5597,7 @@ test_misc28(void) static void test_misc29(void) { + bool vol_is_native; bool driver_is_default_compatible; hid_t fid; /* File ID */ herr_t ret; /* Generic return value */ @@ -5489,11 +5605,18 @@ test_misc29(void) /* Output message about test being performed */ MESSAGE(5, ("Speculative metadata reads\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); + MESSAGE(5, (" -- SKIPPED --\n")); return; } @@ -5541,10 +5664,18 @@ test_misc30(void) { hsize_t file_size[] = {0, 0}; /* Sizes of file created */ unsigned get_info; /* Whether to perform the get info call */ + bool vol_is_native; /* Output message about test being performed */ MESSAGE(5, ("Local heap dropping free block info\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + for (get_info = false; get_info <= true; get_info++) { hid_t fid; /* File ID */ hid_t gid; /* Group ID */ @@ -5610,8 +5741,9 @@ test_misc31(void) hid_t attr_id; /* Attribute id */ hid_t group_id; /* Group id */ hid_t dtype_id; /* Datatype id */ - herr_t ret; /* Generic return value */ -#endif /* H5_NO_DEPRECATED_SYMBOLS */ + bool vol_is_native; + herr_t ret; /* Generic return value */ +#endif /* H5_NO_DEPRECATED_SYMBOLS */ /* Output message about test being performed */ MESSAGE(5, ("Deprecated routines initialize after H5close()\n")); @@ -5620,6 +5752,14 @@ test_misc31(void) file_id = H5Fcreate(MISC31_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(file_id, FAIL, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, file_id, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(file_id), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Test dataset package */ space_id = H5Screate(H5S_SCALAR); CHECK(space_id, FAIL, "H5Screate"); @@ -5774,17 +5914,25 @@ test_misc33(void) hid_t fid = H5I_INVALID_HID; /* File ID */ const char *testfile = H5_get_srcdir_filename(MISC33_FILE); /* Corrected test file name */ H5O_info2_t oinfo; /* Structure for object metadata information */ + bool vol_is_native; bool driver_is_default_compatible; herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing that bad offset into the heap returns error")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); + MESSAGE(5, (" -- SKIPPED --\n")); return; } @@ -6072,6 +6220,7 @@ static void test_misc37(void) { const char *testfile = H5_get_srcdir_filename(CVE_2020_10812_FILENAME); + bool vol_is_native; bool driver_is_default_compatible; hid_t fid; herr_t ret; @@ -6079,11 +6228,18 @@ test_misc37(void) /* Output message about test being performed */ MESSAGE(5, ("Fix for HDFFV-11052/CVE-2020-10812")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + ret = h5_driver_is_default_vfd_compatible(H5P_DEFAULT, &driver_is_default_compatible); CHECK(ret, FAIL, "h5_driver_is_default_vfd_compatible"); if (!driver_is_default_compatible) { - printf("-- SKIPPED --\n"); + MESSAGE(5, (" -- SKIPPED --\n")); return; } diff --git a/test/trefer.c b/test/trefer.c index f17e114..b8f91a0 100644 --- a/test/trefer.c +++ b/test/trefer.c @@ -104,7 +104,8 @@ test_reference_params(void) const char *write_comment = "Foo!"; /* Comments for group */ hid_t ret_id; /* Generic hid_t return value */ ssize_t name_size; /* Size of reference name */ - herr_t ret; /* Generic return value */ + bool vol_is_native; + herr_t ret; /* Generic return value */ /* Output message about test being performed */ MESSAGE(5, ("Testing Reference Parameters\n")); @@ -122,6 +123,9 @@ test_reference_params(void) fid1 = H5Fcreate(FILE_REF_PARAM, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid1, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Create dataspace for datasets */ sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); @@ -138,9 +142,11 @@ test_reference_params(void) group = H5Gcreate2(fid1, "Group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(group, H5I_INVALID_HID, "H5Gcreate2"); - /* Set group's comment */ - ret = H5Oset_comment(group, write_comment); - CHECK(ret, FAIL, "H5Oset_comment"); + if (vol_is_native) { + /* Set group's comment */ + ret = H5Oset_comment(group, write_comment); + CHECK(ret, FAIL, "H5Oset_comment"); + } /* Create a dataset (inside Group1) */ dataset = H5Dcreate2(group, "Dataset1", H5T_NATIVE_UINT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); @@ -2026,6 +2032,12 @@ test_reference_obj_deleted(void) MESSAGE(5, ("Testing References to Deleted Objects\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_REF_BASIC) || + !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_BASIC)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Create file */ fid1 = H5Fcreate(FILE_REF_OBJ_DEL, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); @@ -2848,22 +2860,31 @@ test_reference_compat_conv(void) hdset_reg_ref_t *wbuf_reg = NULL; /* Buffer to write to disk */ H5R_ref_t *rbuf_reg = NULL; /* Buffer read from disk */ H5O_type_t obj_type; /* Object type */ - herr_t ret; /* Generic return value */ - unsigned int i; /* Counter */ + bool vol_is_native; + herr_t ret; /* Generic return value */ + unsigned int i; /* Counter */ /* Output message about test being performed */ MESSAGE(5, ("Testing Deprecated Object Reference Functions\n")); + /* Create file */ + fid1 = H5Fcreate(FILE_REF_COMPAT, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); + + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid1, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + CHECK(H5Fclose(fid1), FAIL, "H5Fclose"); + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Allocate write & read buffers */ wbuf_obj = (hobj_ref_t *)calloc(sizeof(hobj_ref_t), SPACE1_DIM1); rbuf_obj = calloc(sizeof(H5R_ref_t), SPACE1_DIM1); wbuf_reg = calloc(sizeof(hdset_reg_ref_t), SPACE1_DIM1); rbuf_reg = calloc(sizeof(H5R_ref_t), SPACE1_DIM1); - /* Create file */ - fid1 = H5Fcreate(FILE_REF_COMPAT, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); - /* Create dataspace for datasets */ sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); @@ -3158,8 +3179,9 @@ test_reference_perf(void) hdset_reg_ref_t *wbuf_reg_deprec, /* deprecated references*/ *rbuf_reg_deprec; /* deprecated references*/ unsigned *ibuf, *obuf; - unsigned i, j; /* Counters */ - H5O_type_t obj_type; /* Object type */ + unsigned i, j; /* Counters */ + H5O_type_t obj_type; /* Object type */ + bool vol_is_native; herr_t ret; /* Generic return value */ double t1, t2, t; /* Timers */ @@ -3186,6 +3208,9 @@ test_reference_perf(void) fid1 = H5Fcreate(FILE_REF_OBJ, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid1, H5I_INVALID_HID, "H5Fcreate"); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid1, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Create dataspace for datasets */ sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); CHECK(sid1, H5I_INVALID_HID, "H5Screate_simple"); @@ -3284,40 +3309,42 @@ test_reference_perf(void) ret = H5Dclose(dataset); CHECK(ret, FAIL, "H5Dclose"); - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset4", H5T_STD_REF_OBJ, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); + if (vol_is_native) { + /* Create a dataset */ + dataset = H5Dcreate2(fid1, "Dataset4", H5T_STD_REF_OBJ, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); + + t = 0; + for (i = 0; i < MAX_ITER_CREATE; i++) { + t1 = H5_get_time(); + ret = H5Rcreate(&wbuf_deprec[0], fid1, "/Group1/Dataset1", H5R_OBJECT1, H5I_INVALID_HID); + CHECK(ret, FAIL, "H5Rcreate"); + t2 = H5_get_time(); + t += t2 - t1; + } + if (VERBOSE_MED) + printf("--- Deprecated object reference create time: %lfs\n", t / MAX_ITER_CREATE); - t = 0; - for (i = 0; i < MAX_ITER_CREATE; i++) { - t1 = H5_get_time(); + /* Create reference to dataset */ ret = H5Rcreate(&wbuf_deprec[0], fid1, "/Group1/Dataset1", H5R_OBJECT1, H5I_INVALID_HID); CHECK(ret, FAIL, "H5Rcreate"); - t2 = H5_get_time(); - t += t2 - t1; - } - if (VERBOSE_MED) - printf("--- Deprecated object reference create time: %lfs\n", t / MAX_ITER_CREATE); - /* Create reference to dataset */ - ret = H5Rcreate(&wbuf_deprec[0], fid1, "/Group1/Dataset1", H5R_OBJECT1, H5I_INVALID_HID); - CHECK(ret, FAIL, "H5Rcreate"); + t = 0; + for (i = 0; i < MAX_ITER_WRITE; i++) { + t1 = H5_get_time(); + /* Write selection to disk */ + ret = H5Dwrite(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf_deprec); + CHECK(ret, FAIL, "H5Dwrite"); + t2 = H5_get_time(); + t += t2 - t1; + } + if (VERBOSE_MED) + printf("--- Deprecated object reference write time: %lfs\n", t / MAX_ITER_WRITE); - t = 0; - for (i = 0; i < MAX_ITER_WRITE; i++) { - t1 = H5_get_time(); - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf_deprec); - CHECK(ret, FAIL, "H5Dwrite"); - t2 = H5_get_time(); - t += t2 - t1; + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); } - if (VERBOSE_MED) - printf("--- Deprecated object reference write time: %lfs\n", t / MAX_ITER_WRITE); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); /* Create a dataset */ dataset = H5Dcreate2(fid1, "Dataset5", H5T_STD_REF, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); @@ -3357,37 +3384,40 @@ test_reference_perf(void) ret = H5Dclose(dataset); CHECK(ret, FAIL, "H5Dclose"); - /* Create a dataset */ - dataset = H5Dcreate2(fid1, "Dataset6", H5T_STD_REF_DSETREG, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); - - t = 0; - for (i = 0; i < MAX_ITER_CREATE; i++) { - t1 = H5_get_time(); - /* Store first dataset region */ - ret = H5Rcreate(&wbuf_reg_deprec[0], fid1, "/Group1/Dataset1", H5R_DATASET_REGION1, sid1); - CHECK(ret, FAIL, "H5Rcreate"); - t2 = H5_get_time(); - t += t2 - t1; - } - if (VERBOSE_MED) - printf("--- Deprecated region reference create time: %lfs\n", t / MAX_ITER_CREATE); + if (vol_is_native) { + /* Create a dataset */ + dataset = + H5Dcreate2(fid1, "Dataset6", H5T_STD_REF_DSETREG, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + CHECK(dataset, H5I_INVALID_HID, "H5Dcreate2"); + + t = 0; + for (i = 0; i < MAX_ITER_CREATE; i++) { + t1 = H5_get_time(); + /* Store first dataset region */ + ret = H5Rcreate(&wbuf_reg_deprec[0], fid1, "/Group1/Dataset1", H5R_DATASET_REGION1, sid1); + CHECK(ret, FAIL, "H5Rcreate"); + t2 = H5_get_time(); + t += t2 - t1; + } + if (VERBOSE_MED) + printf("--- Deprecated region reference create time: %lfs\n", t / MAX_ITER_CREATE); + + t = 0; + for (i = 0; i < MAX_ITER_WRITE; i++) { + t1 = H5_get_time(); + /* Write selection to disk */ + ret = H5Dwrite(dataset, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf_reg_deprec); + CHECK(ret, FAIL, "H5Dwrite"); + t2 = H5_get_time(); + t += t2 - t1; + } + if (VERBOSE_MED) + printf("--- Deprecated region reference write time: %lfs\n", t / MAX_ITER_WRITE); - t = 0; - for (i = 0; i < MAX_ITER_WRITE; i++) { - t1 = H5_get_time(); - /* Write selection to disk */ - ret = H5Dwrite(dataset, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf_reg_deprec); - CHECK(ret, FAIL, "H5Dwrite"); - t2 = H5_get_time(); - t += t2 - t1; + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); } - if (VERBOSE_MED) - printf("--- Deprecated region reference write time: %lfs\n", t / MAX_ITER_WRITE); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); /* Close disk dataspace */ ret = H5Sclose(sid1); @@ -3449,25 +3479,27 @@ test_reference_perf(void) ret = H5Dclose(dataset); CHECK(ret, FAIL, "H5Dclose"); - /* Open the dataset */ - dataset = H5Dopen2(fid1, "/Dataset4", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); + if (vol_is_native) { + /* Open the dataset */ + dataset = H5Dopen2(fid1, "/Dataset4", H5P_DEFAULT); + CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); + + t = 0; + for (i = 0; i < MAX_ITER_READ; i++) { + t1 = H5_get_time(); + /* Read selection from disk */ + ret = H5Dread(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf_deprec); + CHECK(ret, FAIL, "H5Dread"); + t2 = H5_get_time(); + t += t2 - t1; + } + if (VERBOSE_MED) + printf("--- Deprecated object reference read time: %lfs\n", t / MAX_ITER_READ); - t = 0; - for (i = 0; i < MAX_ITER_READ; i++) { - t1 = H5_get_time(); - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf_deprec); - CHECK(ret, FAIL, "H5Dread"); - t2 = H5_get_time(); - t += t2 - t1; + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); } - if (VERBOSE_MED) - printf("--- Deprecated object reference read time: %lfs\n", t / MAX_ITER_READ); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); /* Open the dataset */ dataset = H5Dopen2(fid1, "/Dataset5", H5P_DEFAULT); @@ -3495,25 +3527,27 @@ test_reference_perf(void) ret = H5Dclose(dataset); CHECK(ret, FAIL, "H5Dclose"); - /* Open the dataset */ - dataset = H5Dopen2(fid1, "/Dataset6", H5P_DEFAULT); - CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); + if (vol_is_native) { + /* Open the dataset */ + dataset = H5Dopen2(fid1, "/Dataset6", H5P_DEFAULT); + CHECK(dataset, H5I_INVALID_HID, "H5Dopen2"); + + t = 0; + for (i = 0; i < MAX_ITER_READ; i++) { + t1 = H5_get_time(); + /* Read selection from disk */ + ret = H5Dread(dataset, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf_reg_deprec); + CHECK(ret, FAIL, "H5Dread"); + t2 = H5_get_time(); + t += t2 - t1; + } + if (VERBOSE_MED) + printf("--- Deprecated region reference read time: %lfs\n", t / MAX_ITER_READ); - t = 0; - for (i = 0; i < MAX_ITER_READ; i++) { - t1 = H5_get_time(); - /* Read selection from disk */ - ret = H5Dread(dataset, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf_reg_deprec); - CHECK(ret, FAIL, "H5Dread"); - t2 = H5_get_time(); - t += t2 - t1; + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); } - if (VERBOSE_MED) - printf("--- Deprecated region reference read time: %lfs\n", t / MAX_ITER_READ); - - /* Close Dataset */ - ret = H5Dclose(dataset); - CHECK(ret, FAIL, "H5Dclose"); /* Close dataset access property list */ ret = H5Pclose(dapl_id); diff --git a/test/trefer_deprec.c b/test/trefer_deprec.c index 5bb1f13..bbcf630 100644 --- a/test/trefer_deprec.c +++ b/test/trefer_deprec.c @@ -1815,10 +1815,18 @@ void test_reference_deprec(void) { H5F_libver_t low, high; /* Low and high bounds */ + bool vol_is_native; /* Output message about test being performed */ MESSAGE(5, ("Testing Deprecated References\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + test_reference_params(); /* Test for correct parameter checking */ test_reference_obj(); /* Test basic H5R object reference code */ diff --git a/test/tsohm.c b/test/tsohm.c index b3f48d3..542fd68 100644 --- a/test/tsohm.c +++ b/test/tsohm.c @@ -3711,10 +3711,18 @@ void test_sohm(void) { const char *env_h5_drvr; + bool vol_is_native; bool default_driver; MESSAGE(5, ("Testing Shared Object Header Messages\n")); + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, H5I_INVALID_HID, &vol_is_native), FAIL, "h5_using_native_vol"); + if (!vol_is_native) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + /* Get the VFD to use */ env_h5_drvr = getenv(HDF5_DRIVER); if (env_h5_drvr == NULL) diff --git a/test/tunicode.c b/test/tunicode.c index 705bdfd..a65b469 100644 --- a/test/tunicode.c +++ b/test/tunicode.c @@ -382,25 +382,31 @@ test_objnames(hid_t fid, const char *string) hsize_t dims = 1; hobj_ref_t obj_ref; ssize_t size; + bool vol_is_native; herr_t ret; + /* Check if native VOL is being used */ + CHECK(h5_using_native_vol(H5P_DEFAULT, fid, &vol_is_native), FAIL, "h5_using_native_vol"); + /* Create a group with a UTF-8 name */ grp_id = H5Gcreate2(fid, string, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(grp_id, FAIL, "H5Gcreate2"); - /* Set a comment on the group to test that we can access the group - * Also test that UTF-8 comments can be read. - */ - ret = H5Oset_comment_by_name(fid, string, string, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Oset_comment_by_name"); - size = H5Oget_comment_by_name(fid, string, read_buf, (size_t)MAX_STRING_LENGTH, H5P_DEFAULT); - CHECK(size, FAIL, "H5Oget_comment_by_name"); + if (vol_is_native) { + /* Set a comment on the group to test that we can access the group + * Also test that UTF-8 comments can be read. + */ + ret = H5Oset_comment_by_name(fid, string, string, H5P_DEFAULT); + CHECK(ret, FAIL, "H5Oset_comment_by_name"); + size = H5Oget_comment_by_name(fid, string, read_buf, (size_t)MAX_STRING_LENGTH, H5P_DEFAULT); + CHECK(size, FAIL, "H5Oget_comment_by_name"); + + VERIFY(strcmp(string, read_buf), 0, "strcmp"); + } ret = H5Gclose(grp_id); CHECK(ret, FAIL, "H5Gclose"); - VERIFY(strcmp(string, read_buf), 0, "strcmp"); - /* Create a new dataset with a UTF-8 name */ grp1_id = H5Gcreate2(fid, GROUP1_NAME, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(grp1_id, FAIL, "H5Gcreate2"); @@ -441,34 +447,35 @@ test_objnames(hid_t fid, const char *string) /* Don't close the group -- use it to test that object references * can refer to objects named in UTF-8 */ - - space_id = H5Screate_simple(RANK, &dims, NULL); - CHECK(space_id, FAIL, "H5Screate_simple"); - dset_id = - H5Dcreate2(grp2_id, DSET3_NAME, H5T_STD_REF_OBJ, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - CHECK(ret, FAIL, "H5Dcreate2"); - - /* Create reference to named datatype */ - ret = H5Rcreate(&obj_ref, grp2_id, string, H5R_OBJECT, (hid_t)H5I_INVALID_HID); - CHECK(ret, FAIL, "H5Rcreate"); - /* Write selection and read it back*/ - ret = H5Dwrite(dset_id, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &obj_ref); - CHECK(ret, FAIL, "H5Dwrite"); - ret = H5Dread(dset_id, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &obj_ref); - CHECK(ret, FAIL, "H5Dread"); - - /* Ensure that we can open named datatype using object reference */ - type_id = H5Rdereference2(dset_id, H5P_DEFAULT, H5R_OBJECT, &obj_ref); - CHECK(type_id, FAIL, "H5Rdereference2"); - ret = H5Tcommitted(type_id); - VERIFY(ret, 1, "H5Tcommitted"); - - ret = H5Tclose(type_id); - CHECK(type_id, FAIL, "H5Tclose"); - ret = H5Dclose(dset_id); - CHECK(ret, FAIL, "H5Dclose"); - ret = H5Sclose(space_id); - CHECK(ret, FAIL, "H5Sclose"); + if (vol_is_native) { + space_id = H5Screate_simple(RANK, &dims, NULL); + CHECK(space_id, FAIL, "H5Screate_simple"); + dset_id = + H5Dcreate2(grp2_id, DSET3_NAME, H5T_STD_REF_OBJ, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + CHECK(ret, FAIL, "H5Dcreate2"); + + /* Create reference to named datatype */ + ret = H5Rcreate(&obj_ref, grp2_id, string, H5R_OBJECT, (hid_t)-1); + CHECK(ret, FAIL, "H5Rcreate"); + /* Write selection and read it back*/ + ret = H5Dwrite(dset_id, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &obj_ref); + CHECK(ret, FAIL, "H5Dwrite"); + ret = H5Dread(dset_id, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, &obj_ref); + CHECK(ret, FAIL, "H5Dread"); + + /* Ensure that we can open named datatype using object reference */ + type_id = H5Rdereference2(dset_id, H5P_DEFAULT, H5R_OBJECT, &obj_ref); + CHECK(type_id, FAIL, "H5Rdereference2"); + ret = H5Tcommitted(type_id); + VERIFY(ret, 1, "H5Tcommitted"); + + ret = H5Tclose(type_id); + CHECK(type_id, FAIL, "H5Tclose"); + ret = H5Dclose(dset_id); + CHECK(ret, FAIL, "H5Dclose"); + ret = H5Sclose(space_id); + CHECK(ret, FAIL, "H5Sclose"); + } ret = H5Gclose(grp2_id); CHECK(ret, FAIL, "H5Gclose"); diff --git a/test/tvlstr.c b/test/tvlstr.c index a3ea041..9f41a05 100644 --- a/test/tvlstr.c +++ b/test/tvlstr.c @@ -882,6 +882,11 @@ test_write_same_element(void) MESSAGE(5, ("Testing writing to same element of VL string dataset twice\n")); + if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC)) { + MESSAGE(5, (" -- SKIPPED --\n")); + return; + } + file1 = H5Fcreate(DATAFILE3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(file1, FAIL, "H5Fcreate"); |