diff options
author | Dana Robinson <derobins@hdfgroup.org> | 2020-08-25 15:21:43 (GMT) |
---|---|---|
committer | Dana Robinson <derobins@hdfgroup.org> | 2020-08-25 15:21:43 (GMT) |
commit | 973360ae33336d8e3c7e050a82c873c3e5bcc47f (patch) | |
tree | 532b511cc84e02b27f090c1bb641e718ce634e15 /tools | |
parent | 27c7d1aca86797436c2121f112c2d8928b2c8ff4 (diff) | |
download | hdf5-973360ae33336d8e3c7e050a82c873c3e5bcc47f.zip hdf5-973360ae33336d8e3c7e050a82c873c3e5bcc47f.tar.gz hdf5-973360ae33336d8e3c7e050a82c873c3e5bcc47f.tar.bz2 |
Brings tools VFD changes from hdf5_1_10
Diffstat (limited to 'tools')
-rw-r--r-- | tools/CMakeLists.txt | 8 | ||||
-rw-r--r-- | tools/Makefile.am | 2 | ||||
-rw-r--r-- | tools/Makefile.in | 4 | ||||
-rw-r--r-- | tools/lib/h5tools_utils.c | 137 | ||||
-rw-r--r-- | tools/lib/h5tools_utils.h | 2 | ||||
-rw-r--r-- | tools/libtest/Makefile.am | 13 | ||||
-rw-r--r-- | tools/libtest/h5tools_test_utils.c | 1615 |
7 files changed, 665 insertions, 1116 deletions
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index f453ad5..57173a6 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -9,11 +9,5 @@ add_subdirectory (src) #-- Add the tests if (BUILD_TESTING) add_subdirectory (test) - -# -------------------------------------------------------------------- -# If S3 or HDFS enabled, then we need to test the tools library -# -------------------------------------------------------------------- - if (HDF5_ENABLE_ROS3_VFD OR HDF5_ENABLE_HDFS) - add_subdirectory (libtest) - endif () + add_subdirectory (libtest) endif () diff --git a/tools/Makefile.am b/tools/Makefile.am index 4a59121..3e62c8d 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -20,7 +20,7 @@ include $(top_srcdir)/config/commence.am if BUILD_TESTS_CONDITIONAL - TESTSERIAL_DIR =test + TESTSERIAL_DIR =test libtest else TESTSERIAL_DIR= endif diff --git a/tools/Makefile.in b/tools/Makefile.in index a2a28d2..720eeb2 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -384,7 +384,7 @@ am__set_b = \ *) \ b='$*';; \ esac -DIST_SUBDIRS = lib src test +DIST_SUBDIRS = lib src test libtest am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/bin/test-driver \ $(top_srcdir)/config/commence.am \ $(top_srcdir)/config/conclude.am COPYING @@ -745,7 +745,7 @@ TRACE = perl $(top_srcdir)/bin/trace # *.clog and *.clog2 are from the MPE option. CHECK_CLEANFILES = *.chkexe *.chklog *.clog *.clog2 @BUILD_TESTS_CONDITIONAL_FALSE@TESTSERIAL_DIR = -@BUILD_TESTS_CONDITIONAL_TRUE@TESTSERIAL_DIR = test +@BUILD_TESTS_CONDITIONAL_TRUE@TESTSERIAL_DIR = test libtest CONFIG = ordered # All subdirectories diff --git a/tools/lib/h5tools_utils.c b/tools/lib/h5tools_utils.c index 27c5ad1..cc9270b 100644 --- a/tools/lib/h5tools_utils.c +++ b/tools/lib/h5tools_utils.c @@ -388,8 +388,6 @@ get_option(int argc, const char **argv, const char *opts, const struct long_opti * Programmer: Jacob Smith * 2017-11-10 * - * Changes: None. - * ***************************************************************************** */ herr_t @@ -1087,7 +1085,6 @@ h5tools_parse_ros3_fapl_tuple(const char *tuple_str, int delim, { const char *ccred[3]; unsigned nelems = 0; - char *start = NULL; char *s3cred_src = NULL; char **s3cred = NULL; herr_t ret_value = SUCCEED; @@ -1104,14 +1101,12 @@ h5tools_parse_ros3_fapl_tuple(const char *tuple_str, int delim, ccred[1] = (const char *)s3cred[1]; ccred[2] = (const char *)s3cred[2]; - if (0 == h5tools_populate_ros3_fapl(fapl_config_out, ccred)) + if (h5tools_populate_ros3_fapl(fapl_config_out, ccred) < 0) H5TOOLS_GOTO_ERROR(FAIL, "failed to populate S3 VFD FAPL config"); done: - if (s3cred) - HDfree(s3cred); - if (s3cred_src) - HDfree(s3cred_src); + HDfree(s3cred); + HDfree(s3cred_src); return ret_value; } @@ -1145,7 +1140,7 @@ done: * * Return: * - * 0 (failure) if... + * FAIL if... * * Read-Only S3 VFD is not enabled. * * NULL fapl pointer: (NULL, {...} ) * * Warning: In all cases below, fapl will be set as "default" @@ -1162,7 +1157,7 @@ done: * * (&fa, {"...", "", "...") * * Any string would overflow allowed space in fapl definition. * or - * 1 (success) + * SUCCEED * * Sets components in fapl_t pointer, copying strings as appropriate. * * "Default" fapl (valid version, authenticate->False, empty strings) * * `values` pointer is NULL @@ -1179,126 +1174,46 @@ done: * *---------------------------------------------------------------------------- */ -int -h5tools_populate_ros3_fapl(H5FD_ros3_fapl_t *fa, - const char **values) +herr_t +h5tools_populate_ros3_fapl(H5FD_ros3_fapl_t *fa, const char **values) { - int show_progress = 0; /* set to 1 for debugging */ - int ret_value = 1; /* 1 for success, 0 for failure */ - /* e.g.? if (!populate()) { then failed } */ - - if (show_progress) { - HDprintf("called h5tools_populate_ros3_fapl\n"); - } + herr_t ret_value = SUCCEED; - if (fa == NULL) { - if (show_progress) { - HDprintf(" ERROR: null pointer to fapl_t\n"); - } - ret_value = 0; - goto done; - } + if (fa == NULL) + H5TOOLS_GOTO_ERROR(FAIL, "fa cannot be NULL"); - if (show_progress) { - HDprintf(" preset fapl with default values\n"); - } fa->version = H5FD_CURR_ROS3_FAPL_T_VERSION; fa->authenticate = FALSE; *(fa->aws_region) = '\0'; *(fa->secret_id) = '\0'; *(fa->secret_key) = '\0'; - /* sanity-check supplied values - */ + /* Sanity checks */ if (values != NULL) { - if (values[0] == NULL) { - if (show_progress) { - HDprintf(" ERROR: aws_region value cannot be NULL\n"); - } - ret_value = 0; - goto done; - } - if (values[1] == NULL) { - if (show_progress) { - HDprintf(" ERROR: secret_id value cannot be NULL\n"); - } - ret_value = 0; - goto done; - } - if (values[2] == NULL) { - if (show_progress) { - HDprintf(" ERROR: secret_key value cannot be NULL\n"); - } - ret_value = 0; - goto done; - } + if (values[0] == NULL || values[1] == NULL || values[2] == NULL) + H5TOOLS_GOTO_ERROR(FAIL, "values data cannot be NULL"); /* if region and ID are supplied (key optional), write to fapl... * fail if value would overflow */ - if (*values[0] != '\0' && - *values[1] != '\0') - { - if (HDstrlen(values[0]) > H5FD_ROS3_MAX_REGION_LEN) { - if (show_progress) { - HDprintf(" ERROR: aws_region value too long\n"); - } - ret_value = 0; - goto done; - } - HDmemcpy(fa->aws_region, values[0], - (HDstrlen(values[0]) + 1)); - if (show_progress) { - HDprintf(" aws_region set\n"); - } + if (*values[0] != '\0' && *values[1] != '\0') { + if (HDstrlen(values[0]) > H5FD_ROS3_MAX_REGION_LEN) + H5TOOLS_GOTO_ERROR(FAIL, "can't exceed max region length"); + HDmemcpy(fa->aws_region, values[0], (HDstrlen(values[0]) + 1)); + if (HDstrlen(values[1]) > H5FD_ROS3_MAX_SECRET_ID_LEN) + H5TOOLS_GOTO_ERROR(FAIL, "can't exceed max secret ID length"); + HDmemcpy(fa->secret_id, values[1], (HDstrlen(values[1]) + 1)); - if (HDstrlen(values[1]) > H5FD_ROS3_MAX_SECRET_ID_LEN) { - if (show_progress) { - HDprintf(" ERROR: secret_id value too long\n"); - } - ret_value = 0; - goto done; - } - HDmemcpy(fa->secret_id, - values[1], - (HDstrlen(values[1]) + 1)); - if (show_progress) { - HDprintf(" secret_id set\n"); - } - - if (HDstrlen(values[2]) > H5FD_ROS3_MAX_SECRET_KEY_LEN) { - if (show_progress) { - HDprintf(" ERROR: secret_key value too long\n"); - } - ret_value = 0; - goto done; - } - HDmemcpy(fa->secret_key, - values[2], - (HDstrlen(values[2]) + 1)); - if (show_progress) { - HDprintf(" secret_key set\n"); - } + if (HDstrlen(values[2]) > H5FD_ROS3_MAX_SECRET_KEY_LEN) + H5TOOLS_GOTO_ERROR(FAIL, "can't exceed max secret key length"); + HDmemcpy(fa->secret_key, values[2], (HDstrlen(values[2]) + 1)); fa->authenticate = TRUE; - if (show_progress) { - HDprintf(" set to authenticate\n"); - } - - } else if (*values[0] != '\0' || - *values[1] != '\0' || - *values[2] != '\0') - { - if (show_progress) { - HDprintf( - " ERROR: invalid assortment of empty/non-empty values\n" - ); - } - ret_value = 0; - goto done; } - } /* values != NULL */ + else if (*values[0] != '\0' || *values[1] != '\0' || *values[2] != '\0') + H5TOOLS_GOTO_ERROR(FAIL, "all values cannot be empty strings"); + } done: return ret_value; diff --git a/tools/lib/h5tools_utils.h b/tools/lib/h5tools_utils.h index 17dff7e..6fe0a75 100644 --- a/tools/lib/h5tools_utils.h +++ b/tools/lib/h5tools_utils.h @@ -175,7 +175,7 @@ H5TOOLS_DLL int h5tools_getenv_update_hyperslab_bufsize(void); #ifdef H5_HAVE_ROS3_VFD H5TOOLS_DLL herr_t h5tools_parse_ros3_fapl_tuple(const char *tuple_str, int delim, H5FD_ros3_fapl_t *fapl_config_out); -H5TOOLS_DLL int h5tools_populate_ros3_fapl(H5FD_ros3_fapl_t *fa, const char **values); +H5TOOLS_DLL herr_t h5tools_populate_ros3_fapl(H5FD_ros3_fapl_t *fa, const char **values); #endif /* H5_HAVE_ROS3_VFD */ #ifdef H5_HAVE_LIBHDFS H5TOOLS_DLL herr_t h5tools_parse_hdfs_fapl_tuple(const char *tuple_str, int delim, diff --git a/tools/libtest/Makefile.am b/tools/libtest/Makefile.am index a93e25d..0dc18e9 100644 --- a/tools/libtest/Makefile.am +++ b/tools/libtest/Makefile.am @@ -20,15 +20,14 @@ include $(top_srcdir)/config/commence.am # Include src and tools/lib directories -AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib - -# All programs depend on the hdf5 and h5tools libraries -LDADD=$(LIBH5TOOLS) $(LIBHDF5) +AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/test -I$(top_srcdir)/tools/lib +#test programs +TEST_PROG=h5tools_test_utils -# main target -bin_PROGRAMS=h5tools_test_utils -# check_PROGRAMS=$(TEST_PROG) +check_PROGRAMS=$(TEST_PROG) +# All programs depend on the hdf5 and h5tools libraries +LDADD=$(LIBH5TOOLS) $(LIBH5TEST) $(LIBHDF5) include $(top_srcdir)/config/conclude.am diff --git a/tools/libtest/h5tools_test_utils.c b/tools/libtest/h5tools_test_utils.c index 8faa4c6..dbc22d2 100644 --- a/tools/libtest/h5tools_test_utils.c +++ b/tools/libtest/h5tools_test_utils.c @@ -20,660 +20,434 @@ #include "h5tools_utils.h" #include "h5test.h" -#define UTIL_TEST_DEBUG 0 - -#ifndef __js_test__ - -#define __js_test__ 1L - -/***************************************************************************** - * - * FILE-LOCAL TESTING MACROS - * - * Purpose: - * - * 1. Upon test failure, goto-jump to single-location teardown in test - * function. E.g., `error:` (consistency with HDF corpus) or - * `failed:` (reflects purpose). - * >>> using "error", in part because `H5E_BEGIN_TRY` expects it. - * 2. Increase clarity and reduce overhead found with `TEST_ERROR`. - * e.g., "if(somefunction(arg, arg2) < 0) TEST_ERROR:" - * requires reading of entire line to know whether this if/call is - * part of the test setup, test operation, or a test unto itself. - * 3. Provide testing macros with optional user-supplied failure message; - * if not supplied (NULL), generate comparison output in the spirit of - * test-driven development. E.g., "expected 5 but was -3" - * User messages clarify test's purpose in code, encouraging description - * without relying on comments. - * 4. Configurable expected-actual order in generated comparison strings. - * Some prefer `VERIFY(expected, actual)`, others - * `VERIFY(actual, expected)`. Provide preprocessor ifdef switch - * to satifsy both parties, assuming one paradigm per test file. - * (One could #undef and redefine the flag through the file as desired, - * but _why_.) - * - * Provided as courtesy, per consideration for inclusion in the library - * proper. - * - * Macros: - * - * JSVERIFY_EXP_ACT - ifdef flag, configures comparison order - * FAIL_IF() - check condition - * FAIL_UNLESS() - check _not_ condition - * JSVERIFY() - long-int equality check; prints reason/comparison - * JSVERIFY_NOT() - long-int inequality check; prints - * JSVERIFY_STR() - string equality check; prints - * - * Programmer: Jacob Smith - * 2017-10-24 - * - *****************************************************************************/ - - -/*---------------------------------------------------------------------------- - * - * ifdef flag: JSVERIFY_EXP_ACT - * - * JSVERIFY macros accept arguments as (EXPECTED, ACTUAL[, reason]) - * default, if this is undefined, is (ACTUAL, EXPECTED[, reason]) - * - *---------------------------------------------------------------------------- - */ -#define JSVERIFY_EXP_ACT 1L - - -/*---------------------------------------------------------------------------- - * - * Macro: JSFAILED_AT() - * - * Purpose: - * - * Preface a test failure by printing "*FAILED*" and location to stdout - * Similar to `H5_FAILED(); AT();` from h5test.h - * - * *FAILED* at somefile.c:12 in function_name()... - * - * Programmer: Jacob Smith - * 2017-10-24 - * - *---------------------------------------------------------------------------- - */ -#define JSFAILED_AT() { \ - HDprintf("*FAILED* at %s:%d in %s()...\n", __FILE__, __LINE__, FUNC); \ -} - - -/*---------------------------------------------------------------------------- - * - * Macro: FAIL_IF() - * - * Purpose: - * - * Make tests more accessible and less cluttered than - * `if (thing == otherthing()) TEST_ERROR` - * paradigm. - * - * The following lines are roughly equivalent: - * - * `if (myfunc() < 0) TEST_ERROR;` (as seen elsewhere in HDF tests) - * `FAIL_IF(myfunc() < 0)` - * - * Prints a generic "FAILED AT" line to stdout and jumps to `error`, - * similar to `TEST_ERROR` in h5test.h - * - * Programmer: Jacob Smith - * 2017-10-23 - * - *---------------------------------------------------------------------------- - */ -#define FAIL_IF(condition) \ -if (condition) { \ - JSFAILED_AT() \ - goto error; \ -} - - -/*---------------------------------------------------------------------------- - * - * Macro: FAIL_UNLESS() - * - * Purpose: - * - * TEST_ERROR wrapper to reduce cognitive overhead from "negative tests", - * e.g., "a != b". - * - * Opposite of FAIL_IF; fails if the given condition is _not_ true. - * - * `FAIL_IF( 5 != my_op() )` - * is equivalent to - * `FAIL_UNLESS( 5 == my_op() )` - * However, `JSVERIFY(5, my_op(), "bad return")` may be even clearer. - * (see JSVERIFY) - * - * Programmer: Jacob Smith - * 2017-10-24 - * - *---------------------------------------------------------------------------- - */ -#define FAIL_UNLESS(condition) \ -if (!(condition)) { \ - JSFAILED_AT() \ - goto error; \ -} - - -/*---------------------------------------------------------------------------- - * - * Macro: JSERR_LONG() - * - * Purpose: - * - * Print an failure message for long-int arguments. - * ERROR-AT printed first. - * If `reason` is given, it is printed on own line and newlined after - * else, prints "expected/actual" aligned on own lines. - * - * *FAILED* at myfile.c:488 in somefunc()... - * forest must be made of trees. - * - * or - * - * *FAILED* at myfile.c:488 in somefunc()... - * ! Expected 425 - * ! Actual 3 - * - * Programmer: Jacob Smith - * 2017-10-24 - * - *---------------------------------------------------------------------------- - */ -#define JSERR_LONG(expected, actual, reason) { \ - JSFAILED_AT() \ - if (reason!= NULL) { \ - HDprintf("%s\n", (reason)); \ - } else { \ - HDprintf(" ! Expected %ld\n ! Actual %ld\n", \ - (long)(expected), (long)(actual)); \ - } \ -} - - -/*---------------------------------------------------------------------------- - * - * Macro: JSERR_STR() - * - * Purpose: - * - * Print an failure message for string arguments. - * ERROR-AT printed first. - * If `reason` is given, it is printed on own line and newlined after - * else, prints "expected/actual" aligned on own lines. - * - * *FAILED* at myfile.c:421 in myfunc()... - * Blue and Red strings don't match! - * - * or - * - * *FAILED* at myfile.c:421 in myfunc()... - * !!! Expected: - * this is my expected - * string - * !!! Actual: - * not what I expected at all - * - * Programmer: Jacob Smith - * 2017-10-24 - * - *---------------------------------------------------------------------------- - */ -#define JSERR_STR(expected, actual, reason) { \ - JSFAILED_AT() \ - if ((reason) != NULL) { \ - HDprintf("%s\n", (reason)); \ - } else { \ - HDprintf("!!! Expected:\n%s\n!!!Actual:\n%s\n", \ - (expected), (actual)); \ - } \ -} - -#ifdef JSVERIFY_EXP_ACT - - -/*---------------------------------------------------------------------------- - * - * Macro: JSVERIFY() - * - * Purpose: - * - * Verify that two long integers are equal. - * If unequal, print failure message - * (with `reason`, if not NULL; expected/actual if NULL) - * and jump to `error` at end of function - * - * Programmer: Jacob Smith - * 2017-10-24 - * - *---------------------------------------------------------------------------- - */ -#define JSVERIFY(expected, actual, reason) \ -if ((long)(actual) != (long)(expected)) { \ - JSERR_LONG((expected), (actual), (reason)) \ - goto error; \ -} /* JSVERIFY */ - - -/*---------------------------------------------------------------------------- - * - * Macro: JSVERIFY_NOT() - * - * Purpose: - * - * Verify that two long integers are _not_ equal. - * If equal, print failure message - * (with `reason`, if not NULL; expected/actual if NULL) - * and jump to `error` at end of function - * - * Programmer: Jacob Smith - * 2017-10-24 - * - *---------------------------------------------------------------------------- - */ -#define JSVERIFY_NOT(expected, actual, reason) \ -if ((long)(actual) == (long)(expected)) { \ - JSERR_LONG((expected), (actual), (reason)) \ - goto error; \ -} /* JSVERIFY_NOT */ - - -/*---------------------------------------------------------------------------- - * - * Macro: JSVERIFY_STR() - * - * Purpose: - * - * Verify that two strings are equal. - * If unequal, print failure message - * (with `reason`, if not NULL; expected/actual if NULL) - * and jump to `error` at end of function - * - * Programmer: Jacob Smith - * 2017-10-24 - * - *---------------------------------------------------------------------------- - */ -#define JSVERIFY_STR(expected, actual, reason) \ -if (HDstrcmp((actual), (expected)) != 0) { \ - JSERR_STR((expected), (actual), (reason)); \ - goto error; \ -} /* JSVERIFY_STR */ - - -#else /* JSVERIFY_EXP_ACT not defined */ - /* Repeats macros above, but with actual/expected parameters reversed. */ - - -/*---------------------------------------------------------------------------- - * Macro: JSVERIFY() - * See: JSVERIFY documentation above. - * Programmer: Jacob Smith - * 2017-10-14 - *---------------------------------------------------------------------------- - */ -#define JSVERIFY(actual, expected, reason) \ -if ((long)(actual) != (long)(expected)) { \ - JSERR_LONG((expected), (actual), (reason)); \ - goto error; \ -} /* JSVERIFY */ - - -/*---------------------------------------------------------------------------- - * Macro: JSVERIFY_NOT() - * See: JSVERIFY_NOT documentation above. - * Programmer: Jacob Smith - * 2017-10-14 - *---------------------------------------------------------------------------- - */ -#define JSVERIFY_NOT(actual, expected, reason) \ -if ((long)(actual) == (long)(expected)) { \ - JSERR_LONG((expected), (actual), (reason)) \ - goto error; \ -} /* JSVERIFY_NOT */ - +/* Selector for which test cases to run */ +typedef enum vfd_tests_e { + VFD_TESTS_COMMON, + VFD_TESTS_ROS3, + VFD_TESTS_HDFS +} vfd_tests_e; + +/* Whether we pass in H5I_INVALID_HID, H5P_DEFAULT, or a created fapl */ +typedef enum fapl_choice_e { + FAPL_CHOICE_INVALID, + FAPL_CHOICE_DEFAULT, + FAPL_CHOICE_CREATE +} fapl_choice_e; + +/* Test case data */ +typedef struct fapl_testcase_t { + const char error_message[88]; + herr_t expected_result; + fapl_choice_e fapl_choice; + const char vfd_name[12]; + void *fa; +} fapl_testcase_t; + +/* Generic "incorrect" VFD struct */ +typedef struct other_fa_t { + int a; + int b; + int c; +} other_fa_t; + +other_fa_t wrong_fa_g = {0x432, 0xf82, 0x9093}; + +/******************************/ +/* Common test configurations */ +/******************************/ + +fapl_testcase_t common_cases_g[] = { + { "(common) H5I_INVALID_HID + NULL VFD struct (UNEXPECTED SUCCESS)", + FAIL, + FAPL_CHOICE_INVALID, + "", + NULL, + }, + { "(common) H5I_INVALID_HID + inappropriate VFD struct (UNEXPECTED SUCCESS)", + FAIL, + FAPL_CHOICE_INVALID, + "", + &wrong_fa_g, + }, + { "(common) H5P_DEFAULT + NULL VFD struct (FAILED)", + SUCCEED, + FAPL_CHOICE_DEFAULT, + "", + NULL, + }, + { "(common) H5P_DEFAULT + ignored VFD struct (FAILED)", + SUCCEED, + FAPL_CHOICE_DEFAULT, + "", + &wrong_fa_g, + }, + { "(common) H5Pcreate() + NULL VFD struct (FAILED)", + SUCCEED, + FAPL_CHOICE_CREATE, + "", + NULL, + }, + { "(common) H5Pcreate() + ignored VFD struct (FAILED)", + SUCCEED, + FAPL_CHOICE_CREATE, + "", + &wrong_fa_g, + }, + { "(common) H5P_DEFAULT + non-VFD name + NULL VFD struct (UNEXPECTED SUCCESS)", + FAIL, + FAPL_CHOICE_DEFAULT, + "unknown", + NULL, + } +}; -/*---------------------------------------------------------------------------- - * Macro: JSVERIFY_STR() - * See: JSVERIFY_STR documentation above. - * Programmer: Jacob Smith - * 2017-10-14 - *---------------------------------------------------------------------------- - */ -#define JSVERIFY_STR(actual, expected, reason) \ -if (HDstrcmp((actual), (expected)) != 0) { \ - JSERR_STR((expected), (actual), (reason)); \ - goto error; \ -} /* JSVERIFY_STR */ +#ifdef H5_HAVE_ROS3_VFD -#endif /* ifdef/else JSVERIFY_EXP_ACT */ +/****************************/ +/* ROS3 test configurations */ +/****************************/ + +H5FD_ros3_fapl_t ros3_anon_fa_g = {1, FALSE, "", "", ""}; + +fapl_testcase_t ros3_cases_g[] = { + { "(ROS3) H5I_INVALID_HID + NULL VFD struct (UNEXPECTED SUCCESS)", + FAIL, + FAPL_CHOICE_INVALID, + "ros3", + NULL, + }, + { "(ROS3) H5I_INVALID_HID + valid VFD struct (UNEXPECTED SUCCESS)", + FAIL, + FAPL_CHOICE_INVALID, + "ros3", + &ros3_anon_fa_g, + }, + { "(ROS3) H5Pcreate() + NULL VFD struct (UNEXPECTED SUCCESS)", + FAIL, + FAPL_CHOICE_CREATE, + "ros3", + NULL, + }, + { "(ROS3) H5Pcreate() + valid VFD struct (FAILED)", + SUCCEED, + FAPL_CHOICE_CREATE, + "ros3", + &ros3_anon_fa_g, + }, + { "(ROS3) H5P_DEFAULT + valid VFD struct (FAILED)", + SUCCEED, + FAPL_CHOICE_DEFAULT, + "ros3", + &ros3_anon_fa_g, + } +}; +#endif /* H5_HAVE_ROS3_VFD */ -#endif /* __js_test__ */ +#ifdef H5_HAVE_LIBHDFS -/* if > 0, be very verbose when performing tests */ -#define H5TOOLS_UTILS_TEST_DEBUG 0 +/****************************/ +/* HDFS test configurations */ +/****************************/ + +H5FD_hdfs_fapl_t hdfs_fa_g = { + 1, /* fapl version */ + "", /* namenode name */ + 0, /* namenode port */ + "", /* kerberos ticket cache */ + "", /* user name */ + 2048, /* stream buffer size */ +}; + +fapl_testcase_t hdfs_cases_g[] = { + { "(HDFS) H5I_INVALID_HID + NULL VFD struct (UNEXPECTED SUCCESS)", + FAIL, + FAPL_CHOICE_INVALID, + "hdfs", + NULL, + }, + { "(HDFS) H5I_INVALID_HID + valid VFD struct (UNEXPECTED SUCCESS)", + FAIL, + FAPL_CHOICE_INVALID, + "hdfs", + &hdfs_fa_g, + }, + { "(HDFS) H5Pcreate() + NULL VFD struct (UNEXPECTED SUCCESS)", + FAIL, + FAPL_CHOICE_CREATE, + "hdfs", + NULL, + }, + { "(HDFS) H5Pcreate() + valid VFD struct (FAILED)", + SUCCEED, + FAPL_CHOICE_CREATE, + "hdfs", + &hdfs_fa_g, + }, + { "(HDFS) H5P_DEFAULT + valid VFD struct (FAILED)", + SUCCEED, + FAPL_CHOICE_DEFAULT, + "hdfs", + &hdfs_fa_g, + } +}; +#endif /* H5_HAVE_LIBHDFS */ -/******************/ -/* TEST FUNCTIONS */ -/******************/ +typedef struct tuple_testcase_t { + const char *test_msg; /* info about test case */ + const char *in_str; /* input string */ + int sep; /* separator "character" */ + herr_t expected_result; /* expected SUCCEED / FAIL */ + unsigned exp_nelems; /* expected number of elements */ + /* (no more than 7!) */ + const char *exp_elems[7]; /* list of elements (no more than 7!) */ +} tuple_testcase_t; + +tuple_testcase_t tuple_cases_g[] = { + { "bad start", + "words(before)", + ';', + FAIL, + 0, + {NULL}, + }, + { "tuple not closed", + "(not ok", + ',', + FAIL, + 0, + {NULL}, + }, + { "empty tuple", + "()", + '-', + SUCCEED, + 1, + {""}, + }, + { "no separator", + "(stuff keeps on going)", + ',', + SUCCEED, + 1, + {"stuff keeps on going"}, + }, + { "4-ple, escaped seperator", + "(elem0,elem1,el\\,em2,elem3)", /* "el\,em" */ + ',', + SUCCEED, + 4, + {"elem0", "elem1", "el,em2", "elem3"}, + }, + { "5-ple, escaped escaped separator", + "(elem0,elem1,el\\\\,em2,elem3)", + ',', + SUCCEED, + 5, + {"elem0", "elem1", "el\\", "em2", "elem3"}, + }, + { "escaped non-comma separator", + "(5-2-7-2\\-6-2)", + '-', + SUCCEED, + 5, + {"5","2","7","2-6","2"}, + }, + { "embedded close-paren", + "(be;fo)re)", + ';', + SUCCEED, + 2, + {"be", "fo)re"}, + }, + { "embedded non-escaping backslash", + "(be;fo\\re)", + ';', + SUCCEED, + 2, + {"be", "fo\\re"}, + }, + { "double close-paren at end", + "(be;fore))", + ';', + SUCCEED, + 2, + {"be", "fore)"}, + }, + { "empty elements", + "(;a1;;a4;)", + ';', + SUCCEED, + 5, + {"", "a1", "", "a4", ""}, + }, + { "nested tuples with different separators", + "((4,e,a);(6,2,a))", + ';', + SUCCEED, + 2, + {"(4,e,a)","(6,2,a)"}, + }, + { "nested tuples with same separators", + "((4,e,a),(6,2,a))", + ',', + SUCCEED, + 6, + {"(4","e","a)","(6","2","a)"}, + }, + { "real-world use case", + "(us-east-2,AKIAIMC3D3XLYXLN5COA,ugs5aVVnLFCErO/8uW14iWE3K5AgXMpsMlWneO/+)", + ',', + SUCCEED, + 3, + {"us-east-2", + "AKIAIMC3D3XLYXLN5COA", + "ugs5aVVnLFCErO/8uW14iWE3K5AgXMpsMlWneO/+"}, + } +}; /*---------------------------------------------------------------------------- * - * Function: test_parse_tuple() - * - * Purpose: + * Function: test_parse_tuple() * - * Provide unit tests and specification for the `parse_tuple()` function. + * Purpose: Provide unit tests and specification for the `parse_tuple()` + * function. * - * Return: + * Return: SUCCEED/FAIL * - * 0 Tests passed. - * 1 Tests failed. - * - * Programmer: Jacob Smith - * 2017-11-11 - * - * Changes: None. + * Programmer: Jacob Smith + * 2017-11-11 * *---------------------------------------------------------------------------- */ -static unsigned +static herr_t test_parse_tuple(void) { - /************************* - * TEST-LOCAL STRUCTURES * - *************************/ - - struct testcase { - const char *test_msg; /* info about test case */ - const char *in_str; /* input string */ - int sep; /* separator "character" */ - herr_t exp_ret; /* expected SUCCEED / FAIL */ - unsigned exp_nelems; /* expected number of elements */ - /* (no more than 7!) */ - const char *exp_elems[7]; /* list of elements (no more than 7!) */ - }; - - /****************** - * TEST VARIABLES * - ******************/ - - struct testcase cases[] = { - { "bad start", - "words(before)", - ';', - FAIL, - 0, - {NULL}, - }, - { "tuple not closed", - "(not ok", - ',', - FAIL, - 0, - {NULL}, - }, - { "empty tuple", - "()", - '-', - SUCCEED, - 1, - {""}, - }, - { "no separator", - "(stuff keeps on going)", - ',', - SUCCEED, - 1, - {"stuff keeps on going"}, - }, - { "4-ple, escaped seperator", - "(elem0,elem1,el\\,em2,elem3)", /* "el\,em" */ - ',', - SUCCEED, - 4, - {"elem0", "elem1", "el,em2", "elem3"}, - }, - { "5-ple, escaped escaped separator", - "(elem0,elem1,el\\\\,em2,elem3)", - ',', - SUCCEED, - 5, - {"elem0", "elem1", "el\\", "em2", "elem3"}, - }, - { "escaped non-comma separator", - "(5-2-7-2\\-6-2)", - '-', - SUCCEED, - 5, - {"5","2","7","2-6","2"}, - }, - { "embedded close-paren", - "(be;fo)re)", - ';', - SUCCEED, - 2, - {"be", "fo)re"}, - }, - { "embedded non-escaping backslash", - "(be;fo\\re)", - ';', - SUCCEED, - 2, - {"be", "fo\\re"}, - }, - { "double close-paren at end", - "(be;fore))", - ';', - SUCCEED, - 2, - {"be", "fore)"}, - }, - { "empty elements", - "(;a1;;a4;)", - ';', - SUCCEED, - 5, - {"", "a1", "", "a4", ""}, - }, - { "nested tuples with different separators", - "((4,e,a);(6,2,a))", - ';', - SUCCEED, - 2, - {"(4,e,a)","(6,2,a)"}, - }, - { "nested tuples with same separators", - "((4,e,a),(6,2,a))", - ',', - SUCCEED, - 6, - {"(4","e","a)","(6","2","a)"}, - }, - { "real-world use case", - "(us-east-2,AKIAIMC3D3XLYXLN5COA,ugs5aVVnLFCErO/8uW14iWE3K5AgXMpsMlWneO/+)", - ',', - SUCCEED, - 3, - {"us-east-2", - "AKIAIMC3D3XLYXLN5COA", - "ugs5aVVnLFCErO/8uW14iWE3K5AgXMpsMlWneO/+"}, - } - }; - struct testcase tc; - unsigned n_tests = 14; - unsigned i = 0; - unsigned count = 0; - unsigned elem_i = 0; - char **parsed = NULL; - char *cpy = NULL; - herr_t success = TRUE; - hbool_t show_progress = FALSE; - - + tuple_testcase_t tc; + unsigned n_tests = 14; + unsigned u = 0; + unsigned count = 0; + unsigned elem_u = 0; + char **parsed = NULL; + char *cpy = NULL; + herr_t ret; TESTING("arbitrary-count tuple parsing"); -#if H5TOOLS_UTILS_TEST_DEBUG > 0 - show_progress = TRUE; -#endif /* H5TOOLS_UTILS_TEST_DEBUG */ + for (u = 0; u < n_tests; u++) { - /********* - * TESTS * - *********/ + tc = tuple_cases_g[u]; - for (i = 0; i < n_tests; i++) { - - /* SETUP - */ - HDassert(parsed == NULL); - HDassert(cpy == NULL); - tc = cases[i]; - if (show_progress == TRUE) { - HDprintf("testing %d: %s...\n", i, tc.test_msg); - } + ret = parse_tuple(tc.in_str, tc.sep, &cpy, &count, &parsed); - /* VERIFY - */ - success = parse_tuple(tc.in_str, tc.sep, &cpy, &count, &parsed); + if(tc.expected_result != ret) + FAIL_PUTS_ERROR("unexpected result from parse_tuple()") + if(tc.exp_nelems != count) + FAIL_PUTS_ERROR("incorrect number of elements returned from parse_tupble()") - JSVERIFY( tc.exp_ret, success, "function returned incorrect value" ) - JSVERIFY( tc.exp_nelems, count, NULL ) - if (success == SUCCEED) { - FAIL_IF( parsed == NULL ) - for (elem_i = 0; elem_i < count; elem_i++) { - JSVERIFY_STR( tc.exp_elems[elem_i], parsed[elem_i], NULL ) + if (ret == SUCCEED) { + /* Successful return case checks */ + if (NULL == parsed) + FAIL_PUTS_ERROR("parsed pointer should not be NULL on success"); + for (elem_u = 0; elem_u < count; elem_u++) { + if (HDstrcmp(tc.exp_elems[elem_u], parsed[elem_u])) + FAIL_PUTS_ERROR("Bad elements detected") } - /* TEARDOWN */ - HDassert(parsed != NULL); - HDassert(cpy != NULL); - HDfree(parsed); - parsed = NULL; - HDfree(cpy); - cpy = NULL; - } else { - FAIL_IF( parsed != NULL ) - } /* if parse_tuple() == SUCCEED or no */ + } + else { + /* Failed return case checks */ + if(parsed != NULL) + FAIL_PUTS_ERROR("should not have returned elements on failure") + } + + HDfree(cpy); + HDfree(parsed); } /* for each testcase */ PASSED(); - return 0; + return SUCCEED; error: - /*********** - * CLEANUP * - ***********/ + HDfree(parsed); + HDfree(cpy); - if (parsed != NULL) HDfree(parsed); - if (cpy != NULL) HDfree(cpy); - - return 1; + return FAIL; } /* test_parse_tuple */ /*---------------------------------------------------------------------------- * - * Function: test_populate_ros3_fa() - * - * Purpose: Verify behavior of `populate_ros3_fa()` + * Function: test_populate_ros3_fa() * - * Return: 0 if test passes - * 1 if failure + * Purpose: Verify behavior of `populate_ros3_fa()` * - * Programmer: Jacob Smith - * 2017-11-13 + * Return: SUCCEED/FAIL * - * Changes: None + * Programmer: Jacob Smith + * 2017-11-13 * *---------------------------------------------------------------------------- */ -static unsigned +#ifdef H5_HAVE_ROS3_VFD +static herr_t test_populate_ros3_fa(void) { -#ifdef H5_HAVE_ROS3_VFD - /************************* - * TEST-LOCAL STRUCTURES * - *************************/ - - /************************ - * TEST-LOCAL VARIABLES * - ************************/ - - hbool_t show_progress = FALSE; int bad_version = 0xf87a; /* arbitrarily wrong version number */ -#endif /* H5_HAVE_ROS3_VFD */ - TESTING("programmatic ros3 fapl population"); - -#ifndef H5_HAVE_ROS3_VFD - HDputs(" -SKIP-"); - HDputs(" Read-Only S3 VFD not enabled"); - HDfflush(stdout); - return 0; -#else -#if H5TOOLS_UTILS_TEST_DEBUG > 0 - show_progress = TRUE; -#endif /* H5TOOLS_UTILS_TEST_DEBUG */ + TESTING("ros3 fapl population"); HDassert(bad_version != H5FD_CURR_ROS3_FAPL_T_VERSION); - /********* - * TESTS * - *********/ - - /* NULL fapl config pointer fails - */ + /* NULL fapl config pointer fails */ { const char *values[] = {"x", "y", "z"}; - if (show_progress) { HDprintf("NULL fapl pointer\n"); } - - JSVERIFY( 0, h5tools_populate_ros3_fapl(NULL, values), - "fapl pointer cannot be null" ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(NULL, values)) + TEST_ERROR } - /* NULL values pointer yields default fapl - */ + /* NULL values pointer yields default fapl */ { H5FD_ros3_fapl_t fa = {bad_version, TRUE, "u", "v", "w"}; - if (show_progress) { HDprintf("NULL values pointer\n"); } - - JSVERIFY( 1, h5tools_populate_ros3_fapl(&fa, NULL), - "NULL values pointer yields \"default\" fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should PASS */ + if (FAIL == h5tools_populate_ros3_fapl(&fa, NULL)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } - /* all-empty values - * yields default fapl - */ + /* all-empty values yields default fapl */ { H5FD_ros3_fapl_t fa = {bad_version, TRUE, "u", "v", "w"}; const char *values[] = {"", "", ""}; - if (show_progress) { HDprintf("all empty values\n"); } - - JSVERIFY( 1, h5tools_populate_ros3_fapl(&fa, values), - "empty values yields \"default\" fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should PASS */ + if (FAIL == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* successfully set fapl with values @@ -683,55 +457,70 @@ test_populate_ros3_fa(void) H5FD_ros3_fapl_t fa = {bad_version, FALSE, "a", "b", "c"}; const char *values[] = {"x", "y", "z", "a"}; - if (show_progress) { HDprintf("successful full set\n"); } - - JSVERIFY( 1, h5tools_populate_ros3_fapl(&fa, values), - "four values" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( TRUE, fa.authenticate, NULL ) - JSVERIFY_STR( "x", fa.aws_region, NULL ) - JSVERIFY_STR( "y", fa.secret_id, NULL ) - JSVERIFY_STR( "z", fa.secret_key, NULL ) + /* Should PASS */ + if (FAIL == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != TRUE) + TEST_ERROR + if (HDstrcmp("x", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("y", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("z", fa.secret_key)) + TEST_ERROR } /* NULL region - * yeilds default fapl + * yields default fapl */ { H5FD_ros3_fapl_t fa = {bad_version, FALSE, "a", "b", "c"}; const char *values[] = {NULL, "y", "z", NULL}; - if (show_progress) { HDprintf("NULL region\n"); } - - JSVERIFY( 0, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* empty region - * yeilds default fapl + * yields default fapl */ { H5FD_ros3_fapl_t fa = {bad_version, FALSE, "a", "b", "c"}; const char *values[] = {"", "y", "z", NULL}; - if (show_progress) { HDprintf("empty region; non-empty id, key\n"); } - - JSVERIFY( 0, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* region overflow - * yeilds default fapl + * yields default fapl */ { H5FD_ros3_fapl_t fa = {bad_version, FALSE, "a", "b", "c"}; @@ -741,17 +530,22 @@ test_populate_ros3_fa(void) "y", "z"}; - if (show_progress) { HDprintf("region overflow\n"); } - HDassert(HDstrlen(values[0]) > H5FD_ROS3_MAX_REGION_LEN); - JSVERIFY( 0, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* NULL id @@ -761,33 +555,43 @@ test_populate_ros3_fa(void) H5FD_ros3_fapl_t fa = {bad_version, FALSE, "a", "b", "c"}; const char *values[] = {"x", NULL, "z", NULL}; - if (show_progress) { HDprintf("NULL id\n"); } - - JSVERIFY( 0, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* empty id (non-empty region, key) - * yeilds default fapl + * yields default fapl */ { H5FD_ros3_fapl_t fa = {bad_version, FALSE, "a", "b", "c"}; const char *values[] = {"x", "", "z", NULL}; - if (show_progress) { HDprintf("empty id; non-empty region and key\n"); } - - JSVERIFY( 0, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* id overflow @@ -809,17 +613,22 @@ test_populate_ros3_fa(void) "Can you separate the various parts of the problem?", "z"}; - if (show_progress) { HDprintf("id overflow\n"); } - HDassert(HDstrlen(values[1]) > H5FD_ROS3_MAX_SECRET_ID_LEN); - JSVERIFY( 0, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "x", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("x", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* NULL key @@ -829,69 +638,89 @@ test_populate_ros3_fa(void) H5FD_ros3_fapl_t fa = {bad_version, FALSE, "a", "b", "c"}; const char *values[] = {"x", "y", NULL, NULL}; - if (show_progress) { HDprintf("NULL key\n"); } - - JSVERIFY( 0, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* empty key (non-empty region, id) - * yeilds authenticating fapl + * yields authenticating fapl */ { H5FD_ros3_fapl_t fa = {bad_version, FALSE, "a", "b", "c"}; const char *values[] = {"x", "y", "", NULL}; - if (show_progress) { HDprintf("empty key; non-empty region and id\n"); } - - JSVERIFY( 1, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( TRUE, fa.authenticate, NULL ) - JSVERIFY_STR( "x", fa.aws_region, NULL ) - JSVERIFY_STR( "y", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should PASS */ + if (FAIL == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != TRUE) + TEST_ERROR + if (HDstrcmp("x", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("y", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* empty key, region (non-empty id) - * yeilds default fapl + * yields default fapl */ { H5FD_ros3_fapl_t fa = {bad_version, FALSE, "a", "b", "c"}; const char *values[] = {"", "y", "", NULL}; - if (show_progress) { HDprintf("empty key and region; non-empty id\n"); } - - JSVERIFY( 0, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* empty key, id (non-empty region) - * yeilds default fapl + * yields default fapl */ { H5FD_ros3_fapl_t fa = {bad_version, FALSE, "a", "b", "c"}; const char *values[] = {"x", "", "", NULL}; - if (show_progress) { HDprintf("empty key and id; non-empty region\n"); } - - JSVERIFY( 0, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "", fa.aws_region, NULL ) - JSVERIFY_STR( "", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* key overflow @@ -913,17 +742,22 @@ test_populate_ros3_fa(void) "What are the boundaries of the problem? " \ "Can you separate the various parts of the problem?"}; - if (show_progress) { HDprintf("key overflow\n"); } - HDassert(HDstrlen(values[2]) > H5FD_ROS3_MAX_SECRET_KEY_LEN); - JSVERIFY( 0, h5tools_populate_ros3_fapl(&fa, values), - "could not fill fapl" ) - JSVERIFY( H5FD_CURR_ROS3_FAPL_T_VERSION, fa.version, NULL ) - JSVERIFY( FALSE, fa.authenticate, NULL ) - JSVERIFY_STR( "x", fa.aws_region, NULL ) - JSVERIFY_STR( "y", fa.secret_id, NULL ) - JSVERIFY_STR( "", fa.secret_key, NULL ) + /* Should FAIL */ + if (SUCCEED == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != H5FD_CURR_ROS3_FAPL_T_VERSION) + TEST_ERROR + if (fa.authenticate != FALSE) + TEST_ERROR + if (HDstrcmp("x", fa.aws_region)) + TEST_ERROR + if (HDstrcmp("y", fa.secret_id)) + TEST_ERROR + if (HDstrcmp("", fa.secret_key)) + TEST_ERROR } /* use case @@ -935,340 +769,147 @@ test_populate_ros3_fa(void) "AKIAIMC3D3XLYXLN5COA", "ugs5aVVnLFCErO/8uW14iWE3K5AgXMpsMlWneO/+" }; - JSVERIFY( 1, - h5tools_populate_ros3_fapl(&fa, values), - "unable to set use case" ) - JSVERIFY( 1, fa.version, "version check" ) - JSVERIFY( 1, fa.authenticate, "should authenticate" ) + + /* Should PASS */ + if (FAIL == h5tools_populate_ros3_fapl(&fa, values)) + TEST_ERROR + + if (fa.version != 1) + TEST_ERROR + if (fa.authenticate != TRUE) + TEST_ERROR } PASSED(); - return 0; + return SUCCEED; -error : - /*********** - * CLEANUP * - ***********/ +error: - return 1; - -#endif /* H5_HAVE_ROS3_VFD */ + return FAIL; } /* test_populate_ros3_fa */ +#endif /* H5_HAVE_ROS3_VFD */ /*---------------------------------------------------------------------------- * - * Function: test_set_configured_fapl() - * - * Purpose: Verify `h5tools_get_fapl()` with ROS3 and HDFS VFDs + * Function: test_set_configured_fapl() * - * Return: 0 if test passes - * 1 if failure + * Purpose: Verify `h5tools_get_fapl()` with ROS3 and HDFS VFDs * - * Programmer: Jacob Smith - * 2018-07-12 + * Return: SUCCEED/FAIL * - * Changes: None + * Programmer: Jacob Smith + * 2018-07-12 * *---------------------------------------------------------------------------- */ -static unsigned -test_set_configured_fapl(void) +static herr_t +test_set_configured_fapl(vfd_tests_e test_type, fapl_testcase_t cases[], unsigned n_cases) { -#define UTIL_TEST_NOFAPL 1 -#define UTIL_TEST_DEFAULT 2 -#define UTIL_TEST_CREATE 3 - - /************************* - * TEST-LOCAL STRUCTURES * - *************************/ - typedef struct testcase { - const char message[88]; - int expected; - int fapl_choice; - const char vfdname[12]; - void *conf_fa; - } testcase; - - typedef struct other_fa_t { - int a; - int b; - int c; - } other_fa_t; - - /************************ - * TEST-LOCAL VARIABLES * - ************************/ - - hid_t fapl_id = H5I_INVALID_HID; - other_fa_t wrong_fa = {0x432, 0xf82, 0x9093}; -#ifdef H5_HAVE_ROS3_VFD - H5FD_ros3_fapl_t ros3_anon_fa = {1, FALSE, "", "", ""}; - H5FD_ros3_fapl_t ros3_auth_fa = { - 1, /* fapl version */ - TRUE, /* authenticate */ - "us-east-1", /* aws region */ - "12345677890abcdef", /* simulate access key ID */ - "oiwnerwe9u0234nJw0-aoj+dsf", /* simulate secret key */ - }; -#endif /* H5_HAVE_ROS3_VFD */ -#ifdef H5_HAVE_LIBHDFS - H5FD_hdfs_fapl_t hdfs_fa = { - 1, /* fapl version */ - "", /* namenode name */ - 0, /* namenode port */ - "", /* kerberos ticket cache */ - "", /* user name */ - 2048, /* stream buffer size */ - }; -#endif /* H5_HAVE_LIBHDFS */ - unsigned n_cases = 7; /* number of common testcases */ - testcase cases[] = { - { "(common) should fail: no fapl id", - 0, - UTIL_TEST_NOFAPL, - "", - NULL, - }, - { "(common) should fail: no fapl id (with struct)", - 0, - UTIL_TEST_NOFAPL, - "", - &wrong_fa, - }, - { "(common) H5P_DEFAULT with no struct should succeed", - 1, - UTIL_TEST_DEFAULT, - "", - NULL, - }, - { "(common) H5P_DEFAULT with (ignored) struct should succeed", - 1, - UTIL_TEST_DEFAULT, - "", - &wrong_fa, - }, - { "(common) provided fapl entry should not fail", - 1, - UTIL_TEST_CREATE, - "", - NULL, - }, - { "(common) provided fapl entry should not fail; ignores struct", - 1, - UTIL_TEST_CREATE, - "", - &wrong_fa, - }, - { "(common) should fail: unrecoginzed vfd name", - 0, - UTIL_TEST_DEFAULT, - "unknown", - NULL, - }, - -#ifdef H5_HAVE_ROS3_VFD - /* WARNING: add number of ROS3 test cases after array definition - */ - { "(ROS3) should fail: no fapl id, no struct", - 0, - UTIL_TEST_NOFAPL, - "ros3", - NULL, - }, - { "(ROS3) should fail: no fapl id", - 0, - UTIL_TEST_NOFAPL, - "ros3", - &ros3_anon_fa, - }, - { "(ROS3) should fail: no struct", - 0, - UTIL_TEST_CREATE, - "ros3", - NULL, - }, - { "(ROS3) successful set", - 1, - UTIL_TEST_CREATE, - "ros3", - &ros3_anon_fa, - }, - { "(ROS3) should fail: attempt to set DEFAULT fapl", - 0, - UTIL_TEST_DEFAULT, - "ros3", - &ros3_anon_fa, - }, -#endif /* H5_HAVE_ROS3_VFD */ - -#ifdef H5_HAVE_LIBHDFS - /* WARNING: add number of HDFS test cases after array definition - */ - { "(HDFS) should fail: no fapl id, no struct", - 0, - UTIL_TEST_NOFAPL, - "hdfs", - NULL, - }, - { "(HDFS) should fail: no fapl id", - 0, - UTIL_TEST_NOFAPL, - "hdfs", - &hdfs_fa, - }, - { "(HDFS) should fail: no struct", - 0, - UTIL_TEST_CREATE, - "hdfs", - NULL, - }, - { "(HDFS) successful set", - 1, - UTIL_TEST_CREATE, - "hdfs", - &hdfs_fa, - }, - { "(HDFS) should fail: attempt to set DEFAULT fapl", - 0, - UTIL_TEST_DEFAULT, - "hdfs", - &hdfs_fa, - }, -#endif /* H5_HAVE_LIBHDFS */ - - }; /* testcases `cases` array */ - unsigned int i; - -#ifdef H5_HAVE_ROS3_VFD - n_cases += 5; -#endif /* H5_HAVE_ROS3_VFD */ - -#ifdef H5_HAVE_LIBHDFS - n_cases += 5; -#endif /* H5_HAVE_LIBHDFS */ - - TESTING("programmatic fapl set"); - - for (i = 0; i < n_cases; i++) { + hid_t in_fapl_id = H5I_INVALID_HID; + hid_t out_fapl_id = H5I_INVALID_HID; + unsigned u; + + if (VFD_TESTS_COMMON == test_type) + TESTING("set fapl vfd (common)") + else if (VFD_TESTS_ROS3 == test_type) + TESTING("set fapl vfd (ros3)") + else if (VFD_TESTS_HDFS == test_type) + TESTING("set fapl vfd (hdfs)") + + /* Loop over all test cases */ + for (u = 0; u < n_cases; u++) { h5tools_vfd_info_t vfd_info; - hid_t result; - testcase C = cases[i]; - - fapl_id = H5I_INVALID_HID; - -#if UTIL_TEST_DEBUG - HDfprintf(stderr, "setup test %d\t%s\n", i, C.message); fflush(stderr); -#endif /* UTIL_TEST_DEBUG */ + fapl_testcase_t tc = cases[u]; - /* per-test setup */ - if (C.fapl_choice == UTIL_TEST_DEFAULT) { - fapl_id = H5P_DEFAULT; - } else if (C.fapl_choice == UTIL_TEST_CREATE) { - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - FAIL_IF( fapl_id < 0 ) + /* Setup */ + if (tc.fapl_choice == FAPL_CHOICE_DEFAULT) { + in_fapl_id = H5P_DEFAULT; + } + else if (tc.fapl_choice == FAPL_CHOICE_CREATE) { + if(H5I_INVALID_HID == (in_fapl_id = H5Pcreate(H5P_FILE_ACCESS))) + TEST_ERROR } - -#if UTIL_TEST_DEBUG - HDfprintf(stderr, "before test\n"); fflush(stderr); -#endif /* UTIL_TEST_DEBUG */ - - /* test */ - vfd_info.info = C.conf_fa; - vfd_info.name = C.vfdname; - result = h5tools_get_fapl(H5P_DEFAULT, &vfd_info); - if (C.expected == 0) - JSVERIFY( result, H5I_INVALID_HID, C.message) else - JSVERIFY_NOT( result, H5I_INVALID_HID, C.message) - -#if UTIL_TEST_DEBUG - HDfprintf(stderr, "after test\n"); fflush(stderr); -#endif /* UTIL_TEST_DEBUG */ - - /* per-test-teardown */ - if (fapl_id > 0) { - FAIL_IF( FAIL == H5Pclose(fapl_id) ) + in_fapl_id = H5I_INVALID_HID; + + /* Test */ + if(!HDstrcmp("", tc.vfd_name)) + out_fapl_id = h5tools_get_fapl(in_fapl_id, NULL); + else { + vfd_info.info = tc.fa; + vfd_info.name = tc.vfd_name; + out_fapl_id = h5tools_get_fapl(in_fapl_id, &vfd_info); } - fapl_id = H5I_INVALID_HID; -#if UTIL_TEST_DEBUG - HDfprintf(stderr, "after cleanup\n"); fflush(stderr); -#endif /* UTIL_TEST_DEBUG */ + /* Check */ + if ((tc.expected_result == FAIL && H5I_INVALID_HID != out_fapl_id) || + (tc.expected_result == SUCCEED && H5I_INVALID_HID == out_fapl_id)) + FAIL_PUTS_ERROR(tc.error_message) + /* Close */ + if (tc.fapl_choice == FAPL_CHOICE_CREATE && H5Pclose(in_fapl_id) < 0) + TEST_ERROR + if (out_fapl_id != H5I_INVALID_HID && H5Pclose(out_fapl_id) < 0) + TEST_ERROR } -#if UTIL_TEST_DEBUG - HDfprintf(stderr, "after loop\n"); fflush(stderr); -#endif /* UTIL_TEST_DEBUG */ - PASSED(); - return 0; + return SUCCEED; error : - /*********** - * CLEANUP * - ***********/ - -#if UTIL_TEST_DEBUG - HDfprintf(stderr, "ERROR\n"); fflush(stderr); -#endif /* UTIL_TEST_DEBUG */ + H5E_BEGIN_TRY { + H5Pclose(in_fapl_id); + H5Pclose(out_fapl_id); + } H5E_END_TRY; - if (fapl_id > 0) { - (void)H5Pclose(fapl_id); - } - - return 1; - -#undef UTIL_TEST_NOFAPL -#undef UTIL_TEST_DEFAULT -#undef UTIL_TEST_CREATE + return FAIL; } /* test_set_configured_fapl */ /*---------------------------------------------------------------------------- * - * Function: main() - * - * Purpose: Run all test functions. + * Function: main() * - * Return: 0 iff all test pass - * 1 iff any failures + * Purpose: Run all test functions * - * Programmer: Jacob Smith - * 2017-11-10 + * Return: EXIT_FAILURE/EXIT_SUCCESS * - * Changes: None. + * Programmer: Jacob Smith + * 2017-11-10 * *---------------------------------------------------------------------------- */ int main(void) { - unsigned nerrors = 0; + int nerrors = 0; -#ifdef _H5TEST_ - h5reset(); /* h5test? */ -#endif /* _H5TEST_ */ + h5_reset(); - HDfprintf(stdout, "Testing h5tools_utils corpus.\n"); + HDprintf("Testing tools VFD functionality.\n"); - nerrors += test_parse_tuple(); - nerrors += test_populate_ros3_fa(); - nerrors += test_set_configured_fapl(); + nerrors += test_parse_tuple() < 0 ? 1 : 0; + nerrors += test_set_configured_fapl(VFD_TESTS_COMMON, common_cases_g, 7) < 0 ? 1 : 0; +#ifdef H5_HAVE_ROS3_VFD + nerrors += test_populate_ros3_fa() < 0 ? 1 : 0; + nerrors += test_set_configured_fapl(VFD_TESTS_ROS3, ros3_cases_g, 5) < 0 ? 1 : 0; +#endif +#ifdef H5_HAVE_LIBHDFS + nerrors += test_set_configured_fapl(VFD_TESTS_HDFS, hdfs_cases_g, 5) < 0 ? 1 : 0; +#endif - if (nerrors > 0) { - HDfprintf(stdout, "***** %d h5tools_utils TEST%s FAILED! *****\n", - nerrors, - nerrors > 1 ? "S" : ""); - nerrors = 1; - } else { - HDfprintf(stdout, "All h5tools_utils tests passed\n"); + if(nerrors) { + HDprintf("***** %d tools VFD TEST%s FAILED! *****\n", + nerrors, nerrors > 1 ? "S" : ""); + return EXIT_FAILURE; } - return (int)nerrors; + HDprintf("All tools VFD tests passed.\n"); + + return EXIT_SUCCESS; -} /* main */ +} /* end main() */ |