summaryrefslogtreecommitdiffstats
path: root/tools/h5diff
diff options
context:
space:
mode:
Diffstat (limited to 'tools/h5diff')
-rw-r--r--tools/h5diff/CMakeLists.txt57
-rw-r--r--tools/h5diff/h5diff_common.c31
-rw-r--r--tools/h5diff/h5diffgentest.c463
-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_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_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_grp_recurse1.h5bin0 -> 11826 bytes
-rw-r--r--tools/h5diff/testfiles/h5diff_grp_recurse2.h5bin0 -> 11826 bytes
-rwxr-xr-xtools/h5diff/testh5diff.sh44
43 files changed, 1422 insertions, 186 deletions
diff --git a/tools/h5diff/CMakeLists.txt b/tools/h5diff/CMakeLists.txt
index 820c3d0..c31f650 100644
--- a/tools/h5diff/CMakeLists.txt
+++ b/tools/h5diff/CMakeLists.txt
@@ -123,7 +123,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
@@ -174,6 +188,8 @@ IF (BUILD_TESTING)
h5diff_ext2softlink_trg.h5
h5diff_danglelinks1.h5
h5diff_danglelinks2.h5
+ h5diff_grp_recurse1.h5
+ h5diff_grp_recurse2.h5
)
FOREACH (txt_file ${HDF5_REFERENCE_FILES})
@@ -278,6 +294,8 @@ 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)
# ############################################################################
# # Common usage
@@ -402,6 +420,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
@@ -659,6 +680,42 @@ 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)
ENDIF (BUILD_TESTING)
diff --git a/tools/h5diff/h5diff_common.c b/tools/h5diff/h5diff_common.c
index 9b6037e..b897a7f 100644
--- a/tools/h5diff/h5diff_common.c
+++ b/tools/h5diff/h5diff_common.c
@@ -351,7 +351,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 +425,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 504c000..1f6cb2a 100644
--- a/tools/h5diff/h5diffgentest.c
+++ b/tools/h5diff/h5diffgentest.c
@@ -55,6 +55,8 @@
#define FILE18 "h5diff_ext2softlink_trg.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"
#define UIMAX 4294967295u /*Maximum value for a variable of type unsigned int */
#define STR_SIZE 3
@@ -99,6 +101,7 @@ 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);
/* 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);
@@ -148,6 +151,8 @@ int main(void)
test_dangle_links(DANGLE_LINK_FILE1, DANGLE_LINK_FILE2);
+ test_group_recurse(GRP_RECURSE_FILE1, GRP_RECURSE_FILE2);
+
return 0;
}
@@ -1829,6 +1834,464 @@ 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;
+}
+
+/*-------------------------------------------------------------------------
* 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_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_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_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/testh5diff.sh b/tools/h5diff/testh5diff.sh
index 421bf73..f9d58c2 100755
--- a/tools/h5diff/testh5diff.sh
+++ b/tools/h5diff/testh5diff.sh
@@ -54,6 +54,8 @@ FILE17=h5diff_ext2softlink_src.h5
FILE18=h5diff_ext2softlink_trg.h5
DANGLE_LINK_FILE1=h5diff_danglelinks1.h5
DANGLE_LINK_FILE2=h5diff_danglelinks2.h5
+GRP_RECURSE_FILE1=h5diff_grp_recurse1.h5
+GRP_RECURSE_FILE2=h5diff_grp_recurse2.h5
TESTNAME=h5diff
EXIT_SUCCESS=0
@@ -305,7 +307,6 @@ SKIP() {
# # Common usage
# ############################################################################
-
# 1.0
TOOLTEST h5diff_10.txt -h
@@ -425,6 +426,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
@@ -688,6 +692,44 @@ 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
+
+
+
+# ##############################################################################
# # END
# ##############################################################################