Skip to content

Commit

Permalink
Merge pull request #416 from HDFGroup/chogan/vfd_tests
Browse files Browse the repository at this point in the history
Add test suite for the Hermes VFD
  • Loading branch information
ChristopherHogan committed Apr 28, 2022
2 parents d196433 + 0559fec commit d2285f2
Show file tree
Hide file tree
Showing 13 changed files with 1,627 additions and 258 deletions.
2 changes: 1 addition & 1 deletion CMake/Findortools.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,4 @@ if(NOT TARGET ortools::ortools)
# if all listed variables are TRUE
find_package_handle_standard_args(ortools
REQUIRED_VARS ORTOOLS_LIBRARIES ORTOOLS_INCLUDE_DIRS)
endif()
endif()
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ if(HERMES_INTERCEPT_IO)
endif()

if(HERMES_COMMUNICATION_MPI)
find_package(MPI REQUIRED COMPONENTS CXX)
find_package(MPI REQUIRED COMPONENTS C CXX)
message(STATUS "found mpi.h at ${MPI_CXX_INCLUDE_DIRS}")
endif()

Expand Down
7 changes: 7 additions & 0 deletions adapter/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@ endif()

if(HERMES_ENABLE_VFD)
if(HERMES_ENABLE_WRAPPER)
# The Hermes VFD cannot be installed into the same directory as libhermes.so
# because of the way dynamic plugin loading works in HDF5. When searching
# for a VFD, HDF5 will dlopen and dlclose every shared library in
# HDF5_PLUGIN_PATH looking for a valid VFD. When HDF5 goes through this
# process with libhermes.so it resets some statically initialized variables.
set(HERMES_VFD_DIR_NAME hermes_vfd)
set(HERMES_VFD_LIBRARY_DIR ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${HERMES_VFD_DIR_NAME})
add_subdirectory(vfd)
else()
message(FATAL_ERROR "The Hermes VFD requires HERMES_ENABLE_WRAPPER=ON")
Expand Down
84 changes: 56 additions & 28 deletions adapter/test/vfd/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,64 @@ set(hermes_vfd_tests
hermes_vfd_test
)

foreach(vfd_test ${hermes_vfd_tests})
add_executable(${vfd_test} ${CMAKE_CURRENT_SOURCE_DIR}/${vfd_test}.cc)
add_dependencies(${vfd_test} hermes)
target_include_directories(${vfd_test} PRIVATE ${HERMES_VFD_DIR})
target_include_directories(${vfd_test}
SYSTEM PUBLIC ${HDF5_HERMES_VFD_EXT_INCLUDE_DEPENDENCIES}
)
target_link_libraries(${vfd_test}
MPI::MPI_CXX
hermes
${HDF5_HERMES_VFD_EXPORTED_LIBS}
${HDF5_HERMES_VFD_EXT_LIB_DEPENDENCIES}
${HDF5_HERMES_VFD_EXT_PKG_DEPENDENCIES}
)
add_test(NAME "Test${vfd_test}" COMMAND ${vfd_test})
set_property(TEST "Test${vfd_test}"
PROPERTY ENVIRONMENT HERMES_CONF=${CMAKE_CURRENT_SOURCE_DIR}/hermes.conf)
set_property(TEST "Test${vfd_test}" APPEND
add_executable(hermes_vfd_test ${CMAKE_CURRENT_SOURCE_DIR}/hermes_vfd_test.cc)
target_include_directories(hermes_vfd_test PRIVATE ${HERMES_VFD_DIR})
target_include_directories(hermes_vfd_test PRIVATE ${HERMES_ADAPTER_TEST_DIR})
target_include_directories(hermes_vfd_test
SYSTEM PRIVATE ${HDF5_HERMES_VFD_EXT_INCLUDE_DEPENDENCIES}
)

target_link_libraries(hermes_vfd_test
hermes
MPI::MPI_CXX
stdc++fs
${HDF5_HERMES_VFD_EXT_LIB_DEPENDENCIES}
${HDF5_HERMES_VFD_EXT_PKG_DEPENDENCIES}
)

if(HERMES_USE_ADDRESS_SANITIZER)
execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=libasan.so
OUTPUT_VARIABLE LIBASAN_PATH
RESULT_VARIABLE ASAN_PRINT_FILE_NAME_RESULT
OUTPUT_STRIP_TRAILING_WHITESPACE)

if(ASAN_PRINT_FILE_NAME_RESULT EQUAL 0)
message(STATUS "Found libasan.so at ${LIBASAN_PATH}")
else()
message(FATAL_ERROR
"Couldn't find the path to libasan.so which is required by the Hermes HDF5 VFD tests. \
Recompile with HERMES_ENABLE_ADDRESS_SANITIZER=OFF")
endif()
endif()

function(set_vfd_test_properties test_name)
set_property(TEST ${test_name}
PROPERTY ENVIRONMENT HERMES_CONF=${HERMES_ADAPTER_TEST_DIR}/data/hermes.conf)
set_property(TEST ${test_name} APPEND
PROPERTY ENVIRONMENT HDF5_PLUGIN_PATH=${HERMES_VFD_LIBRARY_DIR})
set_property(TEST ${test_name} APPEND
PROPERTY ENVIRONMENT HDF5_DRIVER=hermes)
set_property(TEST ${test_name} APPEND
PROPERTY ENVIRONMENT LD_PRELOAD=${LIBASAN_PATH}:$<TARGET_FILE:hdf5_hermes_vfd>)
set_property(TEST ${test_name} APPEND
PROPERTY ENVIRONMENT LSAN_OPTIONS=suppressions=${CMAKE_SOURCE_DIR}/test/data/asan.supp)
endforeach()
endfunction()

add_test(NAME "TestVfd" COMMAND hermes_vfd_test --reporter compact -d yes)
set_vfd_test_properties("TestVfd")
set_property(TEST "TestVfd" APPEND
PROPERTY ENVIRONMENT HDF5_DRIVER_CONFIG=true\ 65536)

add_test(NAME "TestVfdScratchMode" COMMAND hermes_vfd_test "[scratch]" --reporter compact -d yes)
set_vfd_test_properties("TestVfdScratchMode")
set_property(TEST "TestVfdScratchMode" APPEND
PROPERTY ENVIRONMENT HDF5_DRIVER_CONFIG=false\ 65536)

# IOR tests
if(HERMES_HAVE_IOR)
add_test(NAME "TestVFDWrite" COMMAND ${IOR_EXE} -a HDF5 -w -W -r -R)
set_property(TEST "TestVFDWrite"
PROPERTY ENVIRONMENT HERMES_CONF=${CMAKE_CURRENT_SOURCE_DIR}/hermes.conf)
set_property(TEST "TestVFDWrite" APPEND
PROPERTY ENVIRONMENT HDF5_PLUGIN_PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
set_property(TEST "TestVFDWrite" APPEND
PROPERTY ENVIRONMENT HDF5_DRIVER_CONFIG=true\ 1024)
set_property(TEST "TestVFDWrite" APPEND
PROPERTY ENVIRONMENT HDF5_DRIVER=hermes)
set(IOR_TEST_NAME "TestVfdIor")
add_test(NAME ${IOR_TEST_NAME} COMMAND ${IOR_EXE} -a HDF5 -w -W -r -R)
set_vfd_test_properties(${IOR_TEST_NAME})
set_property(TEST ${IOR_TEST_NAME} APPEND
PROPERTY ENVIRONMENT HDF5_DRIVER_CONFIG=true\ 262144)
endif()
48 changes: 0 additions & 48 deletions adapter/test/vfd/hermes.conf

This file was deleted.

Loading

0 comments on commit d2285f2

Please sign in to comment.