From 08e13006257ad085b9b00c8627bfa8a85d0c7cde Mon Sep 17 00:00:00 2001 From: Jonathan Kim Date: Thu, 14 Oct 2010 15:47:20 -0500 Subject: [svn-r19598] Purpose: Fix for bug# 2040 - h5copy should fail gracefully for expected failure copying to non-exist nested group without -p option. Description: Fixed h5copy to fail gracefully when copying object to non-exist group without -p option. Expected to be failed. Tested: jam, amani, heiwa --- MANIFEST | 1 + release_docs/RELEASE.txt | 2 + tools/h5copy/h5copy.c | 23 ++++++++ tools/h5copy/testfiles/h5copy_misc1.out | 5 ++ tools/h5copy/testh5copy.sh | 100 +++++++++++++++++++++++++------- 5 files changed, 110 insertions(+), 21 deletions(-) create mode 100644 tools/h5copy/testfiles/h5copy_misc1.out diff --git a/MANIFEST b/MANIFEST index 5f8434f..12b025c 100644 --- a/MANIFEST +++ b/MANIFEST @@ -1717,6 +1717,7 @@ ./tools/h5copy/testfiles/h5copy_extlinks_src.h5 ./tools/h5copy/testfiles/h5copy_extlinks_trg.h5 ./tools/h5copy/testfiles/h5copy_extlinks_src.out.ls +./tools/h5copy/testfiles/h5copy_misc1.out # test files for h5mkgrp ./tools/testfiles/h5mkgrp_help.ls diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index 86320b1..f9e2c1b 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -474,6 +474,8 @@ Bug Fixes since HDF5-1.8.0 release Tools ----- + - Fixed h5copy to fail gracefully when copying object to non-exist + group without -p option. Bug#2040 (JKM 2010/10/14) - Fixed to compare member objects and groups recursively when two files or groups are specified to be compared. Bug#1975 (JKM 2010/9/16) diff --git a/tools/h5copy/h5copy.c b/tools/h5copy/h5copy.c index eb16754..595864e 100644 --- a/tools/h5copy/h5copy.c +++ b/tools/h5copy/h5copy.c @@ -215,6 +215,8 @@ main (int argc, const char *argv[]) int opt; int li_ret; h5tool_link_info_t linkinfo; + int i, len; + char *str_prt=NULL; h5tools_setprogname(PROGRAMNAME); h5tools_setstatus(EXIT_SUCCESS); @@ -406,6 +408,23 @@ main (int argc, const char *argv[]) if(verbose) printf("%s: Creating parent groups\n", h5tools_getprogname()); } /* end if */ + else /* error, if parent groups doesn't already exist in destination file */ + { + len = strlen(oname_dst); + /* check if all the parents groups exist. skip root group */ + for (i = 1; i < len-1; i++) + { + if ('/'==oname_dst[i]) + { + str_prt = strndup(oname_dst, (size_t)i); + if (H5Lexists(fid_dst, str_prt, H5P_DEFAULT) <= 0) + { + error_msg("group <%s> doesn't exist. Use -p to create parent groups.\n"); + goto error; + } + } + } + } /*------------------------------------------------------------------------- * do the copy @@ -459,6 +478,8 @@ main (int argc, const char *argv[]) free(oname_dst); if (oname_src) free(oname_src); + if (str_prt) + free(str_prt); h5tools_close(); @@ -485,6 +506,8 @@ error: free(oname_dst); if (oname_src) free(oname_src); + if (str_prt) + free(str_prt); h5tools_close(); diff --git a/tools/h5copy/testfiles/h5copy_misc1.out b/tools/h5copy/testfiles/h5copy_misc1.out new file mode 100644 index 0000000..ac11605 --- /dev/null +++ b/tools/h5copy/testfiles/h5copy_misc1.out @@ -0,0 +1,5 @@ +############################# + output for 'h5copy -i ../../../hdf5/tools/h5copy/testfiles/h5copytst.h5 -o ./testfiles/h5copytst.out.h5 -v -s /simple -d /g1/g2/simple' +############################# +Copying file <../../../hdf5/tools/h5copy/testfiles/h5copytst.h5> and object to file <./testfiles/h5copytst.out.h5> and object +Error in copy...Exiting diff --git a/tools/h5copy/testh5copy.sh b/tools/h5copy/testh5copy.sh index a54816e..350785d 100644 --- a/tools/h5copy/testh5copy.sh +++ b/tools/h5copy/testh5copy.sh @@ -91,6 +91,15 @@ VERIFY_H5LS() echo "Verifying h5ls file structure $* $SPACES" | cut -c1-70 | tr -d '\012' } +# Print a line-line message left justified in a field of 70 characters +# beginning with the word "Verifying". +# +VERIFY_OUTPUT() +{ + SPACES=" " + echo "Verifying output files $* $SPACES" | cut -c1-70 | tr -d '\012' +} + # Run a test and print PASS or *FAIL*. If h5copy can complete # with exit status 0, consider it pass. If a test fails then increment # the `nerrors' global variable. @@ -143,44 +152,70 @@ TOOLTEST() } +# Compare the two text files +# PASS if same +# FAIL if different, and show the diff +# +# Assumed arguments: +# $1 is text file1 (expected output) +# $2 is text file2 (actual output) +CMP_OUTPUT() +{ + expectout=$1 + actualout=$2 + + VERIFY_OUTPUT $@ + if [ ! -f $expectout ]; then + # Create the expect file if it doesn't yet exist. + echo " CREATED" + cp $actualout $expectout + elif $CMP $expectout $actualout; then + echo " PASSED" + else + echo "*FAILED*" + echo " Expected output differs from actual output" + nerrors="`expr $nerrors + 1`" + test yes = "$verbose" && $DIFF $expectout $actualout |sed 's/^/ /' + fi +} + TOOLTEST_FAIL() { - runh5diff=yes - if [ "$1" = -i ]; then + expectout="$INDIR/$1" + actualout="$OUTDIR/$1.actual" + shift + if [ "$1" = -i ]; then inputfile=$2 - else - runh5diff=no - fi - if [ "$3" = -o ]; then + fi + if [ "$3" = -o ]; then outputfile=$4 - else - runh5diff=no - fi - + fi + TESTING $H5COPY $@ ( echo "#############################" echo " output for '$H5COPY $@'" echo "#############################" $RUNSERIAL $H5COPY_BIN $@ - ) > output.out + ) > $actualout 2> /dev/null RET=$? if [ $RET != 0 ]; then + echo " PASSED" + # Verifying output text from h5copy + if [ "$expectout" != "SKIP" ]; then + CMP_OUTPUT $expectout $actualout + fi + else echo "*FAILED*" echo "failed result is:" - cat output.out + cat $actualout nerrors="`expr $nerrors + 1`" - else - echo " PASSED" - - # Clean up output file - if test -z "$HDF5_NOCLEANUP"; then - rm -f output.out - fi fi - if [ $runh5diff != no ]; then - H5DIFFTEST_FAIL $inputfile $outputfile $7 $9 + + # Clean up output file + if test -z "$HDF5_NOCLEANUP"; then + rm -f $actualout fi } @@ -389,6 +424,28 @@ COPY_EXT_LINKS() fi } +# Test misc. +# +# Assumed arguments: +# +TEST_MISC() +{ + TESTFILE="$INDIR/$HDF_FILE1" + FILEOUT="$OUTDIR/`basename $HDF_FILE1 .h5`.out.h5" + + # Remove any output file left over from previous test run + rm -f $FILEOUT + + echo "Test copying object into group which doesn't exist, without -p" + TOOLTEST_FAIL h5copy_misc1.out -i $TESTFILE -o $FILEOUT -v -s /simple -d /g1/g2/simple + + # Remove output file created, if the "no cleanup" environment variable is + # not defined + if test -z "$HDF5_NOCLEANUP"; then + rm -f $FILEOUT + fi +} + ############################################################################## ### T H E T E S T S ### ############################################################################## @@ -396,6 +453,7 @@ COPY_EXT_LINKS() COPY_OBJECTS COPY_REFERENCES COPY_EXT_LINKS +TEST_MISC if test $nerrors -eq 0 ; then -- cgit v0.12