From c6382f50c5744595d3a9ba69a04f76782f3b8672 Mon Sep 17 00:00:00 2001 From: Allen Byrne Date: Mon, 28 Feb 2011 15:25:25 -0500 Subject: [svn-r20168] BZ2048: Add -E --enable-error-stack option to h5dump. Tested: local linux, heiwa, windows --- MANIFEST | 2 ++ config/cmake/runTest.cmake | 2 +- tools/h5dump/CMakeLists.txt | 26 ++++++++++++++++++++ tools/h5dump/h5dump.c | 14 ++++++++--- tools/h5dump/testh5dump.sh.in | 51 ++++++++++++++++++++++++++++++++++++++++ tools/testfiles/filter_fail.ddl | 30 +++++++++++++++++++++++ tools/testfiles/filter_fail.h5 | Bin 0 -> 3528 bytes tools/testfiles/tnofilename.ddl | 1 + 8 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 tools/testfiles/filter_fail.ddl create mode 100644 tools/testfiles/filter_fail.h5 diff --git a/MANIFEST b/MANIFEST index 24397f0..a205738 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1166,6 +1166,8 @@ ./tools/testfiles/family_file00015.h5 ./tools/testfiles/family_file00016.h5 ./tools/testfiles/family_file00017.h5 +./tools/testfiles/filter_fail.h5 +./tools/testfiles/filter_fail.ddl ./tools/testfiles/packedbits.h5 ./tools/testfiles/packedbits.ddl ./tools/testfiles/file_space.h5 diff --git a/config/cmake/runTest.cmake b/config/cmake/runTest.cmake index 26acc39..4bdc4fd 100644 --- a/config/cmake/runTest.cmake +++ b/config/cmake/runTest.cmake @@ -77,7 +77,7 @@ IF (TEST_MASK_ERROR) FILE (READ ${TEST_FOLDER}/${TEST_OUTPUT} TEST_STREAM) STRING(REGEX REPLACE "thread [0-9]*:" "thread (IDs):" TEST_STREAM "${TEST_STREAM}") STRING(REGEX REPLACE ": ([^\n]*)[.]c " ": (file name) " TEST_STREAM "${TEST_STREAM}") - STRING(REGEX REPLACE "line [0-9]*" "line (number)" TEST_STREAM "${TEST_STREAM}") + STRING(REGEX REPLACE " line [0-9]*" " line (number)" TEST_STREAM "${TEST_STREAM}") STRING(REGEX REPLACE "v[1-9]*[.][0-9]*[.]" "version (number)." TEST_STREAM "${TEST_STREAM}") STRING(REGEX REPLACE "[1-9]*[.][0-9]*[.][0-9]*[^)]*" "version (number)" TEST_STREAM "${TEST_STREAM}") STRING(REGEX REPLACE "H5Eget_auto[1-2]*" "H5Eget_auto(1 or 2)" TEST_STREAM "${TEST_STREAM}") diff --git a/tools/h5dump/CMakeLists.txt b/tools/h5dump/CMakeLists.txt index 13cfee7..dc03f01 100644 --- a/tools/h5dump/CMakeLists.txt +++ b/tools/h5dump/CMakeLists.txt @@ -38,6 +38,7 @@ IF (BUILD_TESTING) # Copy all the HDF5 files from the test directory into the source directory # -------------------------------------------------------------------- SET (HDF5_REFERENCE_FILES + filter_fail.ddl packedbits.ddl tall-1.ddl tall-2.ddl @@ -220,6 +221,7 @@ IF (BUILD_TESTING) tbin3.ddl tbin4.ddl out3.h5import + filter_fail.h5 packedbits.h5 taindices.h5 tall.h5 @@ -440,6 +442,25 @@ IF (BUILD_TESTING) SET (last_test "H5DUMP-output-cmp-${resultfile}") ENDMACRO (ADD_H5_EXPORT_TEST file) + MACRO (ADD_H5_MASK_TEST resultfile resultcode) + ADD_TEST ( + NAME H5DUMP-${resultfile} + COMMAND "${CMAKE_COMMAND}" + -D "TEST_PROGRAM=$" + -D "TEST_ARGS:STRING=${ARGN}" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" + -D "TEST_OUTPUT=${resultfile}.out" + -D "TEST_EXPECT=${resultcode}" + -D "TEST_REFERENCE=${resultfile}.ddl" + -D "TEST_MASK_ERROR=true" + -P "${HDF5_RESOURCES_DIR}/runTest.cmake" + ) + IF (NOT "${last_test}" STREQUAL "") + SET_TESTS_PROPERTIES (H5DUMP-${resultfile} PROPERTIES DEPENDS ${last_test}) + ENDIF (NOT "${last_test}" STREQUAL "") + SET (last_test "H5DUMP-${resultfile}") + ENDMACRO (ADD_H5_MASK_TEST file) + MACRO (ADD_XML_SKIP_H5_TEST skipresultfile skipresultcode testtype) IF (${testtype} STREQUAL "SKIP") ADD_TEST ( @@ -495,6 +516,8 @@ IF (BUILD_TESTING) NAME H5DUMP-clearall-objects COMMAND ${CMAKE_COMMAND} -E remove + filter_fail.out + filter_fail.out.err packedbits.out packedbits.out.err tall-1.out @@ -1048,6 +1071,9 @@ IF (BUILD_TESTING) # test for dangling external links ADD_H5_TEST (textlink 0 textlink.h5) + # test for error stack display (BZ2048) + ADD_H5_MASK_TEST (filter_fail 1 -E filter_fail.h5) + ####### test for dataset packed bits ###### IF (HDF5_USE_H5DUMP_PACKED_BITS) # Remove any output file left over from previous test run diff --git a/tools/h5dump/h5dump.c b/tools/h5dump/h5dump.c index 6b1f576..98bd6c9 100644 --- a/tools/h5dump/h5dump.c +++ b/tools/h5dump/h5dump.c @@ -92,6 +92,7 @@ static int display_fi = FALSE; /*file index */ static int display_ai = TRUE; /*array index */ static int display_escape = FALSE; /*escape non printable characters */ static int display_region = FALSE; /*print region reference data */ +static int enable_error_stack= FALSE; /* re-enable error stack */ /* sort parameters */ static H5_index_t sort_by = H5_INDEX_NAME; /*sort_by [creation_order | name] */ @@ -386,7 +387,7 @@ struct handler_t { * parameters. The long-named ones can be partially spelled. When * adding more, make sure that they don't clash with each other. */ -static const char *s_opts = "hnpeyBHirVa:c:d:f:g:k:l:t:w:xD:uX:o:b*F:s:S:Aq:z:m:R"; +static const char *s_opts = "hnpeyBHirVa:c:d:f:g:k:l:t:w:xD:uX:o:b*F:s:S:Aq:z:m:RE"; static struct long_options l_opts[] = { { "help", no_arg, 'h' }, { "hel", no_arg, 'h' }, @@ -499,6 +500,7 @@ static struct long_options l_opts[] = { { "sort_order", require_arg, 'z' }, { "format", require_arg, 'm' }, { "region", no_arg, 'R' }, + { "enable-error-stack", no_arg, 'E' }, { NULL, 0, '\0' } }; @@ -661,6 +663,7 @@ usage(const char *prog) fprintf(stdout, " -X S, --xml-ns=S (XML Schema) Use qualified names n the XML\n"); fprintf(stdout, " \":\": no namespace, default: \"hdf5:\"\n"); fprintf(stdout, " E.g., to dump a file called `-f', use h5dump -- -f\n"); + fprintf(stdout, " -E, --enable-error-stack Show all HDF5 error reporting\n"); fprintf(stdout, "\n"); fprintf(stdout, " Subsetting is available by using the following options with a dataset\n"); fprintf(stdout, " attribute. Subsetting is done by selecting a hyperslab from the data.\n"); @@ -4221,6 +4224,9 @@ end_collect: } /** end subsetting parameters **/ + case 'E': + enable_error_stack = TRUE; + break; case 'h': usage(h5tools_getprogname()); leave(EXIT_SUCCESS); @@ -4342,12 +4348,14 @@ main(int argc, const char *argv[]) h5tools_init(); hand = parse_command_line(argc, argv); - if ( bin_output && outfname == NULL ) - { + if (bin_output && outfname == NULL) { error_msg("binary output requires a file name, use -o \n"); leave(EXIT_FAILURE); } + if (enable_error_stack) + H5Eset_auto2(H5E_DEFAULT, func, edata); + /* Check for conflicting options */ if (doxml) { if (!display_all) { diff --git a/tools/h5dump/testh5dump.sh.in b/tools/h5dump/testh5dump.sh.in index db42cb6..96be2b9 100644 --- a/tools/h5dump/testh5dump.sh.in +++ b/tools/h5dump/testh5dump.sh.in @@ -196,6 +196,55 @@ TOOLTEST2() { } +# same as TOOLTEST but filters error stack outp +# Extract file name, line number, version and thread IDs because they may be different +TOOLTEST3() { + + expect="$srcdir/../testfiles/$1" + actual="../testfiles/`basename $1 .ddl`.out" + actual_err="../testfiles/`basename $1 .ddl`.err" + actual_ext="../testfiles/`basename $1 .ddl`.ext" + shift + + # Run test. + TESTING $DUMPER $@ + ( + echo "#############################" + echo "Expected output for '$DUMPER $@'" + echo "#############################" + cd $srcdir/../testfiles + $RUNSERIAL $DUMPER_BIN $@ + ) >$actual 2>$actual_err + + # Extract file name, line number, version and thread IDs because they may be different + sed -e 's/thread [0-9]*/thread (IDs)/' -e 's/: .*\.c /: (file name) /' \ + -e 's/line [0-9]*/line (number)/' \ + -e 's/v[1-9]*\.[0-9]*\./version (number)\./' \ + -e 's/[1-9]*\.[0-9]*\.[0-9]*[^)]*/version (number)/' \ + -e 's/H5Eget_auto[1-2]*/H5Eget_auto(1 or 2)/' \ + -e 's/H5Eset_auto[1-2]*/H5Eset_auto(1 or 2)/' \ + $actual_err > $actual_ext + cat $actual_ext >> $actual + + if [ ! -f $expect ]; then + # Create the expect file if it doesn't yet exist. + echo " CREATED" + cp $actual $expect + elif $CMP $expect $actual; then + echo " PASSED" + else + echo "*FAILED*" + echo " Expected result (*.ddl) differs from actual result (*.out)" + nerrors="`expr $nerrors + 1`" + test yes = "$verbose" && $DIFF $expect $actual |sed 's/^/ /' + fi + + # Clean up output file + if test -z "$HDF5_NOCLEANUP"; then + rm -f $actual $actual_err + fi + +} # Print a "SKIP" message SKIP() { @@ -581,6 +630,8 @@ TOOLTEST textlinkfar.ddl textlinkfar.h5 # test for dangling external links TOOLTEST textlink.ddl textlink.h5 +# test for error stack display (BZ2048) +TOOLTEST3 filter_fail.ddl -E filter_fail.h5 # Report test results and exit if test $nerrors -eq 0 ; then diff --git a/tools/testfiles/filter_fail.ddl b/tools/testfiles/filter_fail.ddl new file mode 100644 index 0000000..247fb34 --- /dev/null +++ b/tools/testfiles/filter_fail.ddl @@ -0,0 +1,30 @@ +############################# +Expected output for 'h5dump -E filter_fail.h5' +############################# +HDF5 "filter_fail.h5" { +GROUP "/" { + DATASET "dset_fail" { + DATATYPE H5T_STD_I32LE + DATASPACE SIMPLE { ( 10 ) / ( 10 ) } + DATA { + } + } +} +} +HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs): + #000: (file name) line (number) in H5Dread(): can't read data + major: Dataset + minor: Read failed + #001: (file name) line (number) in H5D_read(): can't read data + major: Dataset + minor: Read failed + #002: (file name) line (number) in H5D_chunk_read(): unable to read raw data chunk + major: Low-level I/O + minor: Read failed + #003: (file name) line (number) in H5D_chunk_lock(): data pipeline read failed + major: Data filters + minor: Filter operation failed + #004: (file name) line (number) in H5Z_pipeline(): required filter is not registered + major: Data filters + minor: Read failed +h5dump error: unable to print data diff --git a/tools/testfiles/filter_fail.h5 b/tools/testfiles/filter_fail.h5 new file mode 100644 index 0000000..c140a69 Binary files /dev/null and b/tools/testfiles/filter_fail.h5 differ diff --git a/tools/testfiles/tnofilename.ddl b/tools/testfiles/tnofilename.ddl index 5b9299b..7845675 100644 --- a/tools/testfiles/tnofilename.ddl +++ b/tools/testfiles/tnofilename.ddl @@ -35,6 +35,7 @@ usage: h5dump [OPTIONS] file -X S, --xml-ns=S (XML Schema) Use qualified names n the XML ":": no namespace, default: "hdf5:" E.g., to dump a file called `-f', use h5dump -- -f + -E, --enable-error-stack Show all HDF5 error reporting Subsetting is available by using the following options with a dataset attribute. Subsetting is done by selecting a hyperslab from the data. -- cgit v0.12