summaryrefslogtreecommitdiffstats
path: root/tools/h5diff
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2010-09-17 12:45:55 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2010-09-17 12:45:55 (GMT)
commit6747ebd9858374ae912b6182024861b1710518c8 (patch)
tree9bd75142d9dd292fe4272118f650f1c91205a988 /tools/h5diff
parent9de3a84f916168831f29a4259fe93cb4823d8f57 (diff)
downloadhdf5-6747ebd9858374ae912b6182024861b1710518c8.zip
hdf5-6747ebd9858374ae912b6182024861b1710518c8.tar.gz
hdf5-6747ebd9858374ae912b6182024861b1710518c8.tar.bz2
[svn-r19413] Description:
Bring r19349:19411 from trunk to revise_chunks branch. Tested on: FreeBSD/32 6.3 (duty) in debug mode FreeBSD/64 6.3 (liberty) w/C++ & FORTRAN, in debug mode Linux/32 2.6 (jam) w/PGI compilers, w/default API=1.8.x, w/C++ & FORTRAN, w/threadsafe, in debug mode Linux/64-amd64 2.6 (amani) w/Intel compilers, w/default API=1.6.x, w/C++ & FORTRAN, in production mode Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN, w/szip filter, w/threadsafe, in production mode Linux/PPC 2.6 (heiwa) w/C++ & FORTRAN, w/threadsafe, in debug mode Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN, in production mode Linux/64-amd64 2.6 (abe) w/parallel, w/FORTRAN, in debug mode Mac OS X/32 10.6.4 (amazon) in debug mode Mac OS X/32 10.6.4 (amazon) w/C++ & FORTRAN, w/threadsafe, in production mode Mac OS X/32 10.6.4 (amazon) w/parallel, in debug mode
Diffstat (limited to 'tools/h5diff')
-rw-r--r--tools/h5diff/CMakeLists.txt134
-rw-r--r--tools/h5diff/Makefile.in2
-rw-r--r--tools/h5diff/h5diff_common.c69
-rw-r--r--tools/h5diff/h5diffgentest.c1090
-rw-r--r--tools/h5diff/ph5diff_main.c6
-rw-r--r--tools/h5diff/testfiles/h5diff_10.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_23.txt5
-rw-r--r--tools/h5diff/testfiles/h5diff_26.txt9
-rw-r--r--tools/h5diff/testfiles/h5diff_400.txt17
-rw-r--r--tools/h5diff/testfiles/h5diff_404.txt10
-rw-r--r--tools/h5diff/testfiles/h5diff_410.txt24
-rw-r--r--tools/h5diff/testfiles/h5diff_414.txt8
-rw-r--r--tools/h5diff/testfiles/h5diff_415.txt8
-rw-r--r--tools/h5diff/testfiles/h5diff_416.txt9
-rw-r--r--tools/h5diff/testfiles/h5diff_453.txt17
-rw-r--r--tools/h5diff/testfiles/h5diff_456.txt10
-rw-r--r--tools/h5diff/testfiles/h5diff_480.txt17
-rw-r--r--tools/h5diff/testfiles/h5diff_481.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_482.txt17
-rw-r--r--tools/h5diff/testfiles/h5diff_483.txt18
-rw-r--r--tools/h5diff/testfiles/h5diff_500.txt72
-rw-r--r--tools/h5diff/testfiles/h5diff_501.txt188
-rw-r--r--tools/h5diff/testfiles/h5diff_502.txt36
-rw-r--r--tools/h5diff/testfiles/h5diff_503.txt32
-rw-r--r--tools/h5diff/testfiles/h5diff_504.txt19
-rw-r--r--tools/h5diff/testfiles/h5diff_505.txt6
-rw-r--r--tools/h5diff/testfiles/h5diff_506.txt26
-rw-r--r--tools/h5diff/testfiles/h5diff_507.txt6
-rw-r--r--tools/h5diff/testfiles/h5diff_508.txt32
-rw-r--r--tools/h5diff/testfiles/h5diff_509.txt6
-rw-r--r--tools/h5diff/testfiles/h5diff_510.txt32
-rw-r--r--tools/h5diff/testfiles/h5diff_511.txt24
-rw-r--r--tools/h5diff/testfiles/h5diff_512.txt53
-rw-r--r--tools/h5diff/testfiles/h5diff_513.txt3
-rw-r--r--tools/h5diff/testfiles/h5diff_514.txt53
-rw-r--r--tools/h5diff/testfiles/h5diff_515.txt24
-rw-r--r--tools/h5diff/testfiles/h5diff_516.txt32
-rw-r--r--tools/h5diff/testfiles/h5diff_517.txt15
-rw-r--r--tools/h5diff/testfiles/h5diff_518.txt23
-rw-r--r--tools/h5diff/testfiles/h5diff_600.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_601.txt2
-rw-r--r--tools/h5diff/testfiles/h5diff_603.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_606.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_612.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_615.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_621.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_622.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_623.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_624.txt30
-rw-r--r--tools/h5diff/testfiles/h5diff_exclude1-1.h5bin0 -> 5064 bytes
-rw-r--r--tools/h5diff/testfiles/h5diff_exclude1-2.h5bin0 -> 5064 bytes
-rw-r--r--tools/h5diff/testfiles/h5diff_exclude2-1.h5bin0 -> 5064 bytes
-rw-r--r--tools/h5diff/testfiles/h5diff_exclude2-2.h5bin0 -> 6056 bytes
-rw-r--r--tools/h5diff/testfiles/h5diff_grp_recurse1.h5bin0 -> 11826 bytes
-rw-r--r--tools/h5diff/testfiles/h5diff_grp_recurse2.h5bin0 -> 11826 bytes
-rw-r--r--tools/h5diff/testfiles/h5diff_grp_recurse_ext1.h5bin0 -> 8120 bytes
-rw-r--r--tools/h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5bin0 -> 4296 bytes
-rw-r--r--tools/h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5bin0 -> 5640 bytes
-rw-r--r--tools/h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5bin0 -> 2464 bytes
-rwxr-xr-xtools/h5diff/testh5diff.sh87
60 files changed, 2366 insertions, 205 deletions
diff --git a/tools/h5diff/CMakeLists.txt b/tools/h5diff/CMakeLists.txt
index 1342cd2..924c4ec 100644
--- a/tools/h5diff/CMakeLists.txt
+++ b/tools/h5diff/CMakeLists.txt
@@ -15,16 +15,7 @@ ADD_EXECUTABLE (h5diff
${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/h5diff_main.c
)
H5_NAMING (h5diff)
-IF (WIN32)
- IF (MSVC)
- IF (NOT BUILD_SHARED_LIBS)
- SET_TARGET_PROPERTIES (h5diff
- PROPERTIES
- LINK_FLAGS "/NODEFAULTLIB:MSVCRT"
- )
- ENDIF (NOT BUILD_SHARED_LIBS)
- ENDIF (MSVC)
-ENDIF (WIN32)
+TARGET_WIN_PROPERTIES (h5diff)
TARGET_LINK_LIBRARIES (h5diff ${HDF5_TOOLS_LIB_TARGET} ${HDF5_LIB_TARGET})
SET (H5_DEP_EXECUTABLES h5diff)
@@ -42,14 +33,7 @@ IF (BUILD_TESTING)
IF (HDF5_BUILD_GENERATORS AND NOT BUILD_SHARED_LIBS)
ADD_EXECUTABLE (h5diffgentest ${HDF5_TOOLS_H5DIFF_SOURCE_DIR}/h5diffgentest.c)
H5_NAMING (h5diffgentest)
- IF (WIN32)
- IF (MSVC)
- SET_TARGET_PROPERTIES (h5diffgentest
- PROPERTIES
- LINK_FLAGS "/NODEFAULTLIB:MSVCRT"
- )
- ENDIF (MSVC)
- ENDIF (WIN32)
+ TARGET_WIN_PROPERTIES (h5diffgentest)
TARGET_LINK_LIBRARIES (h5diffgentest ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET})
#ADD_TEST (NAME h5diffgentest COMMAND $<TARGET_FILE:h5diffgentest>)
@@ -130,6 +114,10 @@ IF (BUILD_TESTING)
h5diff_457.txt
h5diff_458.txt
h5diff_459.txt
+ h5diff_480.txt
+ h5diff_481.txt
+ h5diff_482.txt
+ h5diff_483.txt
h5diff_50.txt
h5diff_51.txt
h5diff_52.txt
@@ -139,7 +127,21 @@ IF (BUILD_TESTING)
h5diff_56.txt
h5diff_57.txt
h5diff_58.txt
+ h5diff_500.txt
+ h5diff_501.txt
+ h5diff_503.txt
+ h5diff_504.txt
+ h5diff_505.txt
+ h5diff_506.txt
+ h5diff_507.txt
+ h5diff_508.txt
+ h5diff_509.txt
+ h5diff_510.txt
+ h5diff_512.txt
+ h5diff_513.txt
+ h5diff_514.txt
h5diff_600.txt
+ h5diff_601.txt
h5diff_603.txt
h5diff_604.txt
h5diff_605.txt
@@ -190,6 +192,16 @@ IF (BUILD_TESTING)
h5diff_ext2softlink_trg.h5
h5diff_danglelinks1.h5
h5diff_danglelinks2.h5
+ h5diff_grp_recurse1.h5
+ h5diff_grp_recurse2.h5
+ h5diff_grp_recurse_ext1.h5
+ h5diff_grp_recurse_ext2-1.h5
+ h5diff_grp_recurse_ext2-2.h5
+ h5diff_grp_recurse_ext2-3.h5
+ h5diff_exclude1-1.h5
+ h5diff_exclude1-2.h5
+ h5diff_exclude2-1.h5
+ h5diff_exclude2-2.h5
)
FOREACH (txt_file ${HDF5_REFERENCE_FILES})
@@ -294,6 +306,20 @@ SET (FILE17 h5diff_ext2softlink_src.h5)
SET (FILE18 h5diff_ext2softlink_trg.h5)
SET (DANGLE_LINK_FILE1 h5diff_danglelinks1.h5)
SET (DANGLE_LINK_FILE2 h5diff_danglelinks2.h5)
+SET (GRP_RECURSE_FILE1 h5diff_grp_recurse1.h5)
+SET (GRP_RECURSE_FILE2 h5diff_grp_recurse2.h5)
+# group recursive - same structure via external links through files
+SET (GRP_RECURSE1_EXT h5diff_grp_recurse_ext1.h5)
+SET (GRP_RECURSE2_EXT1 h5diff_grp_recurse_ext2-1.h5)
+SET (GRP_RECURSE2_EXT2 h5diff_grp_recurse_ext2-2.h5)
+SET (GRP_RECURSE2_EXT3 h5diff_grp_recurse_ext2-3.h5)
+# same structure, same obj name with different value
+SET (EXCLUDE_FILE1_1 h5diff_exclude1-1.h5)
+SET (EXCLUDE_FILE1_2 h5diff_exclude1-2.h5)
+# different structure and obj names
+SET (EXCLUDE_FILE2_1 h5diff_exclude2-1.h5)
+SET (EXCLUDE_FILE2_2 h5diff_exclude2-2.h5)
+
# ############################################################################
# # Common usage
@@ -418,6 +444,9 @@ ADD_H5_TEST (h5diff_58 1 -v ${FILE7} ${FILE8} refreg)
# 6.0: Check if the command line number of arguments is less than 3
ADD_H5_TEST (h5diff_600 1 ${FILE1})
+# 6.1: Check if non-exist object name is specified
+ADD_H5_TEST (h5diff_601 2 ${FILE1} ${FILE1} nono_obj)
+
# ##############################################################################
# # -d
@@ -675,6 +704,75 @@ ADD_H5_TEST (h5diff_458 2 --follow-symlinks -v --no-dangling-links ${FILE15} $
# dangling link found for ext links (obj to obj). Both dangle links
ADD_H5_TEST (h5diff_459 2 --follow-symlinks -v --no-dangling-links ${FILE15} ${FILE15} /ext_link_noexist1 /ext_link_noexist2)
+
+# ##############################################################################
+# # test for group diff recursivly
+# ##############################################################################
+# root
+ADD_H5_TEST (h5diff_500 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} / /)
+ADD_H5_TEST (h5diff_501 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} / /)
+
+# root vs group
+ADD_H5_TEST (h5diff_502 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} / /grp1/grp2/grp3)
+
+# group vs group (same name and structure)
+ADD_H5_TEST (h5diff_503 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /grp1)
+
+# group vs group (different name and structure)
+ADD_H5_TEST (h5diff_504 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1/grp2 /grp1/grp2/grp3)
+
+# groups vs soft-link
+ADD_H5_TEST (h5diff_505 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /slink_grp1)
+ADD_H5_TEST (h5diff_506 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1/grp2 /slink_grp2)
+
+# groups vs ext-link
+ADD_H5_TEST (h5diff_507 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /elink_grp1)
+ADD_H5_TEST (h5diff_508 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp1 /elink_grp1)
+
+# soft-link vs ext-link
+ADD_H5_TEST (h5diff_509 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp1 /elink_grp1)
+ADD_H5_TEST (h5diff_510 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp1 /elink_grp1)
+
+# circled ext links
+ADD_H5_TEST (h5diff_511 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp10 /grp11)
+ADD_H5_TEST (h5diff_512 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /grp10 /grp11)
+
+# circled soft2ext-link vs soft2ext-link
+ADD_H5_TEST (h5diff_513 -v ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp10 /slink_grp11)
+ADD_H5_TEST (h5diff_514 -v --follow-symlinks ${GRP_RECURSE_FILE1} ${GRP_RECURSE_FILE2} /slink_grp10 /slink_grp11)
+
+###############################################################################
+# Test for group recursive diff via multi-linked external links
+# With follow-symlinks, file $GRP_RECURSE1_EXT and $GRP_RECURSE2_EXT1 should
+# be same with the external links.
+###############################################################################
+# file vs file
+ADD_H5_TEST (h5diff_515 -v ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1})
+ADD_H5_TEST (h5diff_516 -v --follow-symlinks ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1})
+# group vs group
+ADD_H5_TEST (h5diff_517 -v ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1} /g1)
+ADD_H5_TEST (h5diff_518 -v --follow-symlinks ${GRP_RECURSE1_EXT} ${GRP_RECURSE2_EXT1} /g1)
+
+
+# ##############################################################################
+# # Exclude path (--exclude-path)
+# ##############################################################################
+#
+# Same structure, same names and different value.
+#
+# Exclude the object with different value. Expect return - same
+ADD_H5_TEST (h5diff_480 0 -v --exclude-path /group1/dset3 ${EXCLUDE_FILE1_1} ${EXCLUDE_FILE1_2})
+# Verify different by not excluding. Expect return - diff
+ADD_H5_TEST (h5diff_481 1 -v ${EXCLUDE_FILE1_1} ${EXCLUDE_FILE1_2})
+
+#
+# Different structure, different names.
+#
+# Exclude all the different objects. Expect return - same
+ADD_H5_TEST (h5diff_482 0 -v --exclude-path "/group1" --exclude-path "/dset1" ${EXCLUDE_FILE2_1} ${EXCLUDE_FILE2_2})
+# Exclude only some different objects. Expect return - diff
+ADD_H5_TEST (h5diff_483 1 -v --exclude-path "/group1" ${EXCLUDE_FILE2_1} ${EXCLUDE_FILE2_2})
+
ENDIF (BUILD_TESTING)
diff --git a/tools/h5diff/Makefile.in b/tools/h5diff/Makefile.in
index 872e70e..ce3acd9 100644
--- a/tools/h5diff/Makefile.in
+++ b/tools/h5diff/Makefile.in
@@ -308,7 +308,6 @@ libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
-lt_ECHO = @lt_ECHO@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
@@ -357,6 +356,7 @@ H5CC_PP = $(bindir)/h5pcc
H5FC = $(bindir)/h5fc
H5FC_PP = $(bindir)/h5pfc
H5CPP = $(bindir)/h5c++
+ACLOCAL_AMFLAGS = "-I m4"
# The trace script; this is used on source files from the C library to
# insert tracing macros.
diff --git a/tools/h5diff/h5diff_common.c b/tools/h5diff/h5diff_common.c
index 9b6037e..a678b2f 100644
--- a/tools/h5diff/h5diff_common.c
+++ b/tools/h5diff/h5diff_common.c
@@ -42,6 +42,7 @@ static struct long_options l_opts[] = {
{ "use-system-epsilon", no_arg, 'e' },
{ "follow-symlinks", no_arg, 'l' },
{ "no-dangling-links", no_arg, 'x' },
+ { "exclude-path", require_arg, 'E' },
{ NULL, 0, '\0' }
};
@@ -64,6 +65,7 @@ void parse_command_line(int argc,
{
int opt;
+ struct exclude_path_list *exclude_head, *exclude_prev, *exclude_node;
/* process the command-line */
memset(options, 0, sizeof (diff_opt_t));
@@ -74,6 +76,9 @@ void parse_command_line(int argc,
/* NaNs are handled by default */
options->do_nans = 1;
+ /* init for exclude-path option */
+ exclude_head = NULL;
+
/* parse command line options */
while ((opt = get_option(argc, argv, s_opts, l_opts)) != EOF)
{
@@ -104,6 +109,35 @@ void parse_command_line(int argc,
case 'x':
options->no_dangle_links = 1;
break;
+ case 'E':
+ options->exclude_path = 1;
+
+ /* create linked list of excluding objects */
+ if( (exclude_node = (struct exclude_path_list*) malloc(sizeof(struct exclude_path_list))) == NULL)
+ {
+ printf("Error: lack of memory!\n");
+ h5diff_exit(EXIT_FAILURE);
+ }
+
+ /* init */
+ exclude_node->obj_path = opt_arg;
+ exclude_node->obj_type = H5TRAV_TYPE_UNKNOWN;
+ exclude_prev = exclude_head;
+
+ if (NULL == exclude_head)
+ {
+ exclude_head = exclude_node;
+ exclude_head->next = NULL;
+ }
+ else
+ {
+ while(NULL != exclude_prev->next)
+ exclude_prev=exclude_prev->next;
+
+ exclude_node->next = NULL;
+ exclude_prev->next = exclude_node;
+ }
+ break;
case 'd':
options->d=1;
@@ -163,6 +197,10 @@ void parse_command_line(int argc,
}
}
+ /* if exclude-path option is used, keep the exclude path list */
+ if (options->exclude_path)
+ options->exclude = exclude_head;
+
/* if use system epsilon, unset -p and -d option */
if (options->use_system_epsilon)
options->d = options->p = 0;
@@ -351,7 +389,7 @@ check_d_input( const char *str )
void usage(void)
{
- printf("usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]] \n");
+ printf("usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]] \n");
printf(" file1 File name of the first HDF5 file\n");
printf(" file2 File name of the second HDF5 file\n");
printf(" [obj1] Name of an HDF5 object, in absolute path\n");
@@ -425,18 +463,29 @@ void usage(void)
printf("\n");
- printf(" Compare criteria\n");
- printf(" If no objects [obj1[obj2]] are specified, h5diff only compares objects\n");
- printf(" with the same absolute path in both files\n");
+ printf(" File comparison:\n");
+ printf(" If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as\n");
+ printf(" a comparison of the two files' root groups. That is, h5diff first compares\n");
+ printf(" the names of root group members, generates a report of root group objects\n");
+ printf(" that appear in only one file or in both files, and recursively compares\n");
+ printf(" common objects.\n");
printf("\n");
- printf(" The compare criteria is:\n");
- printf(" 1) datasets: numerical array differences\n");
- printf(" 2) groups: name string difference\n");
- printf(" 3) datatypes: the return value of H5Tequal\n");
- printf(" 4) links: name string difference of the linked value as default\n");
- printf(" (refer to --follow-symlinks option).\n");
+ printf(" Object comparison:\n");
+ printf(" 1) Groups \n");
+ printf(" First compares the names of member objects (relative path, from the\n");
+ printf(" specified group) and generates a report of objects that appear in only\n");
+ printf(" one group or in both groups. Common objects are then compared recursively.\n");
+ printf(" 2) Datasets \n");
+ printf(" Array rank and dimensions, datatypes, and data values are compared.\n");
+ printf(" 3) Datatypes \n");
+ printf(" The comparison is based on the return value of H5Tequal.\n");
+ printf(" 4) Symbolic links \n");
+ printf(" The paths to the target objects are compared.\n");
+ printf(" (The option --follow-symlinks overrides the default behavior when\n");
+ printf(" symbolic links are compared.).\n");
printf("\n");
+
printf(" Exit code:\n");
printf(" 0 if no differences, 1 if differences found, 2 if error\n");
printf("\n");
diff --git a/tools/h5diff/h5diffgentest.c b/tools/h5diff/h5diffgentest.c
index 6e9b092..2ba0c7f 100644
--- a/tools/h5diff/h5diffgentest.c
+++ b/tools/h5diff/h5diffgentest.c
@@ -57,6 +57,19 @@
#define FILE20 "h5diff_dset_idx2.h5"
#define DANGLE_LINK_FILE1 "h5diff_danglelinks1.h5"
#define DANGLE_LINK_FILE2 "h5diff_danglelinks2.h5"
+#define GRP_RECURSE_FILE1 "h5diff_grp_recurse1.h5"
+#define GRP_RECURSE_FILE2 "h5diff_grp_recurse2.h5"
+/* same structure via external links through files */
+#define GRP_RECURSE1_EXT "h5diff_grp_recurse_ext1.h5"
+#define GRP_RECURSE2_EXT1 "h5diff_grp_recurse_ext2-1.h5"
+#define GRP_RECURSE2_EXT2 "h5diff_grp_recurse_ext2-2.h5"
+#define GRP_RECURSE2_EXT3 "h5diff_grp_recurse_ext2-3.h5"
+/* same structure, same obj name with different value */
+#define EXCLUDE_FILE1_1 "h5diff_exclude1-1.h5"
+#define EXCLUDE_FILE1_2 "h5diff_exclude1-2.h5"
+/* different structure and obj names */
+#define EXCLUDE_FILE2_1 "h5diff_exclude2-1.h5"
+#define EXCLUDE_FILE2_2 "h5diff_exclude2-2.h5"
#define UIMAX 4294967295u /*Maximum value for a variable of type unsigned int */
#define STR_SIZE 3
@@ -101,6 +114,10 @@ static int test_linked_softlinks(const char *fname1);
static int test_external_links(const char *fname1, const char *fname2);
static int test_ext2soft_links(const char *fname1, const char *fname2);
static int test_dangle_links(const char *fname1, const char *fname2);
+static int test_group_recurse(const char *fname1, const char *fname2);
+static int test_group_recurse2();
+static int test_exclude_obj1(const char *fname1, const char *fname2);
+static int test_exclude_obj2(const char *fname1, const char *fname2);
/* called by test_attributes() and test_datasets() */
static void write_attr_in(hid_t loc_id,const char* dset_name,hid_t fid,int make_diffs);
@@ -160,6 +177,12 @@ int main(void)
test_dangle_links(DANGLE_LINK_FILE1, DANGLE_LINK_FILE2);
+ test_group_recurse(GRP_RECURSE_FILE1, GRP_RECURSE_FILE2);
+ test_group_recurse2();
+
+ test_exclude_obj1(EXCLUDE_FILE1_1, EXCLUDE_FILE1_2);
+ test_exclude_obj2(EXCLUDE_FILE2_1, EXCLUDE_FILE2_2);
+
return 0;
}
@@ -1930,6 +1953,1073 @@ out:
}
/*-------------------------------------------------------------------------
+*
+* Purpose: For testing comparing group member objects recursively
+*
+* Programmer: Jonathan Kim (Aug 19, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_group_recurse(const char *fname1, const char *fname2)
+{
+ hid_t fid1=0;
+ hid_t fid2=0;
+ hid_t gid1_f1=0, gid2_f1=0, gid3_f1=0, gid10_f1=0;
+ hid_t gid1_f2=0, gid2_f2=0, gid3_f2=0, gid11_f2=0;
+ hsize_t dims2[2] = {2,4};
+ int data1[4][2] = {{0,1},{0,1},{1,0},{1,0}};
+ int data2[4][2] = {{0,2},{0,2},{2,0},{2,0}};
+ int data3[4][2] = {{0,3},{0,3},{3,0},{3,0}};
+ herr_t status = SUCCEED;
+
+ /*-----------------------------------------------------------------------
+ * Create file(s)
+ *------------------------------------------------------------------------*/
+ fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ if (fid1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ if (fid2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ /*-----------------------------------------------------------------------
+ * Groups
+ *------------------------------------------------------------------------*/
+ /* file1 */
+ gid1_f1 = H5Gcreate2(fid1, "/grp1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (gid1_f1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ gid2_f1 = H5Gcreate2(fid1, "/grp1/grp2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (gid2_f1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ gid3_f1 = H5Gcreate2(fid1, "/grp1/grp2/grp3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (gid3_f1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ gid10_f1 = H5Gcreate2(fid1, "/grp10", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (gid10_f1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ /* file2 */
+ gid1_f2 = H5Gcreate2(fid2, "/grp1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (gid1_f2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ gid2_f2 = H5Gcreate2(fid2, "/grp1/grp2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (gid2_f2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ gid3_f2 = H5Gcreate2(fid2, "/grp1/grp2/grp3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (gid3_f2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ gid11_f2 = H5Gcreate2(fid2, "/grp11", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (gid11_f2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ /*-----------------------------------------------------------------------
+ * Datasets under root
+ *------------------------------------------------------------------------*/
+ /* file1 */
+ status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(fid1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(fid1,2,dims2,"dset3",H5T_NATIVE_INT,data3);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ /* file2 */
+ status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(fid2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(fid2,2,dims2,"dset3",H5T_NATIVE_INT,data3);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ /*-----------------------------------------------------------------------
+ * Datasets under group
+ *------------------------------------------------------------------------*/
+ /* file1 */
+ status = write_dset(gid1_f1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid2_f1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+ status = write_dset(gid2_f1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid3_f1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+ status = write_dset(gid3_f1,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid3_f1,2,dims2,"dset3",H5T_NATIVE_INT,data3);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid10_f1,2,dims2,"dset4",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid10_f1,2,dims2,"dset5",H5T_NATIVE_INT,data3);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ /* file2 */
+ status = write_dset(gid1_f2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid2_f2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+ status = write_dset(gid2_f2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid3_f2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+ status = write_dset(gid3_f2,2,dims2,"dset2",H5T_NATIVE_INT,data2);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid3_f2,2,dims2,"dset3",H5T_NATIVE_INT,data3);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid11_f2,2,dims2,"dset4",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid11_f2,2,dims2,"dset5",H5T_NATIVE_INT,data2);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+
+ /*-----------------------------------------------------------------------
+ * Soft Links
+ *------------------------------------------------------------------------*/
+ /* file 1 */
+ status = H5Lcreate_soft("/grp1", fid1, "slink_grp1", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = H5Lcreate_soft("/grp1/grp2", fid1, "slink_grp2", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = H5Lcreate_soft("/grp1/grp2/grp3", fid1, "slink_grp3", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = H5Lcreate_soft("/grp10", fid1, "slink_grp10", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ /* file 2 */
+ status = H5Lcreate_soft("/grp1", fid2, "slink_grp1", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = H5Lcreate_soft("/grp1/grp2", fid2, "slink_grp2", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = H5Lcreate_soft("/grp1/grp2/grp3", fid2, "slink_grp3", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = H5Lcreate_soft("/grp11", fid2, "slink_grp11", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ /*-----------------------------------------------------------------------
+ * External Links
+ *------------------------------------------------------------------------*/
+ /* file1 */
+ status = H5Lcreate_external(fname2, "/grp1", fid1, "elink_grp1", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = H5Lcreate_external(fname2, "/grp1/grp2", fid1, "elink_grp2", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = H5Lcreate_external(fname2, "/grp1/grp2/grp3", fid1, "elink_grp3", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ /* file2 */
+ status = H5Lcreate_external(fname1, "/grp1", fid2, "elink_grp1", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = H5Lcreate_external(fname1, "/grp1/grp2", fid2, "elink_grp2", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = H5Lcreate_external(fname1, "/grp1/grp2/grp3", fid2, "elink_grp3", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ /*------------------------------
+ * external circle route test
+ * file1/grp11 <-> file2/grp10 via elink_grp_circle link
+ */
+ /* file1 */
+ status = H5Lcreate_external(fname2, "/grp11", gid10_f1, "elink_grp_circle", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+ /* file2 */
+ status = H5Lcreate_external(fname1, "/grp10", gid11_f2, "elink_grp_circle", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+
+out:
+ /*-----------------------------------------------------------------------
+ * Close
+ *-----------------------------------------------------------------------*/
+ if(fid1)
+ H5Fclose(fid1);
+ if(fid2)
+ H5Fclose(fid2);
+ if(gid1_f1)
+ H5Gclose(gid1_f1);
+ if(gid2_f1)
+ H5Gclose(gid2_f1);
+ if(gid3_f1)
+ H5Gclose(gid3_f1);
+ if(gid1_f2)
+ H5Gclose(gid1_f2);
+ if(gid2_f2)
+ H5Gclose(gid2_f2);
+ if(gid3_f2)
+ H5Gclose(gid3_f2);
+
+ return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose:
+* For testing comparing group member objects recursively via multiple
+* linked external links
+*
+* Programmer: Jonathan Kim (Sep 16, 2010)
+*
+*-------------------------------------------------------------------------*/
+#define GRP_R_DSETNAME1 "dset1"
+#define GRP_R_DSETNAME2 "dset2"
+static int test_group_recurse2()
+{
+ hid_t fileid1;
+ hid_t grp1=0, grp2;
+ hid_t grp3=0;
+ hid_t grp4=0;
+ hid_t tid;
+ hid_t dset1, dset2;
+ hid_t datatype, dataspace; /* handles */
+ hid_t fileid2;
+ hid_t fileid3;
+ hid_t fileid4;
+ hid_t fileid4_1;
+ hsize_t dimsf[2]; /* dataset dimensions */
+ herr_t status=0;
+ int data1[4][2] = {{0,0},{1,1},{2,2},{3,3}};
+ int data2[4][2] = {{0,0},{0,1},{0,2},{3,3}};
+ int i, j;
+
+ /*-----------------------------------------------------------------------
+ * FILE 1
+ *------------------------------------------------------------------------*/
+ /*
+ * Create a new file using H5F_ACC_TRUNC access,
+ * default file creation properties, and default file
+ * access properties.
+ */
+ fileid1 = H5Fcreate(GRP_RECURSE1_EXT, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ /*-----------------------------------------------------------------------
+ * Groups
+ *------------------------------------------------------------------------*/
+ grp1 = H5Gcreate2(fileid1, "/g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (grp1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
+ status = FAIL;
+ goto out;
+ }
+
+ grp2 = H5Gcreate2(grp1, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (grp2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
+ status = FAIL;
+ goto out;
+ }
+
+ grp3 = H5Gcreate2(grp2, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (grp3 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
+ status = FAIL;
+ goto out;
+ }
+
+ grp4 = H5Gcreate2(grp3, "g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (grp4 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
+ status = FAIL;
+ goto out;
+ }
+
+
+ /*-----------------------------------------------------------------------
+ * Datasets
+ *------------------------------------------------------------------------*/
+ /*
+ * Describe the size of the array and create the data space for fixed
+ * size dataset.
+ */
+ dimsf[0] = 4;
+ dimsf[1] = 2;
+ dataspace = H5Screate_simple(2, dimsf, NULL);
+
+ /*
+ * Define datatype for the data in the file.
+ * We will store little endian INT numbers.
+ */
+ datatype = H5Tcopy(H5T_NATIVE_INT);
+ status = H5Tset_order(datatype, H5T_ORDER_LE);
+
+ /*---------------
+ * dset1
+ */
+ /*
+ * Create a new dataset within the file using defined dataspace and
+ * datatype and default dataset creation properties.
+ */
+ dset1 = H5Dcreate2(fileid1, GRP_R_DSETNAME1, datatype, dataspace,
+ H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ /*
+ * Write the data to the dataset using default transfer properties.
+ */
+ status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
+ H5Dclose(dset1);
+
+ /*---------------
+ * dset1
+ */
+ /*
+ * Create a new dataset within the file using defined dataspace and
+ * datatype and default dataset creation properties.
+ */
+ dset1 = H5Dcreate2(grp3, GRP_R_DSETNAME1, datatype, dataspace,
+ H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ /*
+ * Write the data to the dataset using default transfer properties.
+ */
+ status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
+
+ /*---------------
+ * dset2
+ */
+ /*
+ * Create a new dataset within the fileid1 using defined dataspace and
+ * datatype and default dataset creation properties.
+ */
+ dset2 = H5Dcreate2(grp4, GRP_R_DSETNAME2, datatype, dataspace,
+ H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ /*
+ * Write the data to the dataset using default transfer properties.
+ */
+ status = H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
+
+ /*-----------------------------------------------------------------------
+ * Soft links
+ *------------------------------------------------------------------------*/
+ /*
+ * under '/' root
+ */
+ /* link to dset1 */
+ status = H5Lcreate_soft(GRP_R_DSETNAME1, fileid1, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", GRP_RECURSE1_EXT);
+ status = FAIL;
+ goto out;
+ }
+
+ H5Dclose(dset1);
+ H5Dclose(dset2);
+ H5Gclose(grp1);
+ H5Gclose(grp2);
+ H5Gclose(grp3);
+ H5Gclose(grp4);
+
+ /*-----------------------------------------------------------------------
+ * FILE 2-3
+ *------------------------------------------------------------------------*/
+
+ /* crate target file */
+ fileid4 = H5Fcreate(GRP_RECURSE2_EXT3, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ /*-----------------------------------------------
+ * Groups
+ */
+ grp4 = H5Gcreate2(fileid4, "/g4", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (grp4 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE2_EXT3);
+ status = FAIL;
+ goto out;
+ }
+
+ /*---------------
+ * dset2
+ */
+ /*
+ * Create a new dataset within the fileid1 using defined dataspace and
+ * datatype and default dataset creation properties.
+ */
+ dset2 = H5Dcreate2(grp4, GRP_R_DSETNAME2, datatype, dataspace,
+ H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ /*
+ * Write the data to the dataset using default transfer properties.
+ */
+ status = H5Dwrite(dset2, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data2);
+
+ H5Gclose(grp4);
+ H5Dclose(dset2);
+
+
+ /*-----------------------------------------------------------------------
+ * FILE 2-2
+ *------------------------------------------------------------------------*/
+
+ /* crate target file */
+ fileid3 = H5Fcreate(GRP_RECURSE2_EXT2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ /*-----------------------------------------------
+ * Groups
+ */
+ grp2 = H5Gcreate2(fileid3, "g2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (grp2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE2_EXT2);
+ status = FAIL;
+ goto out;
+ }
+
+ grp3 = H5Gcreate2(grp2, "g3", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (grp3 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE2_EXT2);
+ status = FAIL;
+ goto out;
+ }
+
+ /*---------------
+ * dset1
+ */
+ /*
+ * Create a new dataset within the fileid1 using defined dataspace and
+ * datatype and default dataset creation properties.
+ */
+ dset1 = H5Dcreate2(grp3, GRP_R_DSETNAME1, datatype, dataspace,
+ H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ /*
+ * Write the data to the dataset using default transfer properties.
+ */
+ status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
+
+ /*-----------------------------------------------
+ * extlink to $GRP_RECURSE2_EXT3/g4
+ */
+ status = H5Lcreate_external(GRP_RECURSE2_EXT3, "/g4", fileid3, "/g2/g3/g4", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", GRP_RECURSE2_EXT2);
+ status = FAIL;
+ goto out;
+ }
+
+ H5Dclose(dset1);
+ H5Gclose(grp2);
+ H5Gclose(grp3);
+
+ /*-----------------------------------------------------------------------
+ * FILE 2-1
+ *------------------------------------------------------------------------*/
+
+ /* crate target file */
+ fileid2 = H5Fcreate(GRP_RECURSE2_EXT1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ /*-----------------------------------------------
+ * Groups
+ */
+ grp1 = H5Gcreate2(fileid2, "g1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (grp1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", GRP_RECURSE1_EXT);
+ status = FAIL;
+ goto out;
+ }
+
+ /*---------------
+ * dset1
+ */
+ dset1 = H5Dcreate2(fileid2, GRP_R_DSETNAME1, datatype, dataspace,
+ H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ /*
+ * Write the data to the dataset using default transfer properties.
+ */
+ status = H5Dwrite(dset1, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data1);
+
+ /*-----------------------------------------------------------------------
+ * Soft links
+ *------------------------------------------------------------------------*/
+ /*
+ * under '/' root
+ */
+ /* link to dset1 */
+ status = H5Lcreate_soft(GRP_R_DSETNAME1, fileid2, "soft_dset1", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_soft failed.\n", GRP_RECURSE2_EXT1);
+ status = FAIL;
+ goto out;
+ }
+
+ /*-----------------------------------------------
+ * extlink to $GRP_RECURSE2_EXT2/g2
+ */
+ status = H5Lcreate_external(GRP_RECURSE2_EXT2, "/g2", fileid2, "/g1/g2", H5P_DEFAULT, H5P_DEFAULT);
+ if (status < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Lcreate_external failed.\n", GRP_RECURSE2_EXT1);
+ status = FAIL;
+ goto out;
+ }
+
+ H5Gclose(grp1);
+ H5Dclose(dset1);
+
+out:
+ /*
+ * Close/release resources.
+ */
+ H5Sclose(dataspace);
+ H5Tclose(datatype);
+ H5Fclose(fileid1);
+ H5Fclose(fileid2);
+ H5Fclose(fileid3);
+ H5Fclose(fileid4);
+
+ return status;
+}
+
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files for excluding obj.
+* Same structure, same obj names
+* Test : exclude obj with different value to verify the rest are same
+*
+* Programmer: Jonathan Kim (July, 21, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_exclude_obj1(const char *fname1, const char *fname2)
+{
+ hid_t fid1=0;
+ hid_t fid2=0;
+ hid_t gid1=0;
+ hid_t gid2=0;
+ hsize_t dims2[2] = {2,4};
+ int data1[4][2] = {{0,0},{0,0},{0,0},{0,0}};
+ int data2[4][2] = {{0,1},{2,3},{1,2},{3,4}};
+ herr_t status = SUCCEED;
+
+ /*-----------------------------------------------------------------------
+ * Create file(s)
+ *------------------------------------------------------------------------*/
+ fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ if (fid1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ if (fid2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+
+ /*-----------------------------------------------------------------------
+ * Group
+ *------------------------------------------------------------------------*/
+ /* file1 */
+ gid1 = H5Gcreate2(fid1, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (gid1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ /* file2 */
+ gid2 = H5Gcreate2(fid2, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ if (gid2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+
+ /*-----------------------------------------------------------------------
+ * Datasets
+ *------------------------------------------------------------------------*/
+ /* file1 */
+ status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid1,2,dims2,"dset2",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid1,2,dims2,"dset3",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+
+ /* file2 */
+ status = write_dset(fid2,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid2,2,dims2,"dset2",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid2,2,dims2,"dset3",H5T_NATIVE_INT,data2);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+
+out:
+ /*-----------------------------------------------------------------------
+ * Close
+ *-----------------------------------------------------------------------*/
+ if(fid1)
+ H5Fclose(fid1);
+ if(fid2)
+ H5Fclose(fid2);
+ if(gid1)
+ H5Gclose(gid1);
+ if(gid2)
+ H5Gclose(gid2);
+
+ return status;
+}
+
+/*-------------------------------------------------------------------------
+*
+* Purpose: Create test files for excluding obj.
+* different structure and name
+* Test : exclude different objs to verify the rest are same
+*
+* Programmer: Jonathan Kim (July, 21, 2010)
+*
+*-------------------------------------------------------------------------*/
+static int test_exclude_obj2(const char *fname1, const char *fname2)
+{
+ hid_t fid1=0;
+ hid_t fid2=0;
+ hid_t gid1=0;
+ hid_t gid2=0;
+ hid_t gid3=0;
+ hsize_t dims2[2] = {2,4};
+ int data1[4][2] = {{0,0},{0,0},{0,0},{0,0}};
+ int data2[4][2] = {{0,1},{2,3},{1,2},{3,4}};
+ herr_t status = SUCCEED;
+
+ /*-----------------------------------------------------------------------
+ * Create file(s)
+ *------------------------------------------------------------------------*/
+ fid1 = H5Fcreate (fname1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ if (fid1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ fid2 = H5Fcreate (fname2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ if (fid2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Fcreate failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+
+ /*-----------------------------------------------------------------------
+ * Group
+ *------------------------------------------------------------------------*/
+ /* file1 */
+ gid1 = H5Gcreate2(fid1, "group10", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+ if (gid1 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ /* file2 */
+ gid2 = H5Gcreate2(fid2, "group10", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ if (gid2 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ /* subset name from group10 */
+ gid3 = H5Gcreate2(fid2, "group1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
+
+ if (gid3 < 0)
+ {
+ fprintf(stderr, "Error: %s> H5Gcreate2 failed.\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+
+ /*-----------------------------------------------------------------------
+ * Datasets
+ *------------------------------------------------------------------------*/
+ /* file1 */
+ status = write_dset(fid1,2,dims2,"dset10",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(fid1,2,dims2,"dset1",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid1,2,dims2,"dset2",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname1);
+ status = FAIL;
+ goto out;
+ }
+
+
+ /* file2 */
+ status = write_dset(fid2,2,dims2,"dset10",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid2,2,dims2,"dset2",H5T_NATIVE_INT,data1);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+ status = write_dset(gid3,2,dims2,"dset3",H5T_NATIVE_INT,data2);
+ if (status == FAIL)
+ {
+ fprintf(stderr, "Error: %s> write_dset failed\n", fname2);
+ status = FAIL;
+ goto out;
+ }
+
+
+out:
+ /*-----------------------------------------------------------------------
+ * Close
+ *-----------------------------------------------------------------------*/
+ if(fid1)
+ H5Fclose(fid1);
+ if(fid2)
+ H5Fclose(fid2);
+ if(gid1)
+ H5Gclose(gid1);
+ if(gid2)
+ H5Gclose(gid2);
+ if(gid3)
+ H5Gclose(gid3);
+
+ return status;
+}
+
+/*-------------------------------------------------------------------------
* Function: write_attr_in
*
* Purpose: write attributes in LOC_ID (dataset, group, named datatype)
diff --git a/tools/h5diff/ph5diff_main.c b/tools/h5diff/ph5diff_main.c
index 531503d..f6b0dba 100644
--- a/tools/h5diff/ph5diff_main.c
+++ b/tools/h5diff/ph5diff_main.c
@@ -135,7 +135,7 @@ ph5diff_worker(int nID)
{
struct diff_args args;
hid_t file1_id, file2_id;
- char filenames[2][1024];
+ char filenames[2][MAX_FILENAME];
char out_data[PRINT_DATA_MAX_SIZE] = {0};
struct diffs_found diffs;
int i;
@@ -144,7 +144,7 @@ ph5diff_worker(int nID)
MPI_Comm_rank(MPI_COMM_WORLD, &nID);
outBuffOffset = 0;
- MPI_Recv(filenames, 1024*2, MPI_CHAR, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
+ MPI_Recv(filenames, MAX_FILENAME*2, MPI_CHAR, 0, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
if(Status.MPI_TAG == MPI_TAG_PARALLEL)
{
/* disable error reporting */
@@ -175,7 +175,7 @@ ph5diff_worker(int nID)
/*Recv parameters for diff from manager task */
MPI_Recv(&args, sizeof(args), MPI_BYTE, 0, MPI_TAG_ARGS, MPI_COMM_WORLD, &Status);
/*Do the diff */
- diffs.nfound = diff(file1_id, args.name, file2_id, args.name, &(args.options), args.type);
+ diffs.nfound = diff(file1_id, args.name1, file2_id, args.name2, &(args.options), args.type);
diffs.not_cmp = args.options.not_cmp;
/*If print buffer has something in it, request print token.*/
diff --git a/tools/h5diff/testfiles/h5diff_10.txt b/tools/h5diff/testfiles/h5diff_10.txt
index d3ee9a6..224f9bc 100644
--- a/tools/h5diff/testfiles/h5diff_10.txt
+++ b/tools/h5diff/testfiles/h5diff_10.txt
@@ -1,4 +1,4 @@
-usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
+usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
file1 File name of the first HDF5 file
file2 File name of the second HDF5 file
[obj1] Name of an HDF5 object, in absolute path
@@ -69,16 +69,26 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
-v Verbose mode: print the above plus a list of objects and warnings
-q Quiet mode: do not print output
- Compare criteria
- If no objects [obj1[obj2]] are specified, h5diff only compares objects
- with the same absolute path in both files
+ File comparison:
+ If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as
+ a comparison of the two files' root groups. That is, h5diff first compares
+ the names of root group members, generates a report of root group objects
+ that appear in only one file or in both files, and recursively compares
+ common objects.
- The compare criteria is:
- 1) datasets: numerical array differences
- 2) groups: name string difference
- 3) datatypes: the return value of H5Tequal
- 4) links: name string difference of the linked value as default
- (refer to --follow-symlinks option).
+ Object comparison:
+ 1) Groups
+ First compares the names of member objects (relative path, from the
+ specified group) and generates a report of objects that appear in only
+ one group or in both groups. Common objects are then compared recursively.
+ 2) Datasets
+ Array rank and dimensions, datatypes, and data values are compared.
+ 3) Datatypes
+ The comparison is based on the return value of H5Tequal.
+ 4) Symbolic links
+ The paths to the target objects are compared.
+ (The option --follow-symlinks overrides the default behavior when
+ symbolic links are compared.).
Exit code:
0 if no differences, 1 if differences found, 2 if error
diff --git a/tools/h5diff/testfiles/h5diff_23.txt b/tools/h5diff/testfiles/h5diff_23.txt
index 5a46ea2..bd1cadb 100644
--- a/tools/h5diff/testfiles/h5diff_23.txt
+++ b/tools/h5diff/testfiles/h5diff_23.txt
@@ -1,3 +1,8 @@
+
+group1 group2
+---------------------------------------
+ x x
+
group : </g1> and </g1>
0 differences found
EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_26.txt b/tools/h5diff/testfiles/h5diff_26.txt
index 8e1fcc3..54a5121 100644
--- a/tools/h5diff/testfiles/h5diff_26.txt
+++ b/tools/h5diff/testfiles/h5diff_26.txt
@@ -1,3 +1,8 @@
+
+group1 group2
+---------------------------------------
+ x x
+
group : </g1> and </g2>
-1 differences found
-EXIT CODE: 1
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_400.txt b/tools/h5diff/testfiles/h5diff_400.txt
index 97db70d..8b3c03c 100644
--- a/tools/h5diff/testfiles/h5diff_400.txt
+++ b/tools/h5diff/testfiles/h5diff_400.txt
@@ -3,10 +3,9 @@ file1 file2
---------------------------------------
x x /
x x /softlink_dset1_1
- x x /softlink_dset1_2
x x /softlink_dset2
x x /softlink_group1
- x x /softlink_group2
+ x x /softlink_group1/dset
x x /softlink_noexist
x x /target_dset1
x x /target_dset2
@@ -15,25 +14,13 @@ file1 file2
group : </> and </>
0 differences found
-link : </softlink_dset1_1> and </softlink_dset1_1>
dataset: </softlink_dset1_1> and </softlink_dset1_1>
0 differences found
-0 differences found
-link : </softlink_dset1_2> and </softlink_dset1_2>
-dataset: </softlink_dset1_2> and </softlink_dset1_2>
-0 differences found
-0 differences found
-link : </softlink_dset2> and </softlink_dset2>
dataset: </softlink_dset2> and </softlink_dset2>
0 differences found
-0 differences found
-link : </softlink_group1> and </softlink_group1>
group : </softlink_group1> and </softlink_group1>
0 differences found
-0 differences found
-link : </softlink_group2> and </softlink_group2>
-group : </softlink_group2> and </softlink_group2>
-0 differences found
+dataset: </softlink_group1/dset> and </softlink_group1/dset>
0 differences found
dangling link: </softlink_noexist> and </softlink_noexist>
0 differences found
diff --git a/tools/h5diff/testfiles/h5diff_404.txt b/tools/h5diff/testfiles/h5diff_404.txt
index c9a476d..db317d1 100644
--- a/tools/h5diff/testfiles/h5diff_404.txt
+++ b/tools/h5diff/testfiles/h5diff_404.txt
@@ -5,27 +5,25 @@ file1 file2
x x /ext_link_dset1
x x /ext_link_dset2
x x /ext_link_grp1
+ x x /ext_link_grp1/x_dset
x x /ext_link_grp2
+ x x /ext_link_grp2/x_dset
x x /ext_link_noexist1
x x /ext_link_noexist2
group : </> and </>
0 differences found
-external link: </ext_link_dset1> and </ext_link_dset1>
dataset: </ext_link_dset1> and </ext_link_dset1>
0 differences found
-0 differences found
-external link: </ext_link_dset2> and </ext_link_dset2>
dataset: </ext_link_dset2> and </ext_link_dset2>
0 differences found
-0 differences found
-external link: </ext_link_grp1> and </ext_link_grp1>
group : </ext_link_grp1> and </ext_link_grp1>
0 differences found
+dataset: </ext_link_grp1/x_dset> and </ext_link_grp1/x_dset>
0 differences found
-external link: </ext_link_grp2> and </ext_link_grp2>
group : </ext_link_grp2> and </ext_link_grp2>
0 differences found
+dataset: </ext_link_grp2/x_dset> and </ext_link_grp2/x_dset>
0 differences found
dangling link: </ext_link_noexist1> and </ext_link_noexist1>
0 differences found
diff --git a/tools/h5diff/testfiles/h5diff_410.txt b/tools/h5diff/testfiles/h5diff_410.txt
index b0924f6..6087bb8 100644
--- a/tools/h5diff/testfiles/h5diff_410.txt
+++ b/tools/h5diff/testfiles/h5diff_410.txt
@@ -23,54 +23,30 @@ file1 file2
group : </> and </>
0 differences found
-link : </softlink1_to_dset1> and </softlink1_to_dset1>
dataset: </softlink1_to_dset1> and </softlink1_to_dset1>
0 differences found
-0 differences found
-link : </softlink1_to_slink1> and </softlink1_to_slink1>
dataset: </softlink1_to_slink1> and </softlink1_to_slink1>
0 differences found
-0 differences found
-link : </softlink1_to_slink2> and </softlink1_to_slink2>
dataset: </softlink1_to_slink2> and </softlink1_to_slink2>
0 differences found
-0 differences found
-link : </softlink2_to_dset2> and </softlink2_to_dset2>
dataset: </softlink2_to_dset2> and </softlink2_to_dset2>
0 differences found
-0 differences found
-link : </softlink2_to_slink1> and </softlink2_to_slink1>
dataset: </softlink2_to_slink1> and </softlink2_to_slink1>
0 differences found
-0 differences found
-link : </softlink2_to_slink2> and </softlink2_to_slink2>
dataset: </softlink2_to_slink2> and </softlink2_to_slink2>
0 differences found
-0 differences found
-link : </softlink3_to_group1> and </softlink3_to_group1>
group : </softlink3_to_group1> and </softlink3_to_group1>
0 differences found
-0 differences found
-link : </softlink3_to_slink1> and </softlink3_to_slink1>
group : </softlink3_to_slink1> and </softlink3_to_slink1>
0 differences found
-0 differences found
-link : </softlink3_to_slink2> and </softlink3_to_slink2>
group : </softlink3_to_slink2> and </softlink3_to_slink2>
0 differences found
-0 differences found
-link : </softlink4_to_group2> and </softlink4_to_group2>
group : </softlink4_to_group2> and </softlink4_to_group2>
0 differences found
-0 differences found
-link : </softlink4_to_slink1> and </softlink4_to_slink1>
group : </softlink4_to_slink1> and </softlink4_to_slink1>
0 differences found
-0 differences found
-link : </softlink4_to_slink2> and </softlink4_to_slink2>
group : </softlink4_to_slink2> and </softlink4_to_slink2>
0 differences found
-0 differences found
dataset: </target_dset1> and </target_dset1>
0 differences found
dataset: </target_dset2> and </target_dset2>
diff --git a/tools/h5diff/testfiles/h5diff_414.txt b/tools/h5diff/testfiles/h5diff_414.txt
index e7a991a..a47349e 100644
--- a/tools/h5diff/testfiles/h5diff_414.txt
+++ b/tools/h5diff/testfiles/h5diff_414.txt
@@ -1,3 +1,9 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x /dset
+
group : </target_group> and </softlink3_to_slink2>
-1 differences found
+0 differences found
EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_415.txt b/tools/h5diff/testfiles/h5diff_415.txt
index 1e97319..30cc947 100644
--- a/tools/h5diff/testfiles/h5diff_415.txt
+++ b/tools/h5diff/testfiles/h5diff_415.txt
@@ -1,3 +1,9 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x /dset
+
group : </softlink3_to_slink2> and </target_group>
-1 differences found
+0 differences found
EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_416.txt b/tools/h5diff/testfiles/h5diff_416.txt
index e4e98b0..551a6c3 100644
--- a/tools/h5diff/testfiles/h5diff_416.txt
+++ b/tools/h5diff/testfiles/h5diff_416.txt
@@ -1,3 +1,8 @@
+
+group1 group2
+---------------------------------------
+ x x
+
group : </softlink3_to_slink2> and </softlink4_to_slink2>
-1 differences found
-EXIT CODE: 1
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_453.txt b/tools/h5diff/testfiles/h5diff_453.txt
index 9c4d61b..8a5ca52 100644
--- a/tools/h5diff/testfiles/h5diff_453.txt
+++ b/tools/h5diff/testfiles/h5diff_453.txt
@@ -3,10 +3,9 @@ file1 file2
---------------------------------------
x x /
x x /softlink_dset1_1
- x x /softlink_dset1_2
x x /softlink_dset2
x x /softlink_group1
- x x /softlink_group2
+ x x /softlink_group1/dset
x x /softlink_noexist
x x /target_dset1
x x /target_dset2
@@ -15,25 +14,13 @@ file1 file2
group : </> and </>
0 differences found
-link : </softlink_dset1_1> and </softlink_dset1_1>
dataset: </softlink_dset1_1> and </softlink_dset1_1>
0 differences found
-0 differences found
-link : </softlink_dset1_2> and </softlink_dset1_2>
-dataset: </softlink_dset1_2> and </softlink_dset1_2>
-0 differences found
-0 differences found
-link : </softlink_dset2> and </softlink_dset2>
dataset: </softlink_dset2> and </softlink_dset2>
0 differences found
-0 differences found
-link : </softlink_group1> and </softlink_group1>
group : </softlink_group1> and </softlink_group1>
0 differences found
-0 differences found
-link : </softlink_group2> and </softlink_group2>
-group : </softlink_group2> and </softlink_group2>
-0 differences found
+dataset: </softlink_group1/dset> and </softlink_group1/dset>
0 differences found
Warning: </softlink_noexist> is a dangling link.
dataset: </target_dset1> and </target_dset1>
diff --git a/tools/h5diff/testfiles/h5diff_456.txt b/tools/h5diff/testfiles/h5diff_456.txt
index f20e403..9317988 100644
--- a/tools/h5diff/testfiles/h5diff_456.txt
+++ b/tools/h5diff/testfiles/h5diff_456.txt
@@ -5,27 +5,25 @@ file1 file2
x x /ext_link_dset1
x x /ext_link_dset2
x x /ext_link_grp1
+ x x /ext_link_grp1/x_dset
x x /ext_link_grp2
+ x x /ext_link_grp2/x_dset
x x /ext_link_noexist1
x x /ext_link_noexist2
group : </> and </>
0 differences found
-external link: </ext_link_dset1> and </ext_link_dset1>
dataset: </ext_link_dset1> and </ext_link_dset1>
0 differences found
-0 differences found
-external link: </ext_link_dset2> and </ext_link_dset2>
dataset: </ext_link_dset2> and </ext_link_dset2>
0 differences found
-0 differences found
-external link: </ext_link_grp1> and </ext_link_grp1>
group : </ext_link_grp1> and </ext_link_grp1>
0 differences found
+dataset: </ext_link_grp1/x_dset> and </ext_link_grp1/x_dset>
0 differences found
-external link: </ext_link_grp2> and </ext_link_grp2>
group : </ext_link_grp2> and </ext_link_grp2>
0 differences found
+dataset: </ext_link_grp2/x_dset> and </ext_link_grp2/x_dset>
0 differences found
Warning: </ext_link_noexist1> is a dangling link.
Warning: </ext_link_noexist2> is a dangling link.
diff --git a/tools/h5diff/testfiles/h5diff_480.txt b/tools/h5diff/testfiles/h5diff_480.txt
new file mode 100644
index 0000000..3e1f900
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_480.txt
@@ -0,0 +1,17 @@
+
+file1 file2
+---------------------------------------
+ x x /
+ x x /dset1
+ x x /group1
+ x x /group1/dset2
+
+group : </> and </>
+0 differences found
+dataset: </dset1> and </dset1>
+0 differences found
+group : </group1> and </group1>
+0 differences found
+dataset: </group1/dset2> and </group1/dset2>
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_481.txt b/tools/h5diff/testfiles/h5diff_481.txt
new file mode 100644
index 0000000..c4f2448
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_481.txt
@@ -0,0 +1,30 @@
+
+file1 file2
+---------------------------------------
+ x x /
+ x x /dset1
+ x x /group1
+ x x /group1/dset2
+ x x /group1/dset3
+
+group : </> and </>
+0 differences found
+dataset: </dset1> and </dset1>
+0 differences found
+group : </group1> and </group1>
+0 differences found
+dataset: </group1/dset2> and </group1/dset2>
+0 differences found
+dataset: </group1/dset3> and </group1/dset3>
+size: [2x4] [2x4]
+position dset3 dset3 difference
+------------------------------------------------------------
+[ 0 1 ] 0 1 1
+[ 0 2 ] 0 2 2
+[ 0 3 ] 0 3 3
+[ 1 0 ] 0 1 1
+[ 1 1 ] 0 2 2
+[ 1 2 ] 0 3 3
+[ 1 3 ] 0 4 4
+7 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_482.txt b/tools/h5diff/testfiles/h5diff_482.txt
new file mode 100644
index 0000000..5b3c8c1
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_482.txt
@@ -0,0 +1,17 @@
+
+file1 file2
+---------------------------------------
+ x x /
+ x x /dset10
+ x x /group10
+ x x /group10/dset2
+
+group : </> and </>
+0 differences found
+dataset: </dset10> and </dset10>
+0 differences found
+group : </group10> and </group10>
+0 differences found
+dataset: </group10/dset2> and </group10/dset2>
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_483.txt b/tools/h5diff/testfiles/h5diff_483.txt
new file mode 100644
index 0000000..a45e928
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_483.txt
@@ -0,0 +1,18 @@
+
+file1 file2
+---------------------------------------
+ x x /
+ x /dset1
+ x x /dset10
+ x x /group10
+ x x /group10/dset2
+
+group : </> and </>
+0 differences found
+dataset: </dset10> and </dset10>
+0 differences found
+group : </group10> and </group10>
+0 differences found
+dataset: </group10/dset2> and </group10/dset2>
+0 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_500.txt b/tools/h5diff/testfiles/h5diff_500.txt
new file mode 100644
index 0000000..7d688d2
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_500.txt
@@ -0,0 +1,72 @@
+
+file1 file2
+---------------------------------------
+ x x /
+ x x /dset1
+ x x /dset2
+ x x /dset3
+ x x /elink_grp1
+ x x /elink_grp2
+ x x /elink_grp3
+ x x /grp1
+ x x /grp1/dset1
+ x x /grp1/grp2
+ x x /grp1/grp2/dset1
+ x x /grp1/grp2/dset2
+ x x /grp1/grp2/grp3
+ x x /grp1/grp2/grp3/dset1
+ x x /grp1/grp2/grp3/dset2
+ x x /grp1/grp2/grp3/dset3
+ x /grp10
+ x /grp10/dset4
+ x /grp10/dset5
+ x /grp10/elink_grp_circle
+ x /grp11
+ x /grp11/dset4
+ x /grp11/dset5
+ x /grp11/elink_grp_circle
+ x x /slink_grp1
+ x /slink_grp10
+ x /slink_grp11
+ x x /slink_grp2
+ x x /slink_grp3
+
+group : </> and </>
+0 differences found
+dataset: </dset1> and </dset1>
+0 differences found
+dataset: </dset2> and </dset2>
+0 differences found
+dataset: </dset3> and </dset3>
+0 differences found
+external link: </elink_grp1> and </elink_grp1>
+1 differences found
+external link: </elink_grp2> and </elink_grp2>
+1 differences found
+external link: </elink_grp3> and </elink_grp3>
+1 differences found
+group : </grp1> and </grp1>
+0 differences found
+dataset: </grp1/dset1> and </grp1/dset1>
+0 differences found
+group : </grp1/grp2> and </grp1/grp2>
+0 differences found
+dataset: </grp1/grp2/dset1> and </grp1/grp2/dset1>
+0 differences found
+dataset: </grp1/grp2/dset2> and </grp1/grp2/dset2>
+0 differences found
+group : </grp1/grp2/grp3> and </grp1/grp2/grp3>
+0 differences found
+dataset: </grp1/grp2/grp3/dset1> and </grp1/grp2/grp3/dset1>
+0 differences found
+dataset: </grp1/grp2/grp3/dset2> and </grp1/grp2/grp3/dset2>
+0 differences found
+dataset: </grp1/grp2/grp3/dset3> and </grp1/grp2/grp3/dset3>
+0 differences found
+link : </slink_grp1> and </slink_grp1>
+0 differences found
+link : </slink_grp2> and </slink_grp2>
+0 differences found
+link : </slink_grp3> and </slink_grp3>
+0 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_501.txt b/tools/h5diff/testfiles/h5diff_501.txt
new file mode 100644
index 0000000..75e91da
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_501.txt
@@ -0,0 +1,188 @@
+
+file1 file2
+---------------------------------------
+ x x /
+ x x /dset1
+ x x /dset2
+ x x /dset3
+ x x /elink_grp1
+ x x /elink_grp1/dset1
+ x x /elink_grp1/grp2
+ x x /elink_grp1/grp2/dset1
+ x x /elink_grp1/grp2/dset2
+ x x /elink_grp1/grp2/grp3
+ x x /elink_grp1/grp2/grp3/dset1
+ x x /elink_grp1/grp2/grp3/dset2
+ x x /elink_grp1/grp2/grp3/dset3
+ x x /elink_grp2
+ x x /elink_grp2/dset1
+ x x /elink_grp2/dset2
+ x x /elink_grp2/grp3
+ x x /elink_grp2/grp3/dset1
+ x x /elink_grp2/grp3/dset2
+ x x /elink_grp2/grp3/dset3
+ x x /elink_grp3
+ x x /elink_grp3/dset1
+ x x /elink_grp3/dset2
+ x x /elink_grp3/dset3
+ x x /grp1
+ x x /grp1/dset1
+ x x /grp1/grp2
+ x x /grp1/grp2/dset1
+ x x /grp1/grp2/dset2
+ x x /grp1/grp2/grp3
+ x x /grp1/grp2/grp3/dset1
+ x x /grp1/grp2/grp3/dset2
+ x x /grp1/grp2/grp3/dset3
+ x /grp10
+ x /grp10/dset4
+ x /grp10/dset5
+ x /grp10/elink_grp_circle
+ x /grp10/elink_grp_circle/dset4
+ x /grp10/elink_grp_circle/dset5
+ x /grp10/elink_grp_circle/elink_grp_circle
+ x /grp10/elink_grp_circle/elink_grp_circle/dset4
+ x /grp10/elink_grp_circle/elink_grp_circle/dset5
+ x /grp11
+ x /grp11/dset4
+ x /grp11/dset5
+ x /grp11/elink_grp_circle
+ x /grp11/elink_grp_circle/dset4
+ x /grp11/elink_grp_circle/dset5
+ x /grp11/elink_grp_circle/elink_grp_circle
+ x /grp11/elink_grp_circle/elink_grp_circle/dset4
+ x /grp11/elink_grp_circle/elink_grp_circle/dset5
+ x x /slink_grp1
+ x x /slink_grp1/dset1
+ x x /slink_grp1/grp2
+ x x /slink_grp1/grp2/dset1
+ x x /slink_grp1/grp2/dset2
+ x x /slink_grp1/grp2/grp3
+ x x /slink_grp1/grp2/grp3/dset1
+ x x /slink_grp1/grp2/grp3/dset2
+ x x /slink_grp1/grp2/grp3/dset3
+ x /slink_grp10
+ x /slink_grp10/dset4
+ x /slink_grp10/dset5
+ x /slink_grp11
+ x /slink_grp11/dset4
+ x /slink_grp11/dset5
+ x x /slink_grp2
+ x x /slink_grp2/dset1
+ x x /slink_grp2/dset2
+ x x /slink_grp2/grp3
+ x x /slink_grp2/grp3/dset1
+ x x /slink_grp2/grp3/dset2
+ x x /slink_grp2/grp3/dset3
+ x x /slink_grp3
+ x x /slink_grp3/dset1
+ x x /slink_grp3/dset2
+ x x /slink_grp3/dset3
+
+group : </> and </>
+0 differences found
+dataset: </dset1> and </dset1>
+0 differences found
+dataset: </dset2> and </dset2>
+0 differences found
+dataset: </dset3> and </dset3>
+0 differences found
+group : </elink_grp1> and </elink_grp1>
+0 differences found
+dataset: </elink_grp1/dset1> and </elink_grp1/dset1>
+0 differences found
+group : </elink_grp1/grp2> and </elink_grp1/grp2>
+0 differences found
+dataset: </elink_grp1/grp2/dset1> and </elink_grp1/grp2/dset1>
+0 differences found
+dataset: </elink_grp1/grp2/dset2> and </elink_grp1/grp2/dset2>
+0 differences found
+group : </elink_grp1/grp2/grp3> and </elink_grp1/grp2/grp3>
+0 differences found
+dataset: </elink_grp1/grp2/grp3/dset1> and </elink_grp1/grp2/grp3/dset1>
+0 differences found
+dataset: </elink_grp1/grp2/grp3/dset2> and </elink_grp1/grp2/grp3/dset2>
+0 differences found
+dataset: </elink_grp1/grp2/grp3/dset3> and </elink_grp1/grp2/grp3/dset3>
+0 differences found
+group : </elink_grp2> and </elink_grp2>
+0 differences found
+dataset: </elink_grp2/dset1> and </elink_grp2/dset1>
+0 differences found
+dataset: </elink_grp2/dset2> and </elink_grp2/dset2>
+0 differences found
+group : </elink_grp2/grp3> and </elink_grp2/grp3>
+0 differences found
+dataset: </elink_grp2/grp3/dset1> and </elink_grp2/grp3/dset1>
+0 differences found
+dataset: </elink_grp2/grp3/dset2> and </elink_grp2/grp3/dset2>
+0 differences found
+dataset: </elink_grp2/grp3/dset3> and </elink_grp2/grp3/dset3>
+0 differences found
+group : </elink_grp3> and </elink_grp3>
+0 differences found
+dataset: </elink_grp3/dset1> and </elink_grp3/dset1>
+0 differences found
+dataset: </elink_grp3/dset2> and </elink_grp3/dset2>
+0 differences found
+dataset: </elink_grp3/dset3> and </elink_grp3/dset3>
+0 differences found
+group : </grp1> and </grp1>
+0 differences found
+dataset: </grp1/dset1> and </grp1/dset1>
+0 differences found
+group : </grp1/grp2> and </grp1/grp2>
+0 differences found
+dataset: </grp1/grp2/dset1> and </grp1/grp2/dset1>
+0 differences found
+dataset: </grp1/grp2/dset2> and </grp1/grp2/dset2>
+0 differences found
+group : </grp1/grp2/grp3> and </grp1/grp2/grp3>
+0 differences found
+dataset: </grp1/grp2/grp3/dset1> and </grp1/grp2/grp3/dset1>
+0 differences found
+dataset: </grp1/grp2/grp3/dset2> and </grp1/grp2/grp3/dset2>
+0 differences found
+dataset: </grp1/grp2/grp3/dset3> and </grp1/grp2/grp3/dset3>
+0 differences found
+group : </slink_grp1> and </slink_grp1>
+0 differences found
+dataset: </slink_grp1/dset1> and </slink_grp1/dset1>
+0 differences found
+group : </slink_grp1/grp2> and </slink_grp1/grp2>
+0 differences found
+dataset: </slink_grp1/grp2/dset1> and </slink_grp1/grp2/dset1>
+0 differences found
+dataset: </slink_grp1/grp2/dset2> and </slink_grp1/grp2/dset2>
+0 differences found
+group : </slink_grp1/grp2/grp3> and </slink_grp1/grp2/grp3>
+0 differences found
+dataset: </slink_grp1/grp2/grp3/dset1> and </slink_grp1/grp2/grp3/dset1>
+0 differences found
+dataset: </slink_grp1/grp2/grp3/dset2> and </slink_grp1/grp2/grp3/dset2>
+0 differences found
+dataset: </slink_grp1/grp2/grp3/dset3> and </slink_grp1/grp2/grp3/dset3>
+0 differences found
+group : </slink_grp2> and </slink_grp2>
+0 differences found
+dataset: </slink_grp2/dset1> and </slink_grp2/dset1>
+0 differences found
+dataset: </slink_grp2/dset2> and </slink_grp2/dset2>
+0 differences found
+group : </slink_grp2/grp3> and </slink_grp2/grp3>
+0 differences found
+dataset: </slink_grp2/grp3/dset1> and </slink_grp2/grp3/dset1>
+0 differences found
+dataset: </slink_grp2/grp3/dset2> and </slink_grp2/grp3/dset2>
+0 differences found
+dataset: </slink_grp2/grp3/dset3> and </slink_grp2/grp3/dset3>
+0 differences found
+group : </slink_grp3> and </slink_grp3>
+0 differences found
+dataset: </slink_grp3/dset1> and </slink_grp3/dset1>
+0 differences found
+dataset: </slink_grp3/dset2> and </slink_grp3/dset2>
+0 differences found
+dataset: </slink_grp3/dset3> and </slink_grp3/dset3>
+0 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_502.txt b/tools/h5diff/testfiles/h5diff_502.txt
new file mode 100644
index 0000000..d3de6e5
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_502.txt
@@ -0,0 +1,36 @@
+
+group1 group2
+---------------------------------------
+ x
+ x /
+ x x /dset1
+ x x /dset2
+ x x /dset3
+ x /elink_grp1
+ x /elink_grp2
+ x /elink_grp3
+ x /grp1
+ x /grp1/dset1
+ x /grp1/grp2
+ x /grp1/grp2/dset1
+ x /grp1/grp2/dset2
+ x /grp1/grp2/grp3
+ x /grp1/grp2/grp3/dset1
+ x /grp1/grp2/grp3/dset2
+ x /grp1/grp2/grp3/dset3
+ x /grp10
+ x /grp10/dset4
+ x /grp10/dset5
+ x /grp10/elink_grp_circle
+ x /slink_grp1
+ x /slink_grp10
+ x /slink_grp2
+ x /slink_grp3
+
+dataset: </dset1> and </grp1/grp2/grp3/dset1>
+0 differences found
+dataset: </dset2> and </grp1/grp2/grp3/dset2>
+0 differences found
+dataset: </dset3> and </grp1/grp2/grp3/dset3>
+0 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_503.txt b/tools/h5diff/testfiles/h5diff_503.txt
new file mode 100644
index 0000000..cf01598
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_503.txt
@@ -0,0 +1,32 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x x /dset1
+ x x /grp2
+ x x /grp2/dset1
+ x x /grp2/dset2
+ x x /grp2/grp3
+ x x /grp2/grp3/dset1
+ x x /grp2/grp3/dset2
+ x x /grp2/grp3/dset3
+
+group : </grp1> and </grp1>
+0 differences found
+dataset: </grp1/dset1> and </grp1/dset1>
+0 differences found
+group : </grp1/grp2> and </grp1/grp2>
+0 differences found
+dataset: </grp1/grp2/dset1> and </grp1/grp2/dset1>
+0 differences found
+dataset: </grp1/grp2/dset2> and </grp1/grp2/dset2>
+0 differences found
+group : </grp1/grp2/grp3> and </grp1/grp2/grp3>
+0 differences found
+dataset: </grp1/grp2/grp3/dset1> and </grp1/grp2/grp3/dset1>
+0 differences found
+dataset: </grp1/grp2/grp3/dset2> and </grp1/grp2/grp3/dset2>
+0 differences found
+dataset: </grp1/grp2/grp3/dset3> and </grp1/grp2/grp3/dset3>
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_504.txt b/tools/h5diff/testfiles/h5diff_504.txt
new file mode 100644
index 0000000..6cf43b3
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_504.txt
@@ -0,0 +1,19 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x x /dset1
+ x x /dset2
+ x /dset3
+ x /grp3
+ x /grp3/dset1
+ x /grp3/dset2
+ x /grp3/dset3
+
+group : </grp1/grp2> and </grp1/grp2/grp3>
+0 differences found
+dataset: </grp1/grp2/dset1> and </grp1/grp2/grp3/dset1>
+0 differences found
+dataset: </grp1/grp2/dset2> and </grp1/grp2/grp3/dset2>
+0 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_505.txt b/tools/h5diff/testfiles/h5diff_505.txt
new file mode 100644
index 0000000..28640b7
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_505.txt
@@ -0,0 +1,6 @@
+</grp1> is of type H5G_GROUP and </slink_grp1> is of type H5G_LINK
+--------------------------------
+Some objects are not comparable
+--------------------------------
+Use -c for a list of objects.
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_506.txt b/tools/h5diff/testfiles/h5diff_506.txt
new file mode 100644
index 0000000..efef9a7
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_506.txt
@@ -0,0 +1,26 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x x /dset1
+ x x /dset2
+ x x /grp3
+ x x /grp3/dset1
+ x x /grp3/dset2
+ x x /grp3/dset3
+
+group : </grp1/grp2> and </slink_grp2>
+0 differences found
+dataset: </grp1/grp2/dset1> and </slink_grp2/dset1>
+0 differences found
+dataset: </grp1/grp2/dset2> and </slink_grp2/dset2>
+0 differences found
+group : </grp1/grp2/grp3> and </slink_grp2/grp3>
+0 differences found
+dataset: </grp1/grp2/grp3/dset1> and </slink_grp2/grp3/dset1>
+0 differences found
+dataset: </grp1/grp2/grp3/dset2> and </slink_grp2/grp3/dset2>
+0 differences found
+dataset: </grp1/grp2/grp3/dset3> and </slink_grp2/grp3/dset3>
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_507.txt b/tools/h5diff/testfiles/h5diff_507.txt
new file mode 100644
index 0000000..ed2b799
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_507.txt
@@ -0,0 +1,6 @@
+</grp1> is of type H5G_GROUP and </elink_grp1> is of type H5G_UDLINK
+--------------------------------
+Some objects are not comparable
+--------------------------------
+Use -c for a list of objects.
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_508.txt b/tools/h5diff/testfiles/h5diff_508.txt
new file mode 100644
index 0000000..9796345
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_508.txt
@@ -0,0 +1,32 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x x /dset1
+ x x /grp2
+ x x /grp2/dset1
+ x x /grp2/dset2
+ x x /grp2/grp3
+ x x /grp2/grp3/dset1
+ x x /grp2/grp3/dset2
+ x x /grp2/grp3/dset3
+
+group : </grp1> and </elink_grp1>
+0 differences found
+dataset: </grp1/dset1> and </elink_grp1/dset1>
+0 differences found
+group : </grp1/grp2> and </elink_grp1/grp2>
+0 differences found
+dataset: </grp1/grp2/dset1> and </elink_grp1/grp2/dset1>
+0 differences found
+dataset: </grp1/grp2/dset2> and </elink_grp1/grp2/dset2>
+0 differences found
+group : </grp1/grp2/grp3> and </elink_grp1/grp2/grp3>
+0 differences found
+dataset: </grp1/grp2/grp3/dset1> and </elink_grp1/grp2/grp3/dset1>
+0 differences found
+dataset: </grp1/grp2/grp3/dset2> and </elink_grp1/grp2/grp3/dset2>
+0 differences found
+dataset: </grp1/grp2/grp3/dset3> and </elink_grp1/grp2/grp3/dset3>
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_509.txt b/tools/h5diff/testfiles/h5diff_509.txt
new file mode 100644
index 0000000..145cd9d
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_509.txt
@@ -0,0 +1,6 @@
+</slink_grp1> is of type H5G_LINK and </elink_grp1> is of type H5G_UDLINK
+--------------------------------
+Some objects are not comparable
+--------------------------------
+Use -c for a list of objects.
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_510.txt b/tools/h5diff/testfiles/h5diff_510.txt
new file mode 100644
index 0000000..9d92768
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_510.txt
@@ -0,0 +1,32 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x x /dset1
+ x x /grp2
+ x x /grp2/dset1
+ x x /grp2/dset2
+ x x /grp2/grp3
+ x x /grp2/grp3/dset1
+ x x /grp2/grp3/dset2
+ x x /grp2/grp3/dset3
+
+group : </slink_grp1> and </elink_grp1>
+0 differences found
+dataset: </slink_grp1/dset1> and </elink_grp1/dset1>
+0 differences found
+group : </slink_grp1/grp2> and </elink_grp1/grp2>
+0 differences found
+dataset: </slink_grp1/grp2/dset1> and </elink_grp1/grp2/dset1>
+0 differences found
+dataset: </slink_grp1/grp2/dset2> and </elink_grp1/grp2/dset2>
+0 differences found
+group : </slink_grp1/grp2/grp3> and </elink_grp1/grp2/grp3>
+0 differences found
+dataset: </slink_grp1/grp2/grp3/dset1> and </elink_grp1/grp2/grp3/dset1>
+0 differences found
+dataset: </slink_grp1/grp2/grp3/dset2> and </elink_grp1/grp2/grp3/dset2>
+0 differences found
+dataset: </slink_grp1/grp2/grp3/dset3> and </elink_grp1/grp2/grp3/dset3>
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_511.txt b/tools/h5diff/testfiles/h5diff_511.txt
new file mode 100644
index 0000000..4bac100
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_511.txt
@@ -0,0 +1,24 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x x /dset4
+ x x /dset5
+ x x /elink_grp_circle
+
+group : </grp10> and </grp11>
+0 differences found
+dataset: </grp10/dset4> and </grp11/dset4>
+0 differences found
+dataset: </grp10/dset5> and </grp11/dset5>
+size: [2x4] [2x4]
+position dset5 dset5 difference
+------------------------------------------------------------
+[ 0 1 ] 3 2 1
+[ 0 3 ] 3 2 1
+[ 1 0 ] 3 2 1
+[ 1 2 ] 3 2 1
+4 differences found
+external link: </grp10/elink_grp_circle> and </grp11/elink_grp_circle>
+1 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_512.txt b/tools/h5diff/testfiles/h5diff_512.txt
new file mode 100644
index 0000000..23fbc12
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_512.txt
@@ -0,0 +1,53 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x x /dset4
+ x x /dset5
+ x x /elink_grp_circle
+ x x /elink_grp_circle/dset4
+ x x /elink_grp_circle/dset5
+ x x /elink_grp_circle/elink_grp_circle
+ x x /elink_grp_circle/elink_grp_circle/dset4
+ x x /elink_grp_circle/elink_grp_circle/dset5
+
+group : </grp10> and </grp11>
+0 differences found
+dataset: </grp10/dset4> and </grp11/dset4>
+0 differences found
+dataset: </grp10/dset5> and </grp11/dset5>
+size: [2x4] [2x4]
+position dset5 dset5 difference
+------------------------------------------------------------
+[ 0 1 ] 3 2 1
+[ 0 3 ] 3 2 1
+[ 1 0 ] 3 2 1
+[ 1 2 ] 3 2 1
+4 differences found
+group : </grp10/elink_grp_circle> and </grp11/elink_grp_circle>
+0 differences found
+dataset: </grp10/elink_grp_circle/dset4> and </grp11/elink_grp_circle/dset4>
+0 differences found
+dataset: </grp10/elink_grp_circle/dset5> and </grp11/elink_grp_circle/dset5>
+size: [2x4] [2x4]
+position dset5 dset5 difference
+------------------------------------------------------------
+[ 0 1 ] 2 3 1
+[ 0 3 ] 2 3 1
+[ 1 0 ] 2 3 1
+[ 1 2 ] 2 3 1
+4 differences found
+group : </grp10/elink_grp_circle/elink_grp_circle> and </grp11/elink_grp_circle/elink_grp_circle>
+0 differences found
+dataset: </grp10/elink_grp_circle/elink_grp_circle/dset4> and </grp11/elink_grp_circle/elink_grp_circle/dset4>
+0 differences found
+dataset: </grp10/elink_grp_circle/elink_grp_circle/dset5> and </grp11/elink_grp_circle/elink_grp_circle/dset5>
+size: [2x4] [2x4]
+position dset5 dset5 difference
+------------------------------------------------------------
+[ 0 1 ] 3 2 1
+[ 0 3 ] 3 2 1
+[ 1 0 ] 3 2 1
+[ 1 2 ] 3 2 1
+4 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_513.txt b/tools/h5diff/testfiles/h5diff_513.txt
new file mode 100644
index 0000000..b0af15d
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_513.txt
@@ -0,0 +1,3 @@
+link : </slink_grp10> and </slink_grp11>
+1 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_514.txt b/tools/h5diff/testfiles/h5diff_514.txt
new file mode 100644
index 0000000..f8e16e9
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_514.txt
@@ -0,0 +1,53 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x x /dset4
+ x x /dset5
+ x x /elink_grp_circle
+ x x /elink_grp_circle/dset4
+ x x /elink_grp_circle/dset5
+ x x /elink_grp_circle/elink_grp_circle
+ x x /elink_grp_circle/elink_grp_circle/dset4
+ x x /elink_grp_circle/elink_grp_circle/dset5
+
+group : </slink_grp10> and </slink_grp11>
+0 differences found
+dataset: </slink_grp10/dset4> and </slink_grp11/dset4>
+0 differences found
+dataset: </slink_grp10/dset5> and </slink_grp11/dset5>
+size: [2x4] [2x4]
+position dset5 dset5 difference
+------------------------------------------------------------
+[ 0 1 ] 3 2 1
+[ 0 3 ] 3 2 1
+[ 1 0 ] 3 2 1
+[ 1 2 ] 3 2 1
+4 differences found
+group : </slink_grp10/elink_grp_circle> and </slink_grp11/elink_grp_circle>
+0 differences found
+dataset: </slink_grp10/elink_grp_circle/dset4> and </slink_grp11/elink_grp_circle/dset4>
+0 differences found
+dataset: </slink_grp10/elink_grp_circle/dset5> and </slink_grp11/elink_grp_circle/dset5>
+size: [2x4] [2x4]
+position dset5 dset5 difference
+------------------------------------------------------------
+[ 0 1 ] 2 3 1
+[ 0 3 ] 2 3 1
+[ 1 0 ] 2 3 1
+[ 1 2 ] 2 3 1
+4 differences found
+group : </slink_grp10/elink_grp_circle/elink_grp_circle> and </slink_grp11/elink_grp_circle/elink_grp_circle>
+0 differences found
+dataset: </slink_grp10/elink_grp_circle/elink_grp_circle/dset4> and </slink_grp11/elink_grp_circle/elink_grp_circle/dset4>
+0 differences found
+dataset: </slink_grp10/elink_grp_circle/elink_grp_circle/dset5> and </slink_grp11/elink_grp_circle/elink_grp_circle/dset5>
+size: [2x4] [2x4]
+position dset5 dset5 difference
+------------------------------------------------------------
+[ 0 1 ] 3 2 1
+[ 0 3 ] 3 2 1
+[ 1 0 ] 3 2 1
+[ 1 2 ] 3 2 1
+4 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_515.txt b/tools/h5diff/testfiles/h5diff_515.txt
new file mode 100644
index 0000000..077d463
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_515.txt
@@ -0,0 +1,24 @@
+
+file1 file2
+---------------------------------------
+ x x /
+ x x /dset1
+ x x /g1
+ x x /g1/g2
+ x /g1/g2/g3
+ x /g1/g2/g3/dset1
+ x /g1/g2/g3/g4
+ x /g1/g2/g3/g4/dset2
+ x x /soft_dset1
+
+group : </> and </>
+0 differences found
+dataset: </dset1> and </dset1>
+0 differences found
+group : </g1> and </g1>
+0 differences found
+group : </g1/g2> and </g1/g2>
+0 differences found
+link : </soft_dset1> and </soft_dset1>
+0 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_516.txt b/tools/h5diff/testfiles/h5diff_516.txt
new file mode 100644
index 0000000..32f4bd5
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_516.txt
@@ -0,0 +1,32 @@
+
+file1 file2
+---------------------------------------
+ x x /
+ x x /dset1
+ x x /g1
+ x x /g1/g2
+ x x /g1/g2/g3
+ x x /g1/g2/g3/dset1
+ x x /g1/g2/g3/g4
+ x x /g1/g2/g3/g4/dset2
+ x x /soft_dset1
+
+group : </> and </>
+0 differences found
+dataset: </dset1> and </dset1>
+0 differences found
+group : </g1> and </g1>
+0 differences found
+group : </g1/g2> and </g1/g2>
+0 differences found
+group : </g1/g2/g3> and </g1/g2/g3>
+0 differences found
+dataset: </g1/g2/g3/dset1> and </g1/g2/g3/dset1>
+0 differences found
+group : </g1/g2/g3/g4> and </g1/g2/g3/g4>
+0 differences found
+dataset: </g1/g2/g3/g4/dset2> and </g1/g2/g3/g4/dset2>
+0 differences found
+dataset: </soft_dset1> and </soft_dset1>
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_517.txt b/tools/h5diff/testfiles/h5diff_517.txt
new file mode 100644
index 0000000..1b6e24f
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_517.txt
@@ -0,0 +1,15 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x x /g2
+ x /g2/g3
+ x /g2/g3/dset1
+ x /g2/g3/g4
+ x /g2/g3/g4/dset2
+
+group : </g1> and </g1>
+0 differences found
+group : </g1/g2> and </g1/g2>
+0 differences found
+EXIT CODE: 1
diff --git a/tools/h5diff/testfiles/h5diff_518.txt b/tools/h5diff/testfiles/h5diff_518.txt
new file mode 100644
index 0000000..f4761ad
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_518.txt
@@ -0,0 +1,23 @@
+
+group1 group2
+---------------------------------------
+ x x
+ x x /g2
+ x x /g2/g3
+ x x /g2/g3/dset1
+ x x /g2/g3/g4
+ x x /g2/g3/g4/dset2
+
+group : </g1> and </g1>
+0 differences found
+group : </g1/g2> and </g1/g2>
+0 differences found
+group : </g1/g2/g3> and </g1/g2/g3>
+0 differences found
+dataset: </g1/g2/g3/dset1> and </g1/g2/g3/dset1>
+0 differences found
+group : </g1/g2/g3/g4> and </g1/g2/g3/g4>
+0 differences found
+dataset: </g1/g2/g3/g4/dset2> and </g1/g2/g3/g4/dset2>
+0 differences found
+EXIT CODE: 0
diff --git a/tools/h5diff/testfiles/h5diff_600.txt b/tools/h5diff/testfiles/h5diff_600.txt
index cf540ab..b096ab5 100644
--- a/tools/h5diff/testfiles/h5diff_600.txt
+++ b/tools/h5diff/testfiles/h5diff_600.txt
@@ -1,4 +1,4 @@
-usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
+usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
file1 File name of the first HDF5 file
file2 File name of the second HDF5 file
[obj1] Name of an HDF5 object, in absolute path
@@ -69,16 +69,26 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
-v Verbose mode: print the above plus a list of objects and warnings
-q Quiet mode: do not print output
- Compare criteria
- If no objects [obj1[obj2]] are specified, h5diff only compares objects
- with the same absolute path in both files
+ File comparison:
+ If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as
+ a comparison of the two files' root groups. That is, h5diff first compares
+ the names of root group members, generates a report of root group objects
+ that appear in only one file or in both files, and recursively compares
+ common objects.
- The compare criteria is:
- 1) datasets: numerical array differences
- 2) groups: name string difference
- 3) datatypes: the return value of H5Tequal
- 4) links: name string difference of the linked value as default
- (refer to --follow-symlinks option).
+ Object comparison:
+ 1) Groups
+ First compares the names of member objects (relative path, from the
+ specified group) and generates a report of objects that appear in only
+ one group or in both groups. Common objects are then compared recursively.
+ 2) Datasets
+ Array rank and dimensions, datatypes, and data values are compared.
+ 3) Datatypes
+ The comparison is based on the return value of H5Tequal.
+ 4) Symbolic links
+ The paths to the target objects are compared.
+ (The option --follow-symlinks overrides the default behavior when
+ symbolic links are compared.).
Exit code:
0 if no differences, 1 if differences found, 2 if error
diff --git a/tools/h5diff/testfiles/h5diff_601.txt b/tools/h5diff/testfiles/h5diff_601.txt
new file mode 100644
index 0000000..eb12f38
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_601.txt
@@ -0,0 +1,2 @@
+Object </nono_obj> could not be found in <h5diff_basic1.h5>
+EXIT CODE: 2
diff --git a/tools/h5diff/testfiles/h5diff_603.txt b/tools/h5diff/testfiles/h5diff_603.txt
index 2f2e93f..2b37530 100644
--- a/tools/h5diff/testfiles/h5diff_603.txt
+++ b/tools/h5diff/testfiles/h5diff_603.txt
@@ -1,5 +1,5 @@
<-d -4> is not a valid option
-usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
+usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
file1 File name of the first HDF5 file
file2 File name of the second HDF5 file
[obj1] Name of an HDF5 object, in absolute path
@@ -70,16 +70,26 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
-v Verbose mode: print the above plus a list of objects and warnings
-q Quiet mode: do not print output
- Compare criteria
- If no objects [obj1[obj2]] are specified, h5diff only compares objects
- with the same absolute path in both files
+ File comparison:
+ If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as
+ a comparison of the two files' root groups. That is, h5diff first compares
+ the names of root group members, generates a report of root group objects
+ that appear in only one file or in both files, and recursively compares
+ common objects.
- The compare criteria is:
- 1) datasets: numerical array differences
- 2) groups: name string difference
- 3) datatypes: the return value of H5Tequal
- 4) links: name string difference of the linked value as default
- (refer to --follow-symlinks option).
+ Object comparison:
+ 1) Groups
+ First compares the names of member objects (relative path, from the
+ specified group) and generates a report of objects that appear in only
+ one group or in both groups. Common objects are then compared recursively.
+ 2) Datasets
+ Array rank and dimensions, datatypes, and data values are compared.
+ 3) Datatypes
+ The comparison is based on the return value of H5Tequal.
+ 4) Symbolic links
+ The paths to the target objects are compared.
+ (The option --follow-symlinks overrides the default behavior when
+ symbolic links are compared.).
Exit code:
0 if no differences, 1 if differences found, 2 if error
diff --git a/tools/h5diff/testfiles/h5diff_606.txt b/tools/h5diff/testfiles/h5diff_606.txt
index 3381406..63a1d53 100644
--- a/tools/h5diff/testfiles/h5diff_606.txt
+++ b/tools/h5diff/testfiles/h5diff_606.txt
@@ -1,5 +1,5 @@
<-d 0x1> is not a valid option
-usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
+usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
file1 File name of the first HDF5 file
file2 File name of the second HDF5 file
[obj1] Name of an HDF5 object, in absolute path
@@ -70,16 +70,26 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
-v Verbose mode: print the above plus a list of objects and warnings
-q Quiet mode: do not print output
- Compare criteria
- If no objects [obj1[obj2]] are specified, h5diff only compares objects
- with the same absolute path in both files
+ File comparison:
+ If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as
+ a comparison of the two files' root groups. That is, h5diff first compares
+ the names of root group members, generates a report of root group objects
+ that appear in only one file or in both files, and recursively compares
+ common objects.
- The compare criteria is:
- 1) datasets: numerical array differences
- 2) groups: name string difference
- 3) datatypes: the return value of H5Tequal
- 4) links: name string difference of the linked value as default
- (refer to --follow-symlinks option).
+ Object comparison:
+ 1) Groups
+ First compares the names of member objects (relative path, from the
+ specified group) and generates a report of objects that appear in only
+ one group or in both groups. Common objects are then compared recursively.
+ 2) Datasets
+ Array rank and dimensions, datatypes, and data values are compared.
+ 3) Datatypes
+ The comparison is based on the return value of H5Tequal.
+ 4) Symbolic links
+ The paths to the target objects are compared.
+ (The option --follow-symlinks overrides the default behavior when
+ symbolic links are compared.).
Exit code:
0 if no differences, 1 if differences found, 2 if error
diff --git a/tools/h5diff/testfiles/h5diff_612.txt b/tools/h5diff/testfiles/h5diff_612.txt
index 8c6051e..6141495 100644
--- a/tools/h5diff/testfiles/h5diff_612.txt
+++ b/tools/h5diff/testfiles/h5diff_612.txt
@@ -1,5 +1,5 @@
<-p -4> is not a valid option
-usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
+usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
file1 File name of the first HDF5 file
file2 File name of the second HDF5 file
[obj1] Name of an HDF5 object, in absolute path
@@ -70,16 +70,26 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
-v Verbose mode: print the above plus a list of objects and warnings
-q Quiet mode: do not print output
- Compare criteria
- If no objects [obj1[obj2]] are specified, h5diff only compares objects
- with the same absolute path in both files
+ File comparison:
+ If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as
+ a comparison of the two files' root groups. That is, h5diff first compares
+ the names of root group members, generates a report of root group objects
+ that appear in only one file or in both files, and recursively compares
+ common objects.
- The compare criteria is:
- 1) datasets: numerical array differences
- 2) groups: name string difference
- 3) datatypes: the return value of H5Tequal
- 4) links: name string difference of the linked value as default
- (refer to --follow-symlinks option).
+ Object comparison:
+ 1) Groups
+ First compares the names of member objects (relative path, from the
+ specified group) and generates a report of objects that appear in only
+ one group or in both groups. Common objects are then compared recursively.
+ 2) Datasets
+ Array rank and dimensions, datatypes, and data values are compared.
+ 3) Datatypes
+ The comparison is based on the return value of H5Tequal.
+ 4) Symbolic links
+ The paths to the target objects are compared.
+ (The option --follow-symlinks overrides the default behavior when
+ symbolic links are compared.).
Exit code:
0 if no differences, 1 if differences found, 2 if error
diff --git a/tools/h5diff/testfiles/h5diff_615.txt b/tools/h5diff/testfiles/h5diff_615.txt
index b713c7b..eaa2078 100644
--- a/tools/h5diff/testfiles/h5diff_615.txt
+++ b/tools/h5diff/testfiles/h5diff_615.txt
@@ -1,5 +1,5 @@
<-p 0x1> is not a valid option
-usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
+usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
file1 File name of the first HDF5 file
file2 File name of the second HDF5 file
[obj1] Name of an HDF5 object, in absolute path
@@ -70,16 +70,26 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
-v Verbose mode: print the above plus a list of objects and warnings
-q Quiet mode: do not print output
- Compare criteria
- If no objects [obj1[obj2]] are specified, h5diff only compares objects
- with the same absolute path in both files
+ File comparison:
+ If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as
+ a comparison of the two files' root groups. That is, h5diff first compares
+ the names of root group members, generates a report of root group objects
+ that appear in only one file or in both files, and recursively compares
+ common objects.
- The compare criteria is:
- 1) datasets: numerical array differences
- 2) groups: name string difference
- 3) datatypes: the return value of H5Tequal
- 4) links: name string difference of the linked value as default
- (refer to --follow-symlinks option).
+ Object comparison:
+ 1) Groups
+ First compares the names of member objects (relative path, from the
+ specified group) and generates a report of objects that appear in only
+ one group or in both groups. Common objects are then compared recursively.
+ 2) Datasets
+ Array rank and dimensions, datatypes, and data values are compared.
+ 3) Datatypes
+ The comparison is based on the return value of H5Tequal.
+ 4) Symbolic links
+ The paths to the target objects are compared.
+ (The option --follow-symlinks overrides the default behavior when
+ symbolic links are compared.).
Exit code:
0 if no differences, 1 if differences found, 2 if error
diff --git a/tools/h5diff/testfiles/h5diff_621.txt b/tools/h5diff/testfiles/h5diff_621.txt
index ee23b90..8319db9 100644
--- a/tools/h5diff/testfiles/h5diff_621.txt
+++ b/tools/h5diff/testfiles/h5diff_621.txt
@@ -1,5 +1,5 @@
<-n -4> is not a valid option
-usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
+usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
file1 File name of the first HDF5 file
file2 File name of the second HDF5 file
[obj1] Name of an HDF5 object, in absolute path
@@ -70,16 +70,26 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
-v Verbose mode: print the above plus a list of objects and warnings
-q Quiet mode: do not print output
- Compare criteria
- If no objects [obj1[obj2]] are specified, h5diff only compares objects
- with the same absolute path in both files
+ File comparison:
+ If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as
+ a comparison of the two files' root groups. That is, h5diff first compares
+ the names of root group members, generates a report of root group objects
+ that appear in only one file or in both files, and recursively compares
+ common objects.
- The compare criteria is:
- 1) datasets: numerical array differences
- 2) groups: name string difference
- 3) datatypes: the return value of H5Tequal
- 4) links: name string difference of the linked value as default
- (refer to --follow-symlinks option).
+ Object comparison:
+ 1) Groups
+ First compares the names of member objects (relative path, from the
+ specified group) and generates a report of objects that appear in only
+ one group or in both groups. Common objects are then compared recursively.
+ 2) Datasets
+ Array rank and dimensions, datatypes, and data values are compared.
+ 3) Datatypes
+ The comparison is based on the return value of H5Tequal.
+ 4) Symbolic links
+ The paths to the target objects are compared.
+ (The option --follow-symlinks overrides the default behavior when
+ symbolic links are compared.).
Exit code:
0 if no differences, 1 if differences found, 2 if error
diff --git a/tools/h5diff/testfiles/h5diff_622.txt b/tools/h5diff/testfiles/h5diff_622.txt
index 11e2ce1..1ccff92 100644
--- a/tools/h5diff/testfiles/h5diff_622.txt
+++ b/tools/h5diff/testfiles/h5diff_622.txt
@@ -1,5 +1,5 @@
<-n 0> is not a valid option
-usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
+usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
file1 File name of the first HDF5 file
file2 File name of the second HDF5 file
[obj1] Name of an HDF5 object, in absolute path
@@ -70,16 +70,26 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
-v Verbose mode: print the above plus a list of objects and warnings
-q Quiet mode: do not print output
- Compare criteria
- If no objects [obj1[obj2]] are specified, h5diff only compares objects
- with the same absolute path in both files
+ File comparison:
+ If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as
+ a comparison of the two files' root groups. That is, h5diff first compares
+ the names of root group members, generates a report of root group objects
+ that appear in only one file or in both files, and recursively compares
+ common objects.
- The compare criteria is:
- 1) datasets: numerical array differences
- 2) groups: name string difference
- 3) datatypes: the return value of H5Tequal
- 4) links: name string difference of the linked value as default
- (refer to --follow-symlinks option).
+ Object comparison:
+ 1) Groups
+ First compares the names of member objects (relative path, from the
+ specified group) and generates a report of objects that appear in only
+ one group or in both groups. Common objects are then compared recursively.
+ 2) Datasets
+ Array rank and dimensions, datatypes, and data values are compared.
+ 3) Datatypes
+ The comparison is based on the return value of H5Tequal.
+ 4) Symbolic links
+ The paths to the target objects are compared.
+ (The option --follow-symlinks overrides the default behavior when
+ symbolic links are compared.).
Exit code:
0 if no differences, 1 if differences found, 2 if error
diff --git a/tools/h5diff/testfiles/h5diff_623.txt b/tools/h5diff/testfiles/h5diff_623.txt
index f87d6db..2c15d98 100644
--- a/tools/h5diff/testfiles/h5diff_623.txt
+++ b/tools/h5diff/testfiles/h5diff_623.txt
@@ -1,5 +1,5 @@
<-n u> is not a valid option
-usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
+usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
file1 File name of the first HDF5 file
file2 File name of the second HDF5 file
[obj1] Name of an HDF5 object, in absolute path
@@ -70,16 +70,26 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
-v Verbose mode: print the above plus a list of objects and warnings
-q Quiet mode: do not print output
- Compare criteria
- If no objects [obj1[obj2]] are specified, h5diff only compares objects
- with the same absolute path in both files
+ File comparison:
+ If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as
+ a comparison of the two files' root groups. That is, h5diff first compares
+ the names of root group members, generates a report of root group objects
+ that appear in only one file or in both files, and recursively compares
+ common objects.
- The compare criteria is:
- 1) datasets: numerical array differences
- 2) groups: name string difference
- 3) datatypes: the return value of H5Tequal
- 4) links: name string difference of the linked value as default
- (refer to --follow-symlinks option).
+ Object comparison:
+ 1) Groups
+ First compares the names of member objects (relative path, from the
+ specified group) and generates a report of objects that appear in only
+ one group or in both groups. Common objects are then compared recursively.
+ 2) Datasets
+ Array rank and dimensions, datatypes, and data values are compared.
+ 3) Datatypes
+ The comparison is based on the return value of H5Tequal.
+ 4) Symbolic links
+ The paths to the target objects are compared.
+ (The option --follow-symlinks overrides the default behavior when
+ symbolic links are compared.).
Exit code:
0 if no differences, 1 if differences found, 2 if error
diff --git a/tools/h5diff/testfiles/h5diff_624.txt b/tools/h5diff/testfiles/h5diff_624.txt
index 4c9da26..272b9fc 100644
--- a/tools/h5diff/testfiles/h5diff_624.txt
+++ b/tools/h5diff/testfiles/h5diff_624.txt
@@ -1,5 +1,5 @@
<-n 0x1> is not a valid option
-usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
+usage: h5diff [OPTIONS] file1 file2 [obj1[ obj2]]
file1 File name of the first HDF5 file
file2 File name of the second HDF5 file
[obj1] Name of an HDF5 object, in absolute path
@@ -70,16 +70,26 @@ usage: h5diff [OPTIONS] file1 file2 [obj1[obj2]]
-v Verbose mode: print the above plus a list of objects and warnings
-q Quiet mode: do not print output
- Compare criteria
- If no objects [obj1[obj2]] are specified, h5diff only compares objects
- with the same absolute path in both files
+ File comparison:
+ If no objects [obj1[ obj2]] are specified, the h5diff comparison proceeds as
+ a comparison of the two files' root groups. That is, h5diff first compares
+ the names of root group members, generates a report of root group objects
+ that appear in only one file or in both files, and recursively compares
+ common objects.
- The compare criteria is:
- 1) datasets: numerical array differences
- 2) groups: name string difference
- 3) datatypes: the return value of H5Tequal
- 4) links: name string difference of the linked value as default
- (refer to --follow-symlinks option).
+ Object comparison:
+ 1) Groups
+ First compares the names of member objects (relative path, from the
+ specified group) and generates a report of objects that appear in only
+ one group or in both groups. Common objects are then compared recursively.
+ 2) Datasets
+ Array rank and dimensions, datatypes, and data values are compared.
+ 3) Datatypes
+ The comparison is based on the return value of H5Tequal.
+ 4) Symbolic links
+ The paths to the target objects are compared.
+ (The option --follow-symlinks overrides the default behavior when
+ symbolic links are compared.).
Exit code:
0 if no differences, 1 if differences found, 2 if error
diff --git a/tools/h5diff/testfiles/h5diff_exclude1-1.h5 b/tools/h5diff/testfiles/h5diff_exclude1-1.h5
new file mode 100644
index 0000000..8b675ea
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_exclude1-1.h5
Binary files differ
diff --git a/tools/h5diff/testfiles/h5diff_exclude1-2.h5 b/tools/h5diff/testfiles/h5diff_exclude1-2.h5
new file mode 100644
index 0000000..78854cd
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_exclude1-2.h5
Binary files differ
diff --git a/tools/h5diff/testfiles/h5diff_exclude2-1.h5 b/tools/h5diff/testfiles/h5diff_exclude2-1.h5
new file mode 100644
index 0000000..8923111
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_exclude2-1.h5
Binary files differ
diff --git a/tools/h5diff/testfiles/h5diff_exclude2-2.h5 b/tools/h5diff/testfiles/h5diff_exclude2-2.h5
new file mode 100644
index 0000000..9e42007
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_exclude2-2.h5
Binary files differ
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse1.h5 b/tools/h5diff/testfiles/h5diff_grp_recurse1.h5
new file mode 100644
index 0000000..cfd4e62
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_grp_recurse1.h5
Binary files differ
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse2.h5 b/tools/h5diff/testfiles/h5diff_grp_recurse2.h5
new file mode 100644
index 0000000..54bcdec
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_grp_recurse2.h5
Binary files differ
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse_ext1.h5 b/tools/h5diff/testfiles/h5diff_grp_recurse_ext1.h5
new file mode 100644
index 0000000..12a534a
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_grp_recurse_ext1.h5
Binary files differ
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5 b/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5
new file mode 100644
index 0000000..5bb02df
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-1.h5
Binary files differ
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5 b/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5
new file mode 100644
index 0000000..312543e
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-2.h5
Binary files differ
diff --git a/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5 b/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5
new file mode 100644
index 0000000..43ad156
--- /dev/null
+++ b/tools/h5diff/testfiles/h5diff_grp_recurse_ext2-3.h5
Binary files differ
diff --git a/tools/h5diff/testh5diff.sh b/tools/h5diff/testh5diff.sh
index 12cf0f8..df793f0 100755
--- a/tools/h5diff/testh5diff.sh
+++ b/tools/h5diff/testh5diff.sh
@@ -56,6 +56,20 @@ FILE19=h5diff_dset_idx1.h5
FILE20=h5diff_dset_idx2.h5
DANGLE_LINK_FILE1=h5diff_danglelinks1.h5
DANGLE_LINK_FILE2=h5diff_danglelinks2.h5
+/* group recursive */
+GRP_RECURSE_FILE1=h5diff_grp_recurse1.h5
+GRP_RECURSE_FILE2=h5diff_grp_recurse2.h5
+/* group recursive - same structure via external links through files */
+GRP_RECURSE1_EXT=h5diff_grp_recurse_ext1.h5
+GRP_RECURSE2_EXT1=h5diff_grp_recurse_ext2-1.h5
+GRP_RECURSE2_EXT2=h5diff_grp_recurse_ext2-2.h5
+GRP_RECURSE2_EXT3=h5diff_grp_recurse_ext2-3.h5
+# same structure, same obj name with different value
+EXCLUDE_FILE1_1=h5diff_exclude1-1.h5
+EXCLUDE_FILE1_2=h5diff_exclude1-2.h5
+# different structure and obj names
+EXCLUDE_FILE2_1=h5diff_exclude2-1.h5
+EXCLUDE_FILE2_2=h5diff_exclude2-2.h5
TESTNAME=h5diff
EXIT_SUCCESS=0
@@ -307,7 +321,6 @@ SKIP() {
# # Common usage
# ############################################################################
-
# 1.0
TOOLTEST h5diff_10.txt -h
@@ -427,6 +440,9 @@ TOOLTEST h5diff_58.txt -v $FILE7 $FILE8 refreg
# 6.0: Check if the command line number of arguments is less than 3
TOOLTEST h5diff_600.txt $FILE1
+# 6.1: Check if non-exist object name is specified
+TOOLTEST h5diff_601.txt $FILE1 $FILE1 nono_obj
+
# ##############################################################################
# # -d
@@ -696,6 +712,75 @@ TOOLTEST h5diff_459.txt --follow-symlinks -v --no-dangling-links $FILE15 $FILE
# ##############################################################################
+# # test for group diff recursivly
+# ##############################################################################
+# root
+TOOLTEST h5diff_500.txt -v $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 / /
+TOOLTEST h5diff_501.txt -v --follow-symlinks $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 / /
+
+# root vs group
+TOOLTEST h5diff_502.txt -v $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 / /grp1/grp2/grp3
+
+# group vs group (same name and structure)
+TOOLTEST h5diff_503.txt -v $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /grp1 /grp1
+
+# group vs group (different name and structure)
+TOOLTEST h5diff_504.txt -v $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /grp1/grp2 /grp1/grp2/grp3
+
+# groups vs soft-link
+TOOLTEST h5diff_505.txt -v $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /grp1 /slink_grp1
+TOOLTEST h5diff_506.txt -v --follow-symlinks $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /grp1/grp2 /slink_grp2
+
+# groups vs ext-link
+TOOLTEST h5diff_507.txt -v $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /grp1 /elink_grp1
+TOOLTEST h5diff_508.txt -v --follow-symlinks $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /grp1 /elink_grp1
+
+# soft-link vs ext-link
+TOOLTEST h5diff_509.txt -v $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /slink_grp1 /elink_grp1
+TOOLTEST h5diff_510.txt -v --follow-symlinks $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /slink_grp1 /elink_grp1
+
+# circled ext links
+TOOLTEST h5diff_511.txt -v $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /grp10 /grp11
+TOOLTEST h5diff_512.txt -v --follow-symlinks $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /grp10 /grp11
+
+# circled soft2ext-link vs soft2ext-link
+TOOLTEST h5diff_513.txt -v $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /slink_grp10 /slink_grp11
+TOOLTEST h5diff_514.txt -v --follow-symlinks $GRP_RECURSE_FILE1 $GRP_RECURSE_FILE2 /slink_grp10 /slink_grp11
+
+###############################################################################
+# Test for group recursive diff via multi-linked external links
+# With follow-symlinks, file $GRP_RECURSE1_EXT and $GRP_RECURSE2_EXT1 should
+# be same with the external links.
+###############################################################################
+# file vs file
+TOOLTEST h5diff_515.txt -v $GRP_RECURSE1_EXT $GRP_RECURSE2_EXT1
+TOOLTEST h5diff_516.txt -v --follow-symlinks $GRP_RECURSE1_EXT $GRP_RECURSE2_EXT1
+# group vs group
+TOOLTEST h5diff_517.txt -v $GRP_RECURSE1_EXT $GRP_RECURSE2_EXT1 /g1
+TOOLTEST h5diff_518.txt -v --follow-symlinks $GRP_RECURSE1_EXT $GRP_RECURSE2_EXT1 /g1
+
+# ##############################################################################
+# # Exclude objects (--exclude-path)
+# ##############################################################################
+#
+# Same structure, same names and different value.
+#
+# Exclude the object with different value. Expect return - same
+TOOLTEST h5diff_480.txt -v --exclude-path /group1/dset3 $EXCLUDE_FILE1_1 $EXCLUDE_FILE1_2
+# Verify different by not excluding. Expect return - diff
+TOOLTEST h5diff_481.txt -v $EXCLUDE_FILE1_1 $EXCLUDE_FILE1_2
+
+#
+# Different structure, different names.
+#
+# Exclude all the different objects. Expect return - same
+TOOLTEST h5diff_482.txt -v --exclude-path "/group1" --exclude-path "/dset1" $EXCLUDE_FILE2_1 $EXCLUDE_FILE2_2
+# Exclude only some different objects. Expect return - diff
+TOOLTEST h5diff_483.txt -v --exclude-path "/group1" $EXCLUDE_FILE2_1 $EXCLUDE_FILE2_2
+
+
+
+# ##############################################################################
# # END
# ##############################################################################