From ae5702bf6c6bf8b7979561dc5112284dbb5b7cf8 Mon Sep 17 00:00:00 2001 From: Dana Robinson <43805+derobins@users.noreply.github.com> Date: Sun, 19 Mar 2023 22:20:01 -0700 Subject: Bring mirror VFD test improvements from develop (#2597) --- src/H5FDmirror.c | 8 +- test/mirror_vfd.c | 2751 +++++++++++++++++--------------------- utils/mirror_vfd/mirror_server.c | 36 +- utils/mirror_vfd/mirror_writer.c | 37 +- 4 files changed, 1289 insertions(+), 1543 deletions(-) diff --git a/src/H5FDmirror.c b/src/H5FDmirror.c index 4b9991f..67872bc 100644 --- a/src/H5FDmirror.c +++ b/src/H5FDmirror.c @@ -242,13 +242,15 @@ H5FD_mirror_init(void) { hid_t ret_value = H5I_INVALID_HID; - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_NOAPI(H5I_INVALID_HID) LOG_OP_CALL(FUNC); - if (H5I_VFL != H5I_get_type(H5FD_MIRROR_g)) + if (H5I_VFL != H5I_get_type(H5FD_MIRROR_g)) { H5FD_MIRROR_g = H5FD_register(&H5FD_mirror_g, sizeof(H5FD_class_t), FALSE); - + if (H5I_INVALID_HID == H5FD_MIRROR_g) + HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register mirror"); + } ret_value = H5FD_MIRROR_g; done: diff --git a/test/mirror_vfd.c b/test/mirror_vfd.c index c6e9ef0..b4f4c2c 100644 --- a/test/mirror_vfd.c +++ b/test/mirror_vfd.c @@ -114,83 +114,57 @@ static herr_t _create_chunking_ids(hid_t file_id, unsigned min_dset, unsigned ma static herr_t _close_chunking_ids(unsigned min_dset, unsigned max_dset, hid_t *dataspace_ids, hid_t *filespace_ids, hid_t *dataset_ids, hid_t *memspace_id); -static herr_t _populate_filepath(const char *dirname, const char *_basename, hid_t fapl_id, char *path_out, - hbool_t h5suffix); +static herr_t populate_filepath(const char *dirname, const char *_basename, hid_t fapl_id, char *path_out, + hbool_t h5suffix); static hid_t create_mirroring_split_fapl(const char *_basename, struct mirrortest_filenames *names, const struct mt_opts *opts); -static void mybzero(void *dest, size_t size); - -/* ---------------------------------------------------------------------------- - * Function: mybzero - * - * Purpose: Have bzero simplicity and abstraction in (possible) absence of - * it being available. - * - * Programmer: Jacob Smith - * 2020-03-30 - * ---------------------------------------------------------------------------- - */ -static void -mybzero(void *dest, size_t size) -{ - size_t i = 0; - char *s = NULL; - HDassert(dest != NULL); - s = (char *)dest; - for (i = 0; i < size; i++) { - *(s + i) = 0; - } -} /* end mybzero() */ - /* ---------------------------------------------------------------------------- - * Function: _populate_filepath + * Function: populate_filepath * * Purpose: Given a directory name and a base name, concatenate the two and * run h5fixname() to get the "actual" path to the intended target. * `h5suffix' should be FALSE to keep the base name unaltered; * TRUE will append the '.h5' h5suffix to the basename... * FALSE -> h5fixname_no_suffix(), TRUE -> h5fixname() - * / / <_basename> + * / / * - * Programmer: Jacob Smith - * 2019-08-16 * ---------------------------------------------------------------------------- */ static herr_t -_populate_filepath(const char *dirname, const char *_basename, hid_t fapl_id, char *path_out, - hbool_t h5suffix) +populate_filepath(const char *dirname, const char *basename, hid_t fapl_id, char *path_out, hbool_t h5suffix) { - char _path[H5FD_SPLITTER_PATH_MAX]; + char *path = NULL; - if ((_basename == NULL) || (*_basename == 0) || (dirname == NULL) || (*dirname == 0) || - (path_out == NULL)) { + if ((basename == NULL) || (*basename == 0) || (dirname == NULL) || (*dirname == 0) || (path_out == NULL)) + TEST_ERROR; + + if (NULL == (path = HDcalloc(H5FD_SPLITTER_PATH_MAX, sizeof(char)))) TEST_ERROR; - } - if (HDsnprintf(_path, H5FD_SPLITTER_PATH_MAX, "%s%s%s", dirname, + if (HDsnprintf(path, H5FD_SPLITTER_PATH_MAX, "%s%s%s", dirname, (dirname[HDstrlen(dirname)] == '/') ? "" : "/", /* slash iff needed */ - _basename) > H5FD_SPLITTER_PATH_MAX) { + basename) > H5FD_SPLITTER_PATH_MAX) TEST_ERROR; - } if (h5suffix == TRUE) { - if (h5_fixname(_path, fapl_id, path_out, H5FD_SPLITTER_PATH_MAX) == NULL) { + if (h5_fixname(path, fapl_id, path_out, H5FD_SPLITTER_PATH_MAX) == NULL) TEST_ERROR; - } } else { - if (h5_fixname_no_suffix(_path, fapl_id, path_out, H5FD_SPLITTER_PATH_MAX) == NULL) { + if (h5_fixname_no_suffix(path, fapl_id, path_out, H5FD_SPLITTER_PATH_MAX) == NULL) TEST_ERROR; - } } + HDfree(path); + return SUCCEED; error: + HDfree(path); return FAIL; -} /* end _populate_filepath() */ +} /* end populate_filepath() */ /* --------------------------------------------------------------------------- * Function: build_paths @@ -199,39 +173,37 @@ error: * most mirror tests. * * Return: SUCCEED/FAIL - * - * Programmer: Jacob Smith - * 2019-08-16 * --------------------------------------------------------------------------- */ static herr_t -build_paths(const char *_basename, H5FD_splitter_vfd_config_t *splitter_config, +build_paths(const char *basename, H5FD_splitter_vfd_config_t *splitter_config, struct mirrortest_filenames *names) { - char baselogname[H5FD_SPLITTER_PATH_MAX]; + char *baselogname = NULL; - if (_populate_filepath(MIRROR_RW_DIR, _basename, splitter_config->rw_fapl_id, names->rw, TRUE) == FAIL) { + if (NULL == (baselogname = HDcalloc(H5FD_SPLITTER_PATH_MAX, sizeof(char)))) TEST_ERROR; - } - if (_populate_filepath(MIRROR_WO_DIR, _basename, splitter_config->wo_fapl_id, names->wo, TRUE) == FAIL) { + if (populate_filepath(MIRROR_RW_DIR, basename, splitter_config->rw_fapl_id, names->rw, TRUE) < 0) TEST_ERROR; - } - if (_basename == NULL || *_basename == 0) - return FAIL; - if (HDsnprintf(baselogname, H5FD_SPLITTER_PATH_MAX, "%s_err.log", _basename) > H5FD_SPLITTER_PATH_MAX) { + if (populate_filepath(MIRROR_WO_DIR, basename, splitter_config->wo_fapl_id, names->wo, TRUE) < 0) TEST_ERROR; - } - if (_populate_filepath(MIRROR_WO_DIR, baselogname, splitter_config->wo_fapl_id, names->log, FALSE) == - FAIL) { + if (basename == NULL || *basename == 0) + TEST_ERROR; + if (HDsnprintf(baselogname, H5FD_SPLITTER_PATH_MAX, "%s_err.log", basename) > H5FD_SPLITTER_PATH_MAX) + TEST_ERROR; + + if (populate_filepath(MIRROR_WO_DIR, baselogname, splitter_config->wo_fapl_id, names->log, FALSE) < 0) TEST_ERROR; - } + + HDfree(baselogname); return SUCCEED; error: + HDfree(baselogname); return FAIL; } /* end build_paths() */ @@ -242,15 +214,12 @@ error: * * Return: Success: 0 * Failure: -1 - * - * Programmer: Jacob Smith - * 2019-03-12 * --------------------------------------------------------------------------- */ static int test_fapl_configuration(void) { - hid_t fapl_id; + hid_t fapl_id = H5I_INVALID_HID; H5FD_mirror_fapl_t mirror_conf = { H5FD_MIRROR_FAPL_MAGIC, /* magic */ H5FD_MIRROR_CURR_FAPL_T_VERSION, /* version */ @@ -261,42 +230,39 @@ test_fapl_configuration(void) TESTING("Mirror fapl configuration (set/get)"); - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - if (H5I_INVALID_HID == fapl_id) { + if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) TEST_ERROR; - } - if (H5Pset_fapl_mirror(fapl_id, &mirror_conf) == FAIL) { + if (H5Pset_fapl_mirror(fapl_id, &mirror_conf) < 0) TEST_ERROR; - } - if (H5Pget_fapl_mirror(fapl_id, &fa_out) == FAIL) { + if (H5Pget_fapl_mirror(fapl_id, &fa_out) < 0) TEST_ERROR; - } - if (H5FD_MIRROR_FAPL_MAGIC != fa_out.magic) { + + if (H5FD_MIRROR_FAPL_MAGIC != fa_out.magic) TEST_ERROR; - } - if (H5FD_MIRROR_CURR_FAPL_T_VERSION != fa_out.version) { + + if (H5FD_MIRROR_CURR_FAPL_T_VERSION != fa_out.version) TEST_ERROR; - } - if (SERVER_HANDSHAKE_PORT != fa_out.handshake_port) { + + if (SERVER_HANDSHAKE_PORT != fa_out.handshake_port) TEST_ERROR; - } - if (HDstrncmp(SERVER_IP_ADDRESS, (const char *)fa_out.remote_ip, H5FD_MIRROR_MAX_IP_LEN)) { + + if (HDstrncmp(SERVER_IP_ADDRESS, (const char *)fa_out.remote_ip, H5FD_MIRROR_MAX_IP_LEN)) TEST_ERROR; - } - if (H5Pclose(fapl_id) == FAIL) { + if (H5Pclose(fapl_id) < 0) TEST_ERROR; - } PASSED(); return 0; error: - if (H5I_INVALID_HID != fapl_id) { - (void)H5Pclose(fapl_id); + H5E_BEGIN_TRY + { + H5Pclose(fapl_id); } + H5E_END_TRY; return -1; } /* end test_fapl_configuration() */ @@ -321,931 +287,904 @@ error: } \ } while (0); /* end PRINT_BUFFER_DIFF */ -/* --------------------------------------------------------------------------- - * Function: test_xmit_encode_decode - * - * Purpose: Test byte-encoding operations for network transport. - * - * Return: Success: 0 - * Failure: -1 - * - * Programmer: Jacob Smith - * 2020-02-02 - * --------------------------------------------------------------------------- - */ +/*******************************************/ +/* Encode/decode tests for various C types */ +/*******************************************/ + +/* Test uint8_t encode/decode */ static int -test_xmit_encode_decode(void) +test_encdec_uint8_t(void) { - H5FD_mirror_xmit_t xmit_mock; /* re-used header in various xmit tests */ + unsigned char buf[8]; + unsigned char expected[8]; + const uint8_t v = 200; + unsigned char out = 0; - TESTING("Mirror encode/decode of xmit elements"); + TESTING("Mirror encode/decode of uint8_t data"); - /* Set bogus values matching expected; encoding doesn't care - * Use sequential values to easily generate the expected buffer with a - * for loop. - */ - xmit_mock.magic = 0x00010203; - xmit_mock.version = 0x04; - xmit_mock.session_token = 0x05060708; - xmit_mock.xmit_count = 0x090A0B0C; - xmit_mock.op = 0x0D; + /* Start of buffer uint8_t */ + HDmemset(buf, 0, 8); + HDmemset(expected, 0, 8); + expected[0] = 200; + out = 0; + if (H5FD__mirror_xmit_encode_uint8(buf, v) != 1) + TEST_ERROR; + if (HDmemcmp(buf, expected, 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 8); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint8(&out, buf) != 1) + TEST_ERROR; + if (v != out) + TEST_ERROR; - /* Test uint8_t encode/decode - */ - do { - unsigned char buf[8]; - unsigned char expected[8]; - const uint8_t v = 200; - unsigned char out = 0; + /* Middle of buffer uint8_t */ + HDmemset(buf, 0, 8); + HDmemset(expected, 0, 8); + expected[3] = v; + out = 0; + if (H5FD__mirror_xmit_encode_uint8((buf + 3), v) != 1) + TEST_ERROR; + if (HDmemcmp(buf, expected, 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 8); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint8(&out, (buf + 3)) != 1) + TEST_ERROR; + if (v != out) + TEST_ERROR; - /* Start of buffer uint8_t - */ - mybzero(buf, 8); - mybzero(expected, 8); - expected[0] = 200; - out = 0; - if (H5FD__mirror_xmit_encode_uint8(buf, v) != 1) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 8); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint8(&out, buf) != 1) { - TEST_ERROR; - } - if (v != out) { - TEST_ERROR; - } + /* End of buffer uint8_t */ + HDmemset(buf, 0, 8); + HDmemset(expected, 0, 8); + expected[7] = v; + out = 0; + if (H5FD__mirror_xmit_encode_uint8((buf + 7), v) != 1) + TEST_ERROR; + if (HDmemcmp(buf, expected, 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 8); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint8(&out, (buf + 7)) != 1) + TEST_ERROR; + if (v != out) + TEST_ERROR; - /* Middle of buffer uint8_t - */ - mybzero(buf, 8); - mybzero(expected, 8); - expected[3] = v; - out = 0; - if (H5FD__mirror_xmit_encode_uint8((buf + 3), v) != 1) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 8); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint8(&out, (buf + 3)) != 1) { - TEST_ERROR; - } - if (v != out) { - TEST_ERROR; - } + PASSED(); + return 0; - /* End of buffer uint8_t - */ - mybzero(buf, 8); - mybzero(expected, 8); - expected[7] = v; - out = 0; - if (H5FD__mirror_xmit_encode_uint8((buf + 7), v) != 1) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 8); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint8(&out, (buf + 7)) != 1) { - TEST_ERROR; - } - if (v != out) { - TEST_ERROR; - } +error: + return -1; +} - } while (0); /* end uint8_t en/decode */ +/* Test uint16_t encode/decode */ +static int +test_encdec_uint16_t(void) +{ + unsigned char buf[8]; + unsigned char expected[8]; + const uint16_t v = 0x8F02; + uint16_t out = 0; - /* Test uint16_t encode/decode - */ - do { - unsigned char buf[8]; - unsigned char expected[8]; - const uint16_t v = 0x8F02; - uint16_t out = 0; + TESTING("Mirror encode/decode of uint16_t data"); - /* Start of buffer uint16_t - */ - mybzero(buf, 8); - mybzero(expected, 8); - expected[0] = 0x8F; - expected[1] = 0x02; - out = 0; - if (H5FD__mirror_xmit_encode_uint16(buf, v) != 2) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 8); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint16(&out, buf) != 2) { - TEST_ERROR; - } - if (out != v) { - TEST_ERROR; - } + /* Start of buffer uint16_t */ + HDmemset(buf, 0, 8); + HDmemset(expected, 0, 8); + expected[0] = 0x8F; + expected[1] = 0x02; + out = 0; + if (H5FD__mirror_xmit_encode_uint16(buf, v) != 2) + TEST_ERROR; + if (HDmemcmp(buf, expected, 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 8); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint16(&out, buf) != 2) + TEST_ERROR; + if (out != v) + TEST_ERROR; - /* Middle of buffer uint16_t - */ - mybzero(buf, 8); - mybzero(expected, 8); - expected[3] = 0x8F; - expected[4] = 0x02; - out = 0; - if (H5FD__mirror_xmit_encode_uint16((buf + 3), v) != 2) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 8); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint16(&out, (buf + 3)) != 2) { - TEST_ERROR; - } - if (out != v) { - TEST_ERROR; - } - /* slice */ - if (H5FD__mirror_xmit_decode_uint16(&out, (buf + 4)) != 2) { - TEST_ERROR; - } - if (out != 0x0200) { - TEST_ERROR; - } + /* Middle of buffer uint16_t */ + HDmemset(buf, 0, 8); + HDmemset(expected, 0, 8); + expected[3] = 0x8F; + expected[4] = 0x02; + out = 0; + if (H5FD__mirror_xmit_encode_uint16((buf + 3), v) != 2) + TEST_ERROR; + if (HDmemcmp(buf, expected, 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 8); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint16(&out, (buf + 3)) != 2) + TEST_ERROR; + if (out != v) + TEST_ERROR; - /* End of buffer uint16_t - */ - mybzero(buf, 8); - mybzero(expected, 8); - expected[6] = 0x8F; - expected[7] = 0x02; - out = 0; - if (H5FD__mirror_xmit_encode_uint16((buf + 6), v) != 2) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 8); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint16(&out, (buf + 6)) != 2) { - TEST_ERROR; - } - if (out != v) { - TEST_ERROR; - } + /* slice */ + if (H5FD__mirror_xmit_decode_uint16(&out, (buf + 4)) != 2) + TEST_ERROR; + if (out != 0x0200) + TEST_ERROR; - } while (0); /* end uint16_t en/decode */ + /* End of buffer uint16_t */ + HDmemset(buf, 0, 8); + HDmemset(expected, 0, 8); + expected[6] = 0x8F; + expected[7] = 0x02; + out = 0; + if (H5FD__mirror_xmit_encode_uint16((buf + 6), v) != 2) + TEST_ERROR; + if (HDmemcmp(buf, expected, 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 8); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint16(&out, (buf + 6)) != 2) + TEST_ERROR; + if (out != v) + TEST_ERROR; - /* Test uint32_t encode/decode - */ - do { - unsigned char buf[8]; - unsigned char expected[8]; - const uint32_t v = 0x8F020048; - uint32_t out = 0; + PASSED(); + return 0; - /* Start of buffer uint32_t - */ - mybzero(buf, 8); - mybzero(expected, 8); - expected[0] = 0x8F; - expected[1] = 0x02; - expected[2] = 0x00; - expected[3] = 0x48; - out = 0; - if (H5FD__mirror_xmit_encode_uint32(buf, v) != 4) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 8); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint32(&out, buf) != 4) { - TEST_ERROR; - } - if (out != v) { - TEST_ERROR; - } +error: + return -1; +} - /* Middle of buffer uint32_t - */ - mybzero(buf, 8); - mybzero(expected, 8); - expected[3] = 0x8F; - expected[4] = 0x02; - expected[5] = 0x00; - expected[6] = 0x48; - out = 0; - if (H5FD__mirror_xmit_encode_uint32((buf + 3), v) != 4) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 8); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint32(&out, (buf + 3)) != 4) { - TEST_ERROR; - } - if (out != v) { - TEST_ERROR; - } - /* slice */ - if (H5FD__mirror_xmit_decode_uint32(&out, (buf + 4)) != 4) { - TEST_ERROR; - } - if (out != 0x02004800) { - TEST_ERROR; - } +/* Test uint32_t encode/decode */ +static int +test_encdec_uint32_t(void) +{ + unsigned char buf[8]; + unsigned char expected[8]; + const uint32_t v = 0x8F020048; + uint32_t out = 0; - /* End of buffer uint32_t - */ - mybzero(buf, 8); - mybzero(expected, 8); - expected[4] = 0x8F; - expected[5] = 0x02; - expected[6] = 0x00; - expected[7] = 0x48; - out = 0; - if (H5FD__mirror_xmit_encode_uint32((buf + 4), v) != 4) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 8); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint32(&out, (buf + 4)) != 4) { - TEST_ERROR; - } - if (out != v) { - TEST_ERROR; - } + TESTING("Mirror encode/decode of uint32_t data"); - } while (0); /* end uint32_t en/decode */ + /* Start of buffer uint32_t */ + HDmemset(buf, 0, 8); + HDmemset(expected, 0, 8); + expected[0] = 0x8F; + expected[1] = 0x02; + expected[2] = 0x00; + expected[3] = 0x48; + out = 0; + if (H5FD__mirror_xmit_encode_uint32(buf, v) != 4) + TEST_ERROR; + if (HDmemcmp(buf, expected, 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 8); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint32(&out, buf) != 4) + TEST_ERROR; + if (out != v) + TEST_ERROR; - /* Test uint64_t encode/decode - */ - do { - unsigned char buf[16]; - unsigned char expected[16]; - const uint64_t v = 0x90DCBE17939CE4BB; - uint64_t out = 0; + /* Middle of buffer uint32_t */ + HDmemset(buf, 0, 8); + HDmemset(expected, 0, 8); + expected[3] = 0x8F; + expected[4] = 0x02; + expected[5] = 0x00; + expected[6] = 0x48; + out = 0; + if (H5FD__mirror_xmit_encode_uint32((buf + 3), v) != 4) + TEST_ERROR; + if (HDmemcmp(buf, expected, 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 8); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint32(&out, (buf + 3)) != 4) + TEST_ERROR; + if (out != v) + TEST_ERROR; + /* slice */ + if (H5FD__mirror_xmit_decode_uint32(&out, (buf + 4)) != 4) + TEST_ERROR; + if (out != 0x02004800) + TEST_ERROR; - /* Start of buffer uint64_t - */ - mybzero(buf, 16); - mybzero(expected, 16); - expected[0] = 0x90; - expected[1] = 0xDC; - expected[2] = 0xBE; - expected[3] = 0x17; - expected[4] = 0x93; - expected[5] = 0x9C; - expected[6] = 0xE4; - expected[7] = 0xBB; - out = 0; - if (H5FD__mirror_xmit_encode_uint64(buf, v) != 8) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 16) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 16); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint64(&out, buf) != 8) { - TEST_ERROR; - } - if (out != v) { - TEST_ERROR; - } + /* End of buffer uint32_t */ + HDmemset(buf, 0, 8); + HDmemset(expected, 0, 8); + expected[4] = 0x8F; + expected[5] = 0x02; + expected[6] = 0x00; + expected[7] = 0x48; + out = 0; + if (H5FD__mirror_xmit_encode_uint32((buf + 4), v) != 4) + TEST_ERROR; + if (HDmemcmp(buf, expected, 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 8); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint32(&out, (buf + 4)) != 4) + TEST_ERROR; + if (out != v) + TEST_ERROR; - /* Middle of buffer uint64_t - */ - mybzero(buf, 16); - mybzero(expected, 16); - expected[3] = 0x90; - expected[4] = 0xDC; - expected[5] = 0xBE; - expected[6] = 0x17; - expected[7] = 0x93; - expected[8] = 0x9C; - expected[9] = 0xE4; - expected[10] = 0xBB; - out = 0; - if (H5FD__mirror_xmit_encode_uint64((buf + 3), v) != 8) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 16) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 16); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint64(&out, (buf + 3)) != 8) { - TEST_ERROR; - } - if (out != v) { - TEST_ERROR; - } - /* slice */ - if (H5FD__mirror_xmit_decode_uint64(&out, (buf + 6)) != 8) { - TEST_ERROR; - } - if (out != 0x17939CE4BB000000) { - TEST_ERROR; - } + PASSED(); + return 0; - /* End of buffer uint64_t - */ - mybzero(buf, 16); - mybzero(expected, 16); - expected[8] = 0x90; - expected[9] = 0xDC; - expected[10] = 0xBE; - expected[11] = 0x17; - expected[12] = 0x93; - expected[13] = 0x9C; - expected[14] = 0xE4; - expected[15] = 0xBB; - out = 0; - if (H5FD__mirror_xmit_encode_uint64((buf + 8), v) != 8) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, 16) != 0) { - PRINT_BUFFER_DIFF(buf, expected, 16); - TEST_ERROR; - } - if (H5FD__mirror_xmit_decode_uint64(&out, (buf + 8)) != 8) { - TEST_ERROR; - } - if (out != v) { - TEST_ERROR; - } +error: + return -1; +} - } while (0); /* end uint64_t en/decode */ +/* Test uint64_t encode/decode */ +static int +test_encdec_uint64_t(void) +{ + unsigned char buf[16]; + unsigned char expected[16]; + const uint64_t v = 0x90DCBE17939CE4BB; + uint64_t out = 0; - /* Test xmit header structure encode/decode - * Write bogus but easily verifiable data to inside a buffer, and compare. - * Then decode the buffer and compare the structure contents. - * Then repeat from a different offset in the buffer and compare. - */ - do { - unsigned char buf[H5FD_MIRROR_XMIT_HEADER_SIZE + 8]; - unsigned char expected[H5FD_MIRROR_XMIT_HEADER_SIZE + 8]; - H5FD_mirror_xmit_t xmit_out; - size_t i = 0; - - /* sanity check */ - if (14 != H5FD_MIRROR_XMIT_HEADER_SIZE) { - FAIL_PUTS_ERROR("Header size definition does not match test\n"); - } + TESTING("Mirror encode/decode of uint64_t data"); - /* Populate the expected buffer; expect end padding of 0xFF - */ - HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_HEADER_SIZE + 8); - for (i = 0; i < H5FD_MIRROR_XMIT_HEADER_SIZE; i++) { - expected[i + 2] = (unsigned char)i; - } + /* Start of buffer uint64_t */ + HDmemset(buf, 0, 16); + HDmemset(expected, 0, 16); + expected[0] = 0x90; + expected[1] = 0xDC; + expected[2] = 0xBE; + expected[3] = 0x17; + expected[4] = 0x93; + expected[5] = 0x9C; + expected[6] = 0xE4; + expected[7] = 0xBB; + out = 0; + if (H5FD__mirror_xmit_encode_uint64(buf, v) != 8) + TEST_ERROR; + if (HDmemcmp(buf, expected, 16) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 16); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint64(&out, buf) != 8) + TEST_ERROR; + if (out != v) + TEST_ERROR; - /* Encode, and compare buffer contents - * Initial buffer is filled with 0xFF to match expected padding - */ - HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_HEADER_SIZE + 8); - if (H5FD_mirror_xmit_encode_header((buf + 2), &xmit_mock) != H5FD_MIRROR_XMIT_HEADER_SIZE) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_HEADER_SIZE + 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_HEADER_SIZE + 8); - TEST_ERROR; - } + /* Middle of buffer uint64_t */ + HDmemset(buf, 0, 16); + HDmemset(expected, 0, 16); + expected[3] = 0x90; + expected[4] = 0xDC; + expected[5] = 0xBE; + expected[6] = 0x17; + expected[7] = 0x93; + expected[8] = 0x9C; + expected[9] = 0xE4; + expected[10] = 0xBB; + out = 0; + if (H5FD__mirror_xmit_encode_uint64((buf + 3), v) != 8) + TEST_ERROR; + if (HDmemcmp(buf, expected, 16) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 16); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint64(&out, (buf + 3)) != 8) + TEST_ERROR; + if (out != v) + TEST_ERROR; + /* Slice */ + if (H5FD__mirror_xmit_decode_uint64(&out, (buf + 6)) != 8) + TEST_ERROR; + if (out != 0x17939CE4BB000000) + TEST_ERROR; - /* Decode from buffer - */ - if (H5FD_mirror_xmit_decode_header(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_HEADER_SIZE) { - TEST_ERROR; - } - if (xmit_out.magic != xmit_mock.magic) - TEST_ERROR; - if (xmit_out.version != xmit_mock.version) - TEST_ERROR; - if (xmit_out.session_token != xmit_mock.session_token) - TEST_ERROR; - if (xmit_out.xmit_count != xmit_mock.xmit_count) - TEST_ERROR; - if (xmit_out.op != xmit_mock.op) - TEST_ERROR; + /* End of buffer uint64_t */ + HDmemset(buf, 0, 16); + HDmemset(expected, 0, 16); + expected[8] = 0x90; + expected[9] = 0xDC; + expected[10] = 0xBE; + expected[11] = 0x17; + expected[12] = 0x93; + expected[13] = 0x9C; + expected[14] = 0xE4; + expected[15] = 0xBB; + out = 0; + if (H5FD__mirror_xmit_encode_uint64((buf + 8), v) != 8) + TEST_ERROR; + if (HDmemcmp(buf, expected, 16) != 0) { + PRINT_BUFFER_DIFF(buf, expected, 16); + TEST_ERROR; + } + if (H5FD__mirror_xmit_decode_uint64(&out, (buf + 8)) != 8) + TEST_ERROR; + if (out != v) + TEST_ERROR; - /* Decode from different offset in buffer - * Observe changes when ingesting the padding - */ - if (H5FD_mirror_xmit_decode_header(&xmit_out, (buf)) != H5FD_MIRROR_XMIT_HEADER_SIZE) { - TEST_ERROR; - } - if (xmit_out.magic != 0xFFFF0001) - TEST_ERROR; - if (xmit_out.version != 0x02) - TEST_ERROR; - if (xmit_out.session_token != 0x03040506) - TEST_ERROR; - if (xmit_out.xmit_count != 0x0708090A) - TEST_ERROR; - if (xmit_out.op != 0x0B) - TEST_ERROR; + PASSED(); + return 0; - } while (0); /* end xmit header en/decode */ +error: + return -1; +} - /* Test xmit set-eoa structure encode/decode - * Write bogus but easily verifiable data to inside a buffer, and compare. - * Then decode the buffer and compare the structure contents. - * Then repeat from a different offset in the buffer and compare. - */ - do { - unsigned char buf[H5FD_MIRROR_XMIT_EOA_SIZE + 8]; - unsigned char expected[H5FD_MIRROR_XMIT_EOA_SIZE + 8]; - H5FD_mirror_xmit_eoa_t xmit_in; - H5FD_mirror_xmit_eoa_t xmit_out; - size_t i = 0; - - /* sanity check */ - if ((14 + 9) != H5FD_MIRROR_XMIT_EOA_SIZE) { - FAIL_PUTS_ERROR("Header size definition does not match test\n"); - } - if (xmit_mock.op != 0x0D) { - FAIL_PUTS_ERROR("shared header structure is not in expected state"); - } +/*****************************/ +/* Other Encode/decode tests */ +/*****************************/ - /* Populate the expected buffer; expect end padding of 0xFF - */ - HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_EOA_SIZE + 8); - for (i = 0; i < H5FD_MIRROR_XMIT_EOA_SIZE; i++) { - expected[i + 2] = (unsigned char)i; - } +/* Test xmit header structure encode/decode + * Write bogus but easily verifiable data to inside a buffer, and compare. + * Then decode the buffer and compare the structure contents. + * Then repeat from a different offset in the buffer and compare. + */ +static int +test_encdec_header(H5FD_mirror_xmit_t xmit_mock) +{ + unsigned char buf[H5FD_MIRROR_XMIT_HEADER_SIZE + 8]; + unsigned char expected[H5FD_MIRROR_XMIT_HEADER_SIZE + 8]; + H5FD_mirror_xmit_t xmit_out; + size_t i = 0; - /* Set xmit_in - */ - xmit_in.pub = xmit_mock; /* shared/common */ - xmit_in.type = 0x0E; - xmit_in.eoa_addr = 0x0F10111213141516; + TESTING("Mirror encode/decode of xmit header"); - /* Encode, and compare buffer contents - * Initial buffer is filled with 0xFF to match expected padding - */ - HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_EOA_SIZE + 8); - if (H5FD_mirror_xmit_encode_set_eoa((buf + 2), &xmit_in) != H5FD_MIRROR_XMIT_EOA_SIZE) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_EOA_SIZE + 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_EOA_SIZE + 8); - TEST_ERROR; - } + /* Sanity check */ + if (14 != H5FD_MIRROR_XMIT_HEADER_SIZE) + FAIL_PUTS_ERROR("Header size definition does not match test\n"); - /* Decode from buffer - */ - if (H5FD_mirror_xmit_decode_set_eoa(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_EOA_SIZE) { - TEST_ERROR; - } - if (xmit_out.pub.magic != xmit_mock.magic) - TEST_ERROR; - if (xmit_out.pub.version != xmit_mock.version) - TEST_ERROR; - if (xmit_out.pub.session_token != xmit_mock.session_token) - TEST_ERROR; - if (xmit_out.pub.xmit_count != xmit_mock.xmit_count) - TEST_ERROR; - if (xmit_out.pub.op != xmit_mock.op) - TEST_ERROR; - if (xmit_out.type != 0x0E) - TEST_ERROR; - if (xmit_out.eoa_addr != 0x0F10111213141516) - TEST_ERROR; + /* Populate the expected buffer; expect end padding of 0xFF */ + HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_HEADER_SIZE + 8); + for (i = 0; i < H5FD_MIRROR_XMIT_HEADER_SIZE; i++) { + expected[i + 2] = (unsigned char)i; + } - /* Decode from different offset in buffer - * Observe changes when ingesting the padding - */ - if (H5FD_mirror_xmit_decode_set_eoa(&xmit_out, (buf)) != H5FD_MIRROR_XMIT_EOA_SIZE) { - TEST_ERROR; - } - if (xmit_out.pub.magic != 0xFFFF0001) - TEST_ERROR; - if (xmit_out.pub.version != 0x02) - TEST_ERROR; - if (xmit_out.pub.session_token != 0x03040506) - TEST_ERROR; - if (xmit_out.pub.xmit_count != 0x0708090A) - TEST_ERROR; - if (xmit_out.pub.op != 0x0B) - TEST_ERROR; - if (xmit_out.type != 0x0C) - TEST_ERROR; - if (xmit_out.eoa_addr != 0x0D0E0F1011121314) - TEST_ERROR; + /* Encode, and compare buffer contents + * Initial buffer is filled with 0xFF to match expected padding + */ + HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_HEADER_SIZE + 8); + if (H5FD_mirror_xmit_encode_header((buf + 2), &xmit_mock) != H5FD_MIRROR_XMIT_HEADER_SIZE) + TEST_ERROR; + if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_HEADER_SIZE + 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_HEADER_SIZE + 8); + TEST_ERROR; + } - } while (0); /* end xmit set-eoa en/decode */ + /* Decode from buffer */ + if (H5FD_mirror_xmit_decode_header(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_HEADER_SIZE) + TEST_ERROR; + if (xmit_out.magic != xmit_mock.magic) + TEST_ERROR; + if (xmit_out.version != xmit_mock.version) + TEST_ERROR; + if (xmit_out.session_token != xmit_mock.session_token) + TEST_ERROR; + if (xmit_out.xmit_count != xmit_mock.xmit_count) + TEST_ERROR; + if (xmit_out.op != xmit_mock.op) + TEST_ERROR; - /* Test xmit lock structure encode/decode - * Write bogus but easily verifiable data to inside a buffer, and compare. - * Then decode the buffer and compare the structure contents. - * Then repeat from a different offset in the buffer and compare. + /* Decode from different offset in buffer + * Observe changes when ingesting the padding */ - do { - unsigned char buf[H5FD_MIRROR_XMIT_LOCK_SIZE + 8]; - unsigned char expected[H5FD_MIRROR_XMIT_LOCK_SIZE + 8]; - H5FD_mirror_xmit_lock_t xmit_in; - H5FD_mirror_xmit_lock_t xmit_out; - size_t i = 0; - - /* sanity check */ - if ((14 + 8) != H5FD_MIRROR_XMIT_LOCK_SIZE) { - FAIL_PUTS_ERROR("Header size definition does not match test\n"); - } - if (xmit_mock.op != 0x0D) { - FAIL_PUTS_ERROR("shared header structure is not in expected state"); - } + if (H5FD_mirror_xmit_decode_header(&xmit_out, buf) != H5FD_MIRROR_XMIT_HEADER_SIZE) + TEST_ERROR; + if (xmit_out.magic != 0xFFFF0001) + TEST_ERROR; + if (xmit_out.version != 0x02) + TEST_ERROR; + if (xmit_out.session_token != 0x03040506) + TEST_ERROR; + if (xmit_out.xmit_count != 0x0708090A) + TEST_ERROR; + if (xmit_out.op != 0x0B) + TEST_ERROR; - /* Populate the expected buffer; expect end padding of 0xFF - */ - HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_LOCK_SIZE + 8); - for (i = 0; i < H5FD_MIRROR_XMIT_LOCK_SIZE; i++) { - expected[i + 2] = (unsigned char)i; - } + PASSED(); + return 0; - /* Set xmit_in - */ - xmit_in.pub = xmit_mock; /* shared/common */ - xmit_in.rw = 0x0E0F101112131415; +error: + return -1; +} - /* Encode, and compare buffer contents - * Initial buffer is filled with 0xFF to match expected padding - */ - HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_LOCK_SIZE + 8); - if (H5FD_mirror_xmit_encode_lock((buf + 2), &xmit_in) != H5FD_MIRROR_XMIT_LOCK_SIZE) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_LOCK_SIZE + 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_LOCK_SIZE + 8); - TEST_ERROR; - } +/* Test xmit set-eoa structure encode/decode + * Write bogus but easily verifiable data to inside a buffer, and compare. + * Then decode the buffer and compare the structure contents. + * Then repeat from a different offset in the buffer and compare. + */ +static int +test_encdec_set_eoa(H5FD_mirror_xmit_t xmit_mock) +{ + unsigned char buf[H5FD_MIRROR_XMIT_EOA_SIZE + 8]; + unsigned char expected[H5FD_MIRROR_XMIT_EOA_SIZE + 8]; + H5FD_mirror_xmit_eoa_t xmit_in; + H5FD_mirror_xmit_eoa_t xmit_out; + size_t i = 0; + + TESTING("Mirror encode/decode of xmit set-eoa"); + + /* Sanity check */ + if ((14 + 9) != H5FD_MIRROR_XMIT_EOA_SIZE) + FAIL_PUTS_ERROR("Header size definition does not match test\n"); + if (xmit_mock.op != 0x0D) + FAIL_PUTS_ERROR("shared header structure is not in expected state"); + + /* Populate the expected buffer; expect end padding of 0xFF */ + HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_EOA_SIZE + 8); + for (i = 0; i < H5FD_MIRROR_XMIT_EOA_SIZE; i++) + expected[i + 2] = (unsigned char)i; + + /* Set xmit_in */ + xmit_in.pub = xmit_mock; /* shared/common */ + xmit_in.type = 0x0E; + xmit_in.eoa_addr = 0x0F10111213141516; + + /* Encode, and compare buffer contents + * Initial buffer is filled with 0xFF to match expected padding + */ + HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_EOA_SIZE + 8); + if (H5FD_mirror_xmit_encode_set_eoa((buf + 2), &xmit_in) != H5FD_MIRROR_XMIT_EOA_SIZE) + TEST_ERROR; + if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_EOA_SIZE + 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_EOA_SIZE + 8); + TEST_ERROR; + } - /* Decode from buffer - */ - if (H5FD_mirror_xmit_decode_lock(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_LOCK_SIZE) { - TEST_ERROR; - } - if (xmit_out.pub.magic != xmit_mock.magic) - TEST_ERROR; - if (xmit_out.pub.version != xmit_mock.version) - TEST_ERROR; - if (xmit_out.pub.session_token != xmit_mock.session_token) - TEST_ERROR; - if (xmit_out.pub.xmit_count != xmit_mock.xmit_count) - TEST_ERROR; - if (xmit_out.pub.op != xmit_mock.op) - TEST_ERROR; - if (xmit_out.rw != 0x0E0F101112131415) - TEST_ERROR; + /* Decode from buffer */ + if (H5FD_mirror_xmit_decode_set_eoa(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_EOA_SIZE) + TEST_ERROR; + if (xmit_out.pub.magic != xmit_mock.magic) + TEST_ERROR; + if (xmit_out.pub.version != xmit_mock.version) + TEST_ERROR; + if (xmit_out.pub.session_token != xmit_mock.session_token) + TEST_ERROR; + if (xmit_out.pub.xmit_count != xmit_mock.xmit_count) + TEST_ERROR; + if (xmit_out.pub.op != xmit_mock.op) + TEST_ERROR; + if (xmit_out.type != 0x0E) + TEST_ERROR; + if (xmit_out.eoa_addr != 0x0F10111213141516) + TEST_ERROR; - /* Decode from different offset in buffer - * Observe changes when ingesting the padding - */ - if (H5FD_mirror_xmit_decode_lock(&xmit_out, (buf)) != H5FD_MIRROR_XMIT_LOCK_SIZE) { - TEST_ERROR; - } - if (xmit_out.pub.magic != 0xFFFF0001) - TEST_ERROR; - if (xmit_out.pub.version != 0x02) - TEST_ERROR; - if (xmit_out.pub.session_token != 0x03040506) - TEST_ERROR; - if (xmit_out.pub.xmit_count != 0x0708090A) - TEST_ERROR; - if (xmit_out.pub.op != 0x0B) - TEST_ERROR; - if (xmit_out.rw != 0x0C0D0E0F10111213) - TEST_ERROR; + /* Decode from different offset in buffer + * Observe changes when ingesting the padding + */ + if (H5FD_mirror_xmit_decode_set_eoa(&xmit_out, buf) != H5FD_MIRROR_XMIT_EOA_SIZE) + TEST_ERROR; + if (xmit_out.pub.magic != 0xFFFF0001) + TEST_ERROR; + if (xmit_out.pub.version != 0x02) + TEST_ERROR; + if (xmit_out.pub.session_token != 0x03040506) + TEST_ERROR; + if (xmit_out.pub.xmit_count != 0x0708090A) + TEST_ERROR; + if (xmit_out.pub.op != 0x0B) + TEST_ERROR; + if (xmit_out.type != 0x0C) + TEST_ERROR; + if (xmit_out.eoa_addr != 0x0D0E0F1011121314) + TEST_ERROR; + + PASSED(); + return 0; - } while (0); /* end xmit lock en/decode */ +error: + return -1; +} - /* Test xmit open structure encode/decode - * Write bogus but easily verifiable data to inside a buffer, and compare. - * Then decode the buffer and compare the structure contents. - * Then repeat from a different offset in the buffer and compare. - * - * Verifies that the first zero character in the filepath will end the - * string, with all following bytes in the encoded buffer being zeroed. +/* Test xmit lock structure encode/decode + * Write bogus but easily verifiable data to inside a buffer, and compare. + * Then decode the buffer and compare the structure contents. + * Then repeat from a different offset in the buffer and compare. + */ +static int +test_encdec_lock(H5FD_mirror_xmit_t xmit_mock) +{ + unsigned char buf[H5FD_MIRROR_XMIT_LOCK_SIZE + 8]; + unsigned char expected[H5FD_MIRROR_XMIT_LOCK_SIZE + 8]; + H5FD_mirror_xmit_lock_t xmit_in; + H5FD_mirror_xmit_lock_t xmit_out; + size_t i = 0; + + TESTING("Mirror encode/decode of xmit lock"); + + /* Sanity check */ + if ((14 + 8) != H5FD_MIRROR_XMIT_LOCK_SIZE) + FAIL_PUTS_ERROR("Header size definition does not match test\n"); + if (xmit_mock.op != 0x0D) + FAIL_PUTS_ERROR("shared header structure is not in expected state"); + + /* Populate the expected buffer; expect end padding of 0xFF */ + HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_LOCK_SIZE + 8); + for (i = 0; i < H5FD_MIRROR_XMIT_LOCK_SIZE; i++) + expected[i + 2] = (unsigned char)i; + + /* Set xmit_in */ + xmit_in.pub = xmit_mock; /* shared/common */ + xmit_in.rw = 0x0E0F101112131415; + + /* Encode, and compare buffer contents + * Initial buffer is filled with 0xFF to match expected padding */ - do { - unsigned char buf[H5FD_MIRROR_XMIT_OPEN_SIZE + 8]; - unsigned char expected[H5FD_MIRROR_XMIT_OPEN_SIZE + 8]; - H5FD_mirror_xmit_open_t xmit_in; - H5FD_mirror_xmit_open_t xmit_out; - size_t i = 0; - - /* sanity check */ - if ((14 + 20 + 4097) != H5FD_MIRROR_XMIT_OPEN_SIZE) { - FAIL_PUTS_ERROR("Header size definition does not match test\n"); - } - if (xmit_mock.op != 0x0D) { - FAIL_PUTS_ERROR("shared header structure is not in expected state"); - } + HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_LOCK_SIZE + 8); + if (H5FD_mirror_xmit_encode_lock((buf + 2), &xmit_in) != H5FD_MIRROR_XMIT_LOCK_SIZE) + TEST_ERROR; + if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_LOCK_SIZE + 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_LOCK_SIZE + 8); + TEST_ERROR; + } - /* Populate the expected buffer; expect end padding of 0xFF - */ - HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_OPEN_SIZE + 8); - for (i = 0; i < H5FD_MIRROR_XMIT_OPEN_SIZE; i++) { - /* 0x100 is "zero" in a byte, so encode will treat it as a NULL- - * terminator in the filepath string. Expect all zeroes following. - */ - expected[i + 2] = (i > 0xFF) ? 0 : (unsigned char)i; - } + /* Decode from buffer */ + if (H5FD_mirror_xmit_decode_lock(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_LOCK_SIZE) + TEST_ERROR; + if (xmit_out.pub.magic != xmit_mock.magic) + TEST_ERROR; + if (xmit_out.pub.version != xmit_mock.version) + TEST_ERROR; + if (xmit_out.pub.session_token != xmit_mock.session_token) + TEST_ERROR; + if (xmit_out.pub.xmit_count != xmit_mock.xmit_count) + TEST_ERROR; + if (xmit_out.pub.op != xmit_mock.op) + TEST_ERROR; + if (xmit_out.rw != 0x0E0F101112131415) + TEST_ERROR; - /* Set xmit_in - */ - xmit_in.pub = xmit_mock; /* shared/common */ - xmit_in.flags = 0x0E0F1011; - xmit_in.maxaddr = 0x1213141516171819; - xmit_in.size_t_blob = 0x1A1B1C1D1E1F2021; - for (i = 0x22; i < H5FD_MIRROR_XMIT_FILEPATH_MAX + 0x22; i++) { - /* nonzero values repeat after 0x100, but will not be encoded */ - xmit_in.filename[i - 0x22] = (char)(i % 0x100); - } - xmit_in.filename[H5FD_MIRROR_XMIT_FILEPATH_MAX - 1] = 0; + /* Decode from different offset in buffer + * Observe changes when ingesting the padding + */ + if (H5FD_mirror_xmit_decode_lock(&xmit_out, buf) != H5FD_MIRROR_XMIT_LOCK_SIZE) + TEST_ERROR; + if (xmit_out.pub.magic != 0xFFFF0001) + TEST_ERROR; + if (xmit_out.pub.version != 0x02) + TEST_ERROR; + if (xmit_out.pub.session_token != 0x03040506) + TEST_ERROR; + if (xmit_out.pub.xmit_count != 0x0708090A) + TEST_ERROR; + if (xmit_out.pub.op != 0x0B) + TEST_ERROR; + if (xmit_out.rw != 0x0C0D0E0F10111213) + TEST_ERROR; - /* Encode, and compare buffer contents - * Initial buffer is filled with 0xFF to match expected padding - */ - HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_OPEN_SIZE + 8); - if (H5FD_mirror_xmit_encode_open((buf + 2), &xmit_in) != H5FD_MIRROR_XMIT_OPEN_SIZE) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_OPEN_SIZE + 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_OPEN_SIZE + 8); - TEST_ERROR; - } + PASSED(); + return 0; - /* Decode from buffer - */ - if (H5FD_mirror_xmit_decode_open(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_OPEN_SIZE) { - TEST_ERROR; - } - if (xmit_out.pub.magic != xmit_mock.magic) - TEST_ERROR; - if (xmit_out.pub.version != xmit_mock.version) - TEST_ERROR; - if (xmit_out.pub.session_token != xmit_mock.session_token) - TEST_ERROR; - if (xmit_out.pub.xmit_count != xmit_mock.xmit_count) - TEST_ERROR; - if (xmit_out.pub.op != xmit_mock.op) - TEST_ERROR; - if (xmit_out.flags != xmit_in.flags) - TEST_ERROR; - if (xmit_out.maxaddr != xmit_in.maxaddr) - TEST_ERROR; - if (xmit_out.size_t_blob != xmit_in.size_t_blob) - TEST_ERROR; - if (HDstrncmp(xmit_out.filename, xmit_in.filename, H5FD_MIRROR_XMIT_FILEPATH_MAX) != 0) { - PRINT_BUFFER_DIFF(xmit_out.filename, xmit_in.filename, H5FD_MIRROR_XMIT_FILEPATH_MAX); - TEST_ERROR; - } +error: + return -1; +} - /* Decode from different offset in buffer - * Observe changes when ingesting the padding +/* Test xmit open structure encode/decode + * Write bogus but easily verifiable data to inside a buffer, and compare. + * Then decode the buffer and compare the structure contents. + * Then repeat from a different offset in the buffer and compare. + * + * Verifies that the first zero character in the filepath will end the + * string, with all following bytes in the encoded buffer being zeroed. + */ +static int +test_encdec_open(H5FD_mirror_xmit_t xmit_mock) +{ + unsigned char *buf = NULL; + unsigned char *expected = NULL; + H5FD_mirror_xmit_open_t *xmit_in = NULL; + H5FD_mirror_xmit_open_t *xmit_out = NULL; + + TESTING("Mirror encode/decode of xmit open"); + + /* Sanity check */ + if ((14 + 20 + 4097) != H5FD_MIRROR_XMIT_OPEN_SIZE) + FAIL_PUTS_ERROR("Header size definition does not match test\n"); + if (xmit_mock.op != 0x0D) + FAIL_PUTS_ERROR("shared header structure is not in expected state"); + + /* Allocate memory */ + if (NULL == (buf = HDmalloc((H5FD_MIRROR_XMIT_OPEN_SIZE + 8) * sizeof(unsigned char)))) + FAIL_PUTS_ERROR("Unable to allocate memory for buf"); + if (NULL == (expected = HDmalloc((H5FD_MIRROR_XMIT_OPEN_SIZE + 8) * sizeof(unsigned char)))) + FAIL_PUTS_ERROR("Unable to allocate memory for expected"); + if (NULL == (xmit_in = HDmalloc(sizeof(H5FD_mirror_xmit_open_t)))) + FAIL_PUTS_ERROR("Unable to allocate memory for xmit_in"); + if (NULL == (xmit_out = HDmalloc(sizeof(H5FD_mirror_xmit_open_t)))) + FAIL_PUTS_ERROR("Unable to allocate memory for xmit_out"); + + /* Populate the expected buffer; expect end padding of 0xFF */ + HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_OPEN_SIZE + 8); + for (size_t i = 0; i < H5FD_MIRROR_XMIT_OPEN_SIZE; i++) { + /* 0x100 is "zero" in a byte, so encode will treat it as a NULL- + * terminator in the filepath string. Expect all zeroes following. */ - if (H5FD_mirror_xmit_decode_open(&xmit_out, (buf)) != H5FD_MIRROR_XMIT_OPEN_SIZE) { - TEST_ERROR; - } - if (xmit_out.pub.magic != 0xFFFF0001) - TEST_ERROR; - if (xmit_out.pub.version != 0x02) - TEST_ERROR; - if (xmit_out.pub.session_token != 0x03040506) - TEST_ERROR; - if (xmit_out.pub.xmit_count != 0x0708090A) - TEST_ERROR; - if (xmit_out.pub.op != 0x0B) - TEST_ERROR; - if (xmit_out.flags != 0x0C0D0E0F) - TEST_ERROR; - if (xmit_out.maxaddr != 0x1011121314151617) - TEST_ERROR; - if (xmit_out.size_t_blob != 0x18191A1B1C1D1E1F) - TEST_ERROR; - /* update expected "filepath" in structure */ - for (i = 0x20; i < H5FD_MIRROR_XMIT_FILEPATH_MAX + 0x20; i++) { - xmit_in.filename[i - 0x20] = (i > 0xFF) ? 0 : (char)i; - } - if (HDstrncmp(xmit_out.filename, xmit_in.filename, H5FD_MIRROR_XMIT_FILEPATH_MAX) != 0) { - PRINT_BUFFER_DIFF(xmit_out.filename, xmit_in.filename, H5FD_MIRROR_XMIT_FILEPATH_MAX); - TEST_ERROR; - } + expected[i + 2] = (i > 0xFF) ? 0 : (unsigned char)i; + } - } while (0); /* end xmit open en/decode */ + /* Set xmit_in */ + xmit_in->pub = xmit_mock; /* shared/common */ + xmit_in->flags = 0x0E0F1011; + xmit_in->maxaddr = 0x1213141516171819; + xmit_in->size_t_blob = 0x1A1B1C1D1E1F2021; + for (size_t i = 0x22; i < H5FD_MIRROR_XMIT_FILEPATH_MAX + 0x22; i++) { + /* Non-zero values repeat after 0x100, but will not be encoded */ + xmit_in->filename[i - 0x22] = (char)(i % 0x100); + } + xmit_in->filename[H5FD_MIRROR_XMIT_FILEPATH_MAX - 1] = 0; - /* Test xmit reply structure encode/decode - * Write bogus but easily verifiable data to inside a buffer, and compare. - * Then decode the buffer and compare the structure contents. - * Then repeat from a different offset in the buffer and compare. - * - * Verifies that the first zero character in the filepath will end the - * string, with all following bytes in the encoded buffer being zeroed. + /* Encode, and compare buffer contents + * Initial buffer is filled with 0xFF to match expected padding */ - do { - unsigned char buf[H5FD_MIRROR_XMIT_REPLY_SIZE + 8]; - unsigned char expected[H5FD_MIRROR_XMIT_REPLY_SIZE + 8]; - H5FD_mirror_xmit_reply_t xmit_in; - H5FD_mirror_xmit_reply_t xmit_out; - size_t i = 0; - - /* sanity check */ - if ((14 + 4 + 256) != H5FD_MIRROR_XMIT_REPLY_SIZE) { - FAIL_PUTS_ERROR("Header size definition does not match test\n"); - } - if (xmit_mock.op != 0x0D) { - FAIL_PUTS_ERROR("shared header structure is not in expected state"); - } + HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_OPEN_SIZE + 8); + if (H5FD_mirror_xmit_encode_open((buf + 2), xmit_in) != H5FD_MIRROR_XMIT_OPEN_SIZE) + TEST_ERROR; + if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_OPEN_SIZE + 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_OPEN_SIZE + 8); + TEST_ERROR; + } - /* Populate the expected buffer; expect end padding of 0xFF - */ - HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_REPLY_SIZE + 8); - for (i = 0; i < H5FD_MIRROR_XMIT_REPLY_SIZE; i++) { - /* 0x100 is "zero" in a byte, so encode will treat it as a NULL- - * terminator in the filepath string. Expect all zeroes following. - */ - expected[i + 2] = (i > 0xFF) ? 0 : (unsigned char)i; - } + /* Decode from buffer */ + if (H5FD_mirror_xmit_decode_open(xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_OPEN_SIZE) + TEST_ERROR; + if (xmit_out->pub.magic != xmit_mock.magic) + TEST_ERROR; + if (xmit_out->pub.version != xmit_mock.version) + TEST_ERROR; + if (xmit_out->pub.session_token != xmit_mock.session_token) + TEST_ERROR; + if (xmit_out->pub.xmit_count != xmit_mock.xmit_count) + TEST_ERROR; + if (xmit_out->pub.op != xmit_mock.op) + TEST_ERROR; + if (xmit_out->flags != xmit_in->flags) + TEST_ERROR; + if (xmit_out->maxaddr != xmit_in->maxaddr) + TEST_ERROR; + if (xmit_out->size_t_blob != xmit_in->size_t_blob) + TEST_ERROR; + if (HDstrncmp(xmit_out->filename, xmit_in->filename, H5FD_MIRROR_XMIT_FILEPATH_MAX) != 0) { + PRINT_BUFFER_DIFF(xmit_out->filename, xmit_in->filename, H5FD_MIRROR_XMIT_FILEPATH_MAX); + TEST_ERROR; + } - /* Set xmit_in - */ - xmit_in.pub = xmit_mock; /* shared/common */ - xmit_in.status = 0x0E0F1011; - for (i = 0x12; i < H5FD_MIRROR_STATUS_MESSAGE_MAX + 0x12; i++) { - /* nonzero values repeat after 0x100, but will not be encoded */ - xmit_in.message[i - 0x12] = (char)(i % 0x100); - } - xmit_in.message[H5FD_MIRROR_STATUS_MESSAGE_MAX - 1] = 0; + /* Decode from different offset in buffer + * Observe changes when ingesting the padding + */ + if (H5FD_mirror_xmit_decode_open(xmit_out, buf) != H5FD_MIRROR_XMIT_OPEN_SIZE) + TEST_ERROR; + if (xmit_out->pub.magic != 0xFFFF0001) + TEST_ERROR; + if (xmit_out->pub.version != 0x02) + TEST_ERROR; + if (xmit_out->pub.session_token != 0x03040506) + TEST_ERROR; + if (xmit_out->pub.xmit_count != 0x0708090A) + TEST_ERROR; + if (xmit_out->pub.op != 0x0B) + TEST_ERROR; + if (xmit_out->flags != 0x0C0D0E0F) + TEST_ERROR; + if (xmit_out->maxaddr != 0x1011121314151617) + TEST_ERROR; + if (xmit_out->size_t_blob != 0x18191A1B1C1D1E1F) + TEST_ERROR; + /* Update expected "filepath" in structure */ + for (size_t i = 0x20; i < H5FD_MIRROR_XMIT_FILEPATH_MAX + 0x20; i++) + xmit_in->filename[i - 0x20] = (i > 0xFF) ? 0 : (char)i; + if (HDstrncmp(xmit_out->filename, xmit_in->filename, H5FD_MIRROR_XMIT_FILEPATH_MAX) != 0) { + PRINT_BUFFER_DIFF(xmit_out->filename, xmit_in->filename, H5FD_MIRROR_XMIT_FILEPATH_MAX); + TEST_ERROR; + } - /* Encode, and compare buffer contents - * Initial buffer is filled with 0xFF to match expected padding - */ - HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_REPLY_SIZE + 8); - if (H5FD_mirror_xmit_encode_reply((buf + 2), &xmit_in) != H5FD_MIRROR_XMIT_REPLY_SIZE) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_REPLY_SIZE + 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_REPLY_SIZE + 8); - TEST_ERROR; - } + HDfree(buf); + HDfree(expected); + HDfree(xmit_in); + HDfree(xmit_out); - /* Decode from buffer - */ - if (H5FD_mirror_xmit_decode_reply(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_REPLY_SIZE) { - TEST_ERROR; - } - if (xmit_out.pub.magic != xmit_mock.magic) - TEST_ERROR; - if (xmit_out.pub.version != xmit_mock.version) - TEST_ERROR; - if (xmit_out.pub.session_token != xmit_mock.session_token) - TEST_ERROR; - if (xmit_out.pub.xmit_count != xmit_mock.xmit_count) - TEST_ERROR; - if (xmit_out.pub.op != xmit_mock.op) - TEST_ERROR; - if (xmit_out.status != xmit_in.status) - TEST_ERROR; - if (HDstrncmp(xmit_out.message, xmit_in.message, H5FD_MIRROR_STATUS_MESSAGE_MAX) != 0) { - PRINT_BUFFER_DIFF(xmit_out.message, xmit_in.message, H5FD_MIRROR_STATUS_MESSAGE_MAX); - TEST_ERROR; - } + PASSED(); + return 0; - /* Decode from different offset in buffer - * Observe changes when ingesting the padding +error: + HDfree(buf); + HDfree(expected); + HDfree(xmit_in); + HDfree(xmit_out); + + return -1; +} + +/* Test xmit reply structure encode/decode + * Write bogus but easily verifiable data to inside a buffer, and compare. + * Then decode the buffer and compare the structure contents. + * Then repeat from a different offset in the buffer and compare. + * + * Verifies that the first zero character in the filepath will end the + * string, with all following bytes in the encoded buffer being zeroed. + */ +static int +test_encdec_reply(H5FD_mirror_xmit_t xmit_mock) +{ + unsigned char buf[H5FD_MIRROR_XMIT_REPLY_SIZE + 8]; + unsigned char expected[H5FD_MIRROR_XMIT_REPLY_SIZE + 8]; + H5FD_mirror_xmit_reply_t xmit_in; + H5FD_mirror_xmit_reply_t xmit_out; + size_t i = 0; + + TESTING("Mirror encode/decode of xmit reply"); + + /* Sanity check */ + if ((14 + 4 + 256) != H5FD_MIRROR_XMIT_REPLY_SIZE) + FAIL_PUTS_ERROR("Header size definition does not match test\n"); + if (xmit_mock.op != 0x0D) + FAIL_PUTS_ERROR("shared header structure is not in expected state"); + + /* Populate the expected buffer; expect end padding of 0xFF */ + HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_REPLY_SIZE + 8); + for (i = 0; i < H5FD_MIRROR_XMIT_REPLY_SIZE; i++) { + /* 0x100 is "zero" in a byte, so encode will treat it as a NULL- + * terminator in the filepath string. Expect all zeroes following. */ - if (H5FD_mirror_xmit_decode_reply(&xmit_out, (buf)) != H5FD_MIRROR_XMIT_REPLY_SIZE) { - TEST_ERROR; - } - if (xmit_out.pub.magic != 0xFFFF0001) - TEST_ERROR; - if (xmit_out.pub.version != 0x02) - TEST_ERROR; - if (xmit_out.pub.session_token != 0x03040506) - TEST_ERROR; - if (xmit_out.pub.xmit_count != 0x0708090A) - TEST_ERROR; - if (xmit_out.pub.op != 0x0B) - TEST_ERROR; - if (xmit_out.status != 0x0C0D0E0F) - TEST_ERROR; - /* update expected "message" in structure */ - for (i = 0x10; i < H5FD_MIRROR_STATUS_MESSAGE_MAX + 0x10; i++) { - xmit_in.message[i - 0x10] = (i > 0xFF) ? 0 : (char)i; - } - if (HDstrncmp(xmit_out.message, xmit_in.message, H5FD_MIRROR_STATUS_MESSAGE_MAX) != 0) { - PRINT_BUFFER_DIFF(xmit_out.message, xmit_in.message, H5FD_MIRROR_STATUS_MESSAGE_MAX); - TEST_ERROR; - } + expected[i + 2] = (i > 0xFF) ? 0 : (unsigned char)i; + } - } while (0); /* end xmit reply en/decode */ + /* Set xmit_in */ + xmit_in.pub = xmit_mock; /* shared/common */ + xmit_in.status = 0x0E0F1011; + for (i = 0x12; i < H5FD_MIRROR_STATUS_MESSAGE_MAX + 0x12; i++) { + /* Non-zero values repeat after 0x100, but will not be encoded */ + xmit_in.message[i - 0x12] = (char)(i % 0x100); + } + xmit_in.message[H5FD_MIRROR_STATUS_MESSAGE_MAX - 1] = 0; - /* Test xmit write structure encode/decode - * Write bogus but easily verifiable data to inside a buffer, and compare. - * Then decode the buffer and compare the structure contents. - * Then repeat from a different offset in the buffer and compare. + /* Encode, and compare buffer contents + * Initial buffer is filled with 0xFF to match expected padding */ - do { - unsigned char buf[H5FD_MIRROR_XMIT_WRITE_SIZE + 8]; - unsigned char expected[H5FD_MIRROR_XMIT_WRITE_SIZE + 8]; - H5FD_mirror_xmit_write_t xmit_in; - H5FD_mirror_xmit_write_t xmit_out; - size_t i = 0; - - /* sanity check */ - if ((14 + 17) != H5FD_MIRROR_XMIT_WRITE_SIZE) { - FAIL_PUTS_ERROR("Header size definition does not match test\n"); - } - if (xmit_mock.op != 0x0D) { - FAIL_PUTS_ERROR("shared header structure is not in expected state"); - } + HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_REPLY_SIZE + 8); + if (H5FD_mirror_xmit_encode_reply((buf + 2), &xmit_in) != H5FD_MIRROR_XMIT_REPLY_SIZE) + TEST_ERROR; + if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_REPLY_SIZE + 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_REPLY_SIZE + 8); + TEST_ERROR; + } - /* Populate the expected buffer; expect end padding of 0xFF - */ - HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_WRITE_SIZE + 8); - for (i = 0; i < H5FD_MIRROR_XMIT_WRITE_SIZE; i++) { - expected[i + 2] = (unsigned char)i; - } + /* Decode from buffer */ + if (H5FD_mirror_xmit_decode_reply(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_REPLY_SIZE) + TEST_ERROR; + if (xmit_out.pub.magic != xmit_mock.magic) + TEST_ERROR; + if (xmit_out.pub.version != xmit_mock.version) + TEST_ERROR; + if (xmit_out.pub.session_token != xmit_mock.session_token) + TEST_ERROR; + if (xmit_out.pub.xmit_count != xmit_mock.xmit_count) + TEST_ERROR; + if (xmit_out.pub.op != xmit_mock.op) + TEST_ERROR; + if (xmit_out.status != xmit_in.status) + TEST_ERROR; + if (HDstrncmp(xmit_out.message, xmit_in.message, H5FD_MIRROR_STATUS_MESSAGE_MAX) != 0) { + PRINT_BUFFER_DIFF(xmit_out.message, xmit_in.message, H5FD_MIRROR_STATUS_MESSAGE_MAX); + TEST_ERROR; + } - /* Set xmit_in - */ - xmit_in.pub = xmit_mock; /* shared/common */ - xmit_in.type = 0x0E; - xmit_in.offset = 0x0F10111213141516; - xmit_in.size = 0x1718191A1B1C1D1E; + /* Decode from different offset in buffer + * Observe changes when ingesting the padding + */ + if (H5FD_mirror_xmit_decode_reply(&xmit_out, buf) != H5FD_MIRROR_XMIT_REPLY_SIZE) + TEST_ERROR; + if (xmit_out.pub.magic != 0xFFFF0001) + TEST_ERROR; + if (xmit_out.pub.version != 0x02) + TEST_ERROR; + if (xmit_out.pub.session_token != 0x03040506) + TEST_ERROR; + if (xmit_out.pub.xmit_count != 0x0708090A) + TEST_ERROR; + if (xmit_out.pub.op != 0x0B) + TEST_ERROR; + if (xmit_out.status != 0x0C0D0E0F) + TEST_ERROR; + /* Update expected "message" in structure */ + for (i = 0x10; i < H5FD_MIRROR_STATUS_MESSAGE_MAX + 0x10; i++) + xmit_in.message[i - 0x10] = (i > 0xFF) ? 0 : (char)i; + if (HDstrncmp(xmit_out.message, xmit_in.message, H5FD_MIRROR_STATUS_MESSAGE_MAX) != 0) { + PRINT_BUFFER_DIFF(xmit_out.message, xmit_in.message, H5FD_MIRROR_STATUS_MESSAGE_MAX); + TEST_ERROR; + } - /* Encode, and compare buffer contents - * Initial buffer is filled with 0xFF to match expected padding - */ - HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_WRITE_SIZE + 8); - if (H5FD_mirror_xmit_encode_write((buf + 2), &xmit_in) != H5FD_MIRROR_XMIT_WRITE_SIZE) { - TEST_ERROR; - } - if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_WRITE_SIZE + 8) != 0) { - PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_WRITE_SIZE + 8); - TEST_ERROR; - } + PASSED(); + return 0; - /* Decode from buffer - */ - if (H5FD_mirror_xmit_decode_write(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_WRITE_SIZE) { - TEST_ERROR; - } - if (xmit_out.pub.magic != xmit_mock.magic) - TEST_ERROR; - if (xmit_out.pub.version != xmit_mock.version) - TEST_ERROR; - if (xmit_out.pub.session_token != xmit_mock.session_token) - TEST_ERROR; - if (xmit_out.pub.xmit_count != xmit_mock.xmit_count) - TEST_ERROR; - if (xmit_out.pub.op != xmit_mock.op) - TEST_ERROR; - if (xmit_out.type != 0x0E) - TEST_ERROR; - if (xmit_out.offset != 0x0F10111213141516) - TEST_ERROR; - if (xmit_out.size != 0x1718191A1B1C1D1E) - TEST_ERROR; +error: + return -1; +} - /* Decode from different offset in buffer - * Observe changes when ingesting the padding - */ - if (H5FD_mirror_xmit_decode_write(&xmit_out, (buf)) != H5FD_MIRROR_XMIT_WRITE_SIZE) { - TEST_ERROR; - } - if (xmit_out.pub.magic != 0xFFFF0001) - TEST_ERROR; - if (xmit_out.pub.version != 0x02) - TEST_ERROR; - if (xmit_out.pub.session_token != 0x03040506) - TEST_ERROR; - if (xmit_out.pub.xmit_count != 0x0708090A) - TEST_ERROR; - if (xmit_out.pub.op != 0x0B) - TEST_ERROR; - if (xmit_out.type != 0x0C) - TEST_ERROR; - if (xmit_out.offset != 0x0D0E0F1011121314) - TEST_ERROR; - if (xmit_out.size != 0x15161718191A1B1C) - TEST_ERROR; +/* Test xmit write structure encode/decode + * Write bogus but easily verifiable data to inside a buffer, and compare. + * Then decode the buffer and compare the structure contents. + * Then repeat from a different offset in the buffer and compare. + */ +static int +test_encdec_write(H5FD_mirror_xmit_t xmit_mock) +{ + unsigned char buf[H5FD_MIRROR_XMIT_WRITE_SIZE + 8]; + unsigned char expected[H5FD_MIRROR_XMIT_WRITE_SIZE + 8]; + H5FD_mirror_xmit_write_t xmit_in; + H5FD_mirror_xmit_write_t xmit_out; + size_t i = 0; + + TESTING("Mirror encode/decode of xmit write"); + + /* Sanity check */ + if ((14 + 17) != H5FD_MIRROR_XMIT_WRITE_SIZE) + FAIL_PUTS_ERROR("Header size definition does not match test\n"); + if (xmit_mock.op != 0x0D) + FAIL_PUTS_ERROR("shared header structure is not in expected state"); + + /* Populate the expected buffer; expect end padding of 0xFF */ + HDmemset(expected, 0xFF, H5FD_MIRROR_XMIT_WRITE_SIZE + 8); + for (i = 0; i < H5FD_MIRROR_XMIT_WRITE_SIZE; i++) + expected[i + 2] = (unsigned char)i; + + /* Set xmit_in */ + xmit_in.pub = xmit_mock; /* shared/common */ + xmit_in.type = 0x0E; + xmit_in.offset = 0x0F10111213141516; + xmit_in.size = 0x1718191A1B1C1D1E; + + /* Encode, and compare buffer contents + * Initial buffer is filled with 0xFF to match expected padding + */ + HDmemset(buf, 0xFF, H5FD_MIRROR_XMIT_WRITE_SIZE + 8); + if (H5FD_mirror_xmit_encode_write((buf + 2), &xmit_in) != H5FD_MIRROR_XMIT_WRITE_SIZE) + TEST_ERROR; + if (HDmemcmp(buf, expected, H5FD_MIRROR_XMIT_WRITE_SIZE + 8) != 0) { + PRINT_BUFFER_DIFF(buf, expected, H5FD_MIRROR_XMIT_WRITE_SIZE + 8); + TEST_ERROR; + } + + /* Decode from buffer */ + if (H5FD_mirror_xmit_decode_write(&xmit_out, (buf + 2)) != H5FD_MIRROR_XMIT_WRITE_SIZE) + TEST_ERROR; + if (xmit_out.pub.magic != xmit_mock.magic) + TEST_ERROR; + if (xmit_out.pub.version != xmit_mock.version) + TEST_ERROR; + if (xmit_out.pub.session_token != xmit_mock.session_token) + TEST_ERROR; + if (xmit_out.pub.xmit_count != xmit_mock.xmit_count) + TEST_ERROR; + if (xmit_out.pub.op != xmit_mock.op) + TEST_ERROR; + if (xmit_out.type != 0x0E) + TEST_ERROR; + if (xmit_out.offset != 0x0F10111213141516) + TEST_ERROR; + if (xmit_out.size != 0x1718191A1B1C1D1E) + TEST_ERROR; - } while (0); /* end xmit write en/decode */ + /* Decode from different offset in buffer + * Observe changes when ingesting the padding + */ + if (H5FD_mirror_xmit_decode_write(&xmit_out, buf) != H5FD_MIRROR_XMIT_WRITE_SIZE) + TEST_ERROR; + if (xmit_out.pub.magic != 0xFFFF0001) + TEST_ERROR; + if (xmit_out.pub.version != 0x02) + TEST_ERROR; + if (xmit_out.pub.session_token != 0x03040506) + TEST_ERROR; + if (xmit_out.pub.xmit_count != 0x0708090A) + TEST_ERROR; + if (xmit_out.pub.op != 0x0B) + TEST_ERROR; + if (xmit_out.type != 0x0C) + TEST_ERROR; + if (xmit_out.offset != 0x0D0E0F1011121314) + TEST_ERROR; + if (xmit_out.size != 0x15161718191A1B1C) + TEST_ERROR; PASSED(); return 0; error: return -1; -} /* end test_xmit_encode_decode */ +} /* --------------------------------------------------------------------------- * Function: create_mirroring_split_fapl @@ -1260,101 +1199,84 @@ error: * Return: Success: HID of the top-level (splitter) FAPL, a non-negative * value. * Failure: H5I_INVALID_HID, a negative value. - * - * Programmer: Jacob Smith - * 2019 * --------------------------------------------------------------------------- */ static hid_t -create_mirroring_split_fapl(const char *_basename, struct mirrortest_filenames *names, +create_mirroring_split_fapl(const char *basename, struct mirrortest_filenames *names, const struct mt_opts *opts) { - H5FD_splitter_vfd_config_t splitter_config; - H5FD_mirror_fapl_t mirror_conf; - hid_t ret_value = H5I_INVALID_HID; + H5FD_splitter_vfd_config_t *splitter_config = NULL; + H5FD_mirror_fapl_t mirror_conf; + hid_t ret_value = H5I_INVALID_HID; - if (_basename == NULL || *_basename == '\0') { + if (NULL == (splitter_config = HDmalloc(sizeof(H5FD_splitter_vfd_config_t)))) TEST_ERROR; - } - splitter_config.magic = H5FD_SPLITTER_MAGIC; - splitter_config.version = H5FD_CURR_SPLITTER_VFD_CONFIG_VERSION; - splitter_config.ignore_wo_errs = FALSE; - - /* Create Splitter R/W channel driver (sec2) + /* Initialize the fapls, too, so the library doesn't try to + * close non-existing IDs on errors */ - splitter_config.rw_fapl_id = H5Pcreate(H5P_FILE_ACCESS); - if (H5I_INVALID_HID == splitter_config.rw_fapl_id) { + splitter_config->magic = H5FD_SPLITTER_MAGIC; + splitter_config->version = H5FD_CURR_SPLITTER_VFD_CONFIG_VERSION; + splitter_config->ignore_wo_errs = FALSE; + splitter_config->rw_fapl_id = H5I_INVALID_HID; + splitter_config->wo_fapl_id = H5I_INVALID_HID; + + if (basename == NULL || *basename == '\0') TEST_ERROR; - } - if (H5Pset_fapl_sec2(splitter_config.rw_fapl_id) == FAIL) { + + /* Create Splitter R/W channel driver (sec2) */ + if ((splitter_config->rw_fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) + TEST_ERROR; + if (H5Pset_fapl_sec2(splitter_config->rw_fapl_id) < 0) TEST_ERROR; - } - /* Create Splitter W/O channel driver (mirror) - */ + /* Create Splitter W/O channel driver (mirror) */ mirror_conf.magic = H5FD_MIRROR_FAPL_MAGIC; mirror_conf.version = H5FD_MIRROR_CURR_FAPL_T_VERSION; mirror_conf.handshake_port = opts->portno; - if (HDstrncpy(mirror_conf.remote_ip, opts->ip, H5FD_MIRROR_MAX_IP_LEN) == NULL) { + if (HDstrncpy(mirror_conf.remote_ip, opts->ip, H5FD_MIRROR_MAX_IP_LEN) == NULL) TEST_ERROR; - } - splitter_config.wo_fapl_id = H5Pcreate(H5P_FILE_ACCESS); - if (H5I_INVALID_HID == splitter_config.wo_fapl_id) { + if ((splitter_config->wo_fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) TEST_ERROR; - } - if (H5Pset_fapl_mirror(splitter_config.wo_fapl_id, &mirror_conf) == FAIL) { + if (H5Pset_fapl_mirror(splitter_config->wo_fapl_id, &mirror_conf) < 0) TEST_ERROR; - } - /* Build r/w, w/o, and log file paths - */ - if (build_paths(_basename, &splitter_config, names) < 0) { + /* Build r/w, w/o, and log file paths */ + if (build_paths(basename, splitter_config, names) < 0) TEST_ERROR; - } - /* Set file paths for w/o and logfile - */ - if (HDstrncpy(splitter_config.wo_path, (const char *)names->wo, H5FD_SPLITTER_PATH_MAX) == NULL) { + /* Set file paths for w/o and logfile */ + if (HDstrncpy(splitter_config->wo_path, (const char *)names->wo, H5FD_SPLITTER_PATH_MAX) == NULL) TEST_ERROR; - } - if (HDstrncpy(splitter_config.log_file_path, (const char *)names->log, H5FD_SPLITTER_PATH_MAX) == NULL) { + if (HDstrncpy(splitter_config->log_file_path, (const char *)names->log, H5FD_SPLITTER_PATH_MAX) == NULL) TEST_ERROR; - } - /* Create Splitter FAPL - */ - ret_value = H5Pcreate(H5P_FILE_ACCESS); - if (H5I_INVALID_HID == ret_value) { + /* Create Splitter FAPL */ + if ((ret_value = H5Pcreate(H5P_FILE_ACCESS)) < 0) TEST_ERROR; - } - if (H5Pset_fapl_splitter(ret_value, &splitter_config) == FAIL) { + if (H5Pset_fapl_splitter(ret_value, splitter_config) < 0) TEST_ERROR; - } - /* Close FAPLs created for child channels - */ - if (H5Pclose(splitter_config.rw_fapl_id) < 0) { + /* Close FAPLs created for child channels */ + if (H5Pclose(splitter_config->rw_fapl_id) < 0) TEST_ERROR; - } - splitter_config.rw_fapl_id = H5I_INVALID_HID; - if (H5Pclose(splitter_config.wo_fapl_id) < 0) { + if (H5Pclose(splitter_config->wo_fapl_id) < 0) TEST_ERROR; - } - splitter_config.wo_fapl_id = H5I_INVALID_HID; + + HDfree(splitter_config); return ret_value; -error: - if (splitter_config.wo_fapl_id >= 0) { - (void)H5Pclose(splitter_config.wo_fapl_id); - } - if (splitter_config.rw_fapl_id >= 0) { - (void)H5Pclose(splitter_config.rw_fapl_id); - } - if (ret_value >= 0) { - (void)H5Pclose(ret_value); +error: + HDfree(splitter_config); + H5E_BEGIN_TRY + { + H5Pclose(splitter_config->wo_fapl_id); + H5Pclose(splitter_config->rw_fapl_id); + H5Pclose(ret_value); } + H5E_END_TRY; + return H5I_INVALID_HID; } /* end create_mirroring_split_fapl() */ @@ -1369,55 +1291,43 @@ error: * * Return: Success: 0 * Failure: -1 - * - * Programmer: Jacob Smith - * 2019-12-17 * --------------------------------------------------------------------------- */ static int test_create_and_close(const struct mt_opts *opts) { - struct mirrortest_filenames names; - hid_t file_id = H5I_INVALID_HID; - hid_t fapl_id = H5P_DEFAULT; + struct mirrortest_filenames *names = NULL; + hid_t file_id = H5I_INVALID_HID; + hid_t fapl_id = H5I_INVALID_HID; TESTING("File creation and immediate close"); - /* Create FAPL for Splitter[sec2|mirror] - */ - fapl_id = create_mirroring_split_fapl("basic_create", &names, opts); - if (H5I_INVALID_HID == fapl_id) { + if (NULL == (names = HDmalloc(sizeof(struct mirrortest_filenames)))) TEST_ERROR; - } - /* -------------------- */ - /* TEST: Create and Close */ - - file_id = H5Fcreate(names.rw, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - if (H5I_INVALID_HID == file_id) { + /* Create FAPL for splitter[sec2|mirror] */ + if ((fapl_id = create_mirroring_split_fapl("basic_create", names, opts)) < 0) TEST_ERROR; - } - /* -------------------- */ - /* Standard cleanup */ + if ((file_id = H5Fcreate(names->rw, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0) + TEST_ERROR; - if (H5Fclose(file_id) == FAIL) { + if (H5Fclose(file_id) < 0) TEST_ERROR; - } - if (fapl_id != H5P_DEFAULT && fapl_id >= 0) { - if (H5Pclose(fapl_id) == FAIL) { - TEST_ERROR; - } - } + if (H5Pclose(fapl_id) < 0) + TEST_ERROR; + + HDfree(names); PASSED(); return 0; error: + HDfree(names); H5E_BEGIN_TRY { - (void)H5Fclose(file_id); - (void)H5Pclose(fapl_id); + H5Fclose(file_id); + H5Pclose(fapl_id); } H5E_END_TRY; return -1; @@ -1433,9 +1343,6 @@ error: * and values. * * Return: SUCCEED/FAIL - * - * Programmer: Jacob Smith - * 2019-08-14 * ---------------------------------------------------------------------------- */ static herr_t @@ -1458,10 +1365,7 @@ create_datasets(hid_t file_id, unsigned min_dset, unsigned max_dset) LOGPRINT(2, "create_dataset()\n"); - /* --------------------------------- - * "Clear" ID arrays - */ - + /* Initialize ID arrays */ for (i = 0; i < MAX_DSET_COUNT; i++) { LOGPRINT(3, "clearing IDs [%d]\n", i); dataspace_ids[i] = H5I_INVALID_HID; @@ -1469,20 +1373,14 @@ create_datasets(hid_t file_id, unsigned min_dset, unsigned max_dset) filespace_ids[i] = H5I_INVALID_HID; } - /* --------------------------------- - * Generate dataspace, dataset, and 'filespace' IDs - */ - + /* Generate dataspace, dataset, and 'filespace' IDs */ if (_create_chunking_ids(file_id, min_dset, max_dset, chunk_dims, dset_dims, dataspace_ids, filespace_ids, - dataset_ids, &memspace_id) == FAIL) { + dataset_ids, &memspace_id) < 0) TEST_ERROR; - } - /* --------------------------------- - * Initialize (write) all datasets in a "round robin"... + /* Initialize (write) all datasets in a "round robin"... * for a given chunk 'location', write chunk data to each dataset. */ - for (i = 0; i < DSET_DIM; i += CHUNK_DIM) { LOGPRINT(3, "i: %d\n", i); for (j = 0; j < DSET_DIM; j += CHUNK_DIM) { @@ -1500,35 +1398,24 @@ create_datasets(hid_t file_id, unsigned min_dset, unsigned max_dset) offset[0] = (hsize_t)i; offset[1] = (hsize_t)j; LOGPRINT(3, " H5Sselect_hyperslab()\n"); - if (H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, offset, NULL, a_size, NULL) < 0) { + if (H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, offset, NULL, a_size, NULL) < 0) TEST_ERROR; - } LOGPRINT(3, " H5Dwrite()\n"); if (H5Dwrite(dataset_ids[m], H5T_NATIVE_INT, memspace_id, filespace_ids[m], H5P_DEFAULT, - data_chunk) < 0) { + data_chunk) < 0) TEST_ERROR; - } } } } - /* --------------------------------- - * Read and verify data from datasets - */ - - if (_verify_datasets(min_dset, max_dset, filespace_ids, dataset_ids, memspace_id) == FAIL) { + /* Read and verify data from datasets */ + if (_verify_datasets(min_dset, max_dset, filespace_ids, dataset_ids, memspace_id) < 0) TEST_ERROR; - } - - /* --------------------------------- - * Cleanup - */ - if (_close_chunking_ids(min_dset, max_dset, dataspace_ids, filespace_ids, dataset_ids, &memspace_id) == - FAIL) { + /* Cleanup */ + if (_close_chunking_ids(min_dset, max_dset, dataspace_ids, filespace_ids, dataset_ids, &memspace_id) < 0) TEST_ERROR; - } return SUCCEED; @@ -1544,9 +1431,6 @@ error: * Purpose: Create new IDs to be used with the associated file. * * Return: SUCCEED/FAIL - * - * Programer: Jacob Smith - * 2019 * ---------------------------------------------------------------------------- */ static herr_t @@ -1554,92 +1438,69 @@ _create_chunking_ids(hid_t file_id, unsigned min_dset, unsigned max_dset, hsize_ hsize_t *dset_dims, hid_t *dataspace_ids, hid_t *filespace_ids, hid_t *dataset_ids, hid_t *memspace_id) { - char dset_name[DSET_NAME_LEN + 1]; - unsigned m = 0; - hid_t dcpl_id = H5I_INVALID_HID; + char dset_name[DSET_NAME_LEN + 1]; + hid_t dcpl_id = H5I_INVALID_HID; LOGPRINT(2, "_create_chunking_ids()\n"); - /* -------------------- - * Create chunking DCPL - */ - - dcpl_id = H5Pcreate(H5P_DATASET_CREATE); - if (dcpl_id < 0) { + /* Create chunking DCPL */ + if ((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR; - } - if (H5Pset_chunk(dcpl_id, 2, chunk_dims) == FAIL) { + if (H5Pset_chunk(dcpl_id, 2, chunk_dims) < 0) TEST_ERROR; - } - - /* -------------------- - * Create dataspace IDs - */ - for (m = min_dset; m <= max_dset; m++) { - dataspace_ids[m] = H5Screate_simple(2, dset_dims, NULL); - if (dataspace_ids[m] < 0) { + /* Create dataspace IDs */ + for (unsigned m = min_dset; m <= max_dset; m++) { + if ((dataspace_ids[m] = H5Screate_simple(2, dset_dims, NULL)) < 0) { HDsnprintf(mesg, MIRR_MESG_SIZE, "unable to create dataspace ID %d\n", m); FAIL_PUTS_ERROR(mesg); } } - /* -------------------- - * Create dataset IDs - */ - - for (m = min_dset; m <= max_dset; m++) { + /* Create dataset IDs */ + for (unsigned m = min_dset; m <= max_dset; m++) { if (HDsnprintf(dset_name, DSET_NAME_LEN, "/dset%03d", m) > DSET_NAME_LEN) { HDsnprintf(mesg, MIRR_MESG_SIZE, "unable to compose dset name %d\n", m); FAIL_PUTS_ERROR(mesg); } - dataset_ids[m] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE, dataspace_ids[m], H5P_DEFAULT, dcpl_id, - H5P_DEFAULT); - if (dataset_ids[m] < 0) { + if ((dataset_ids[m] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE, dataspace_ids[m], H5P_DEFAULT, + dcpl_id, H5P_DEFAULT)) < 0) { HDsnprintf(mesg, MIRR_MESG_SIZE, "unable to create dset ID %d\n", m); FAIL_PUTS_ERROR(mesg); } } - /* -------------------- - * Get file space IDs - */ - - for (m = min_dset; m <= max_dset; m++) { - filespace_ids[m] = H5Dget_space(dataset_ids[m]); - if (filespace_ids[m] < 0) { + /* Get file space IDs */ + for (unsigned m = min_dset; m <= max_dset; m++) { + if ((filespace_ids[m] = H5Dget_space(dataset_ids[m])) < 0) { HDsnprintf(mesg, MIRR_MESG_SIZE, "unable to create filespace ID %d\n", m); FAIL_PUTS_ERROR(mesg); } } - /* -------------------- - * Create mem space to be used to read and write chunks - */ - - *memspace_id = H5Screate_simple(2, chunk_dims, NULL); - if (*memspace_id < 0) { + /* Create mem space to be used to read and write chunks */ + if ((*memspace_id = H5Screate_simple(2, chunk_dims, NULL)) < 0) TEST_ERROR; - } - - /* -------------------- - * Clean up the DCPL, even if there were errors before - */ - if (dcpl_id != H5P_DEFAULT && dcpl_id != H5I_INVALID_HID) { - if (H5Pclose(dcpl_id) == FAIL) { - TEST_ERROR; - } - } + /* Clean up the DCPL */ + if (H5Pclose(dcpl_id) < 0) + TEST_ERROR; return SUCCEED; error: - if (dcpl_id != H5P_DEFAULT && dcpl_id != H5I_INVALID_HID) { - (void)H5Pclose(dcpl_id); + H5E_BEGIN_TRY + { + /* Note that it's the caller's responsibility to clean up any IDs + * passed back via out parameters + */ + H5Pclose(dcpl_id); } + H5E_END_TRY; + LOGPRINT(1, "_create_chunking_ids() FAILED\n"); + return FAIL; } /* end _create_chunking_ids() */ @@ -1649,61 +1510,47 @@ error: * Purpose: Open/access IDs from the given file. * * Return: SUCCEED/FAIL - * - * Programmer: Jacob Smith - * 2019 * ---------------------------------------------------------------------------- */ static herr_t _open_chunking_ids(hid_t file_id, unsigned min_dset, unsigned max_dset, hsize_t *chunk_dims, hid_t *filespace_ids, hid_t *dataset_ids, hid_t *memspace_id) { - char dset_name[DSET_NAME_LEN + 1]; - unsigned m = 0; + char dset_name[DSET_NAME_LEN + 1]; LOGPRINT(2, "_open_chunking_ids()\n"); - /* -------------------- - * Open dataset IDs - */ - - for (m = min_dset; m <= max_dset; m++) { + /* Open dataset IDs */ + for (unsigned m = min_dset; m <= max_dset; m++) { if (HDsnprintf(dset_name, DSET_NAME_LEN, "/dset%03d", m) > DSET_NAME_LEN) { HDsnprintf(mesg, MIRR_MESG_SIZE, "unable to compose dset name %d\n", m); FAIL_PUTS_ERROR(mesg); } - dataset_ids[m] = H5Dopen2(file_id, dset_name, H5P_DEFAULT); - if (dataset_ids[m] < 0) { + if ((dataset_ids[m] = H5Dopen2(file_id, dset_name, H5P_DEFAULT)) < 0) { HDsnprintf(mesg, MIRR_MESG_SIZE, "unable to open dset ID %d\n", m); FAIL_PUTS_ERROR(mesg); } } - /* -------------------- - * Open filespace IDs - */ - - for (m = min_dset; m <= max_dset; m++) { - filespace_ids[m] = H5Dget_space(dataset_ids[m]); - if (filespace_ids[m] < 0) { + /* Open filespace IDs */ + for (unsigned m = min_dset; m <= max_dset; m++) { + if ((filespace_ids[m] = H5Dget_space(dataset_ids[m])) < 0) { HDsnprintf(mesg, MIRR_MESG_SIZE, "unable to get filespace ID %d\n", m); FAIL_PUTS_ERROR(mesg); } } - /* -------------------- - * Create mem space to be used to read and write chunks - */ - - *memspace_id = H5Screate_simple(2, chunk_dims, NULL); - if (*memspace_id < 0) { + /* Create mem space to be used to read and write chunks */ + if ((*memspace_id = H5Screate_simple(2, chunk_dims, NULL)) < 0) TEST_ERROR; - } return SUCCEED; error: + /* Note that the caller is responsible for cleaning up IDs returned + * as out parameters + */ LOGPRINT(1, "_open_chunking_ids() FAILED\n"); return FAIL; } /* end _open_chunking_ids() */ @@ -1716,20 +1563,15 @@ error: * _open_chunking_ids(). (as opposed to created IDs) * * Return: SUCCEED/FAIL - * - * Programmer: Jacob Smith - * 2019 * --------------------------------------------------------------------------- */ static herr_t _close_chunking_ids(unsigned min_dset, unsigned max_dset, hid_t *dataspace_ids, hid_t *filespace_ids, hid_t *dataset_ids, hid_t *memspace_id) { - unsigned m; - LOGPRINT(2, "_close_chunking_ids()\n"); - for (m = min_dset; m <= max_dset; m++) { + for (unsigned m = min_dset; m <= max_dset; m++) { LOGPRINT(3, "closing ids[%d]\n", m); if (dataspace_ids) { if (H5Sclose(dataspace_ids[m]) < 0) { @@ -1747,9 +1589,9 @@ _close_chunking_ids(unsigned min_dset, unsigned max_dset, hid_t *dataspace_ids, } } - if ((*memspace_id != H5I_INVALID_HID) && (H5Sclose(*memspace_id) < 0)) { - TEST_ERROR; - } + if (*memspace_id != H5I_INVALID_HID) + if (H5Sclose(*memspace_id) < 0) + TEST_ERROR; return SUCCEED; @@ -1765,9 +1607,6 @@ error: * to create_datasets(). * * Return: SUCCEED/FAIL - * - * Programmer: Jacob Smith - * 2019 * --------------------------------------------------------------------------- */ static herr_t @@ -1791,9 +1630,8 @@ _verify_datasets(unsigned min_dset, unsigned max_dset, hid_t *filespace_ids, hid /* select on disk hyperslab */ offset[0] = (hsize_t)i; offset[1] = (hsize_t)j; - if (H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, offset, NULL, a_size, NULL) < 0) { + if (H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, offset, NULL, a_size, NULL) < 0) TEST_ERROR; - } if (H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, filespace_ids[m], H5P_DEFAULT, data_chunk) < 0) { @@ -1830,19 +1668,15 @@ error: * tears down accessor information. * * Return: SUCCEED/FAIL - * - * Programmer: Jacob Smith - * 2019 * --------------------------------------------------------------------------- */ static herr_t verify_datasets(hid_t file_id, unsigned min_dset, unsigned max_dset) { - hid_t dataset_ids[MAX_DSET_COUNT + 1]; - hid_t filespace_ids[MAX_DSET_COUNT + 1]; - unsigned i; - hid_t memspace_id = H5I_INVALID_HID; - hsize_t chunk_dims[2] = {CHUNK_DIM, CHUNK_DIM}; + hid_t dataset_ids[MAX_DSET_COUNT + 1]; + hid_t filespace_ids[MAX_DSET_COUNT + 1]; + hid_t memspace_id = H5I_INVALID_HID; + hsize_t chunk_dims[2] = {CHUNK_DIM, CHUNK_DIM}; HDassert(file_id >= 0); HDassert(min_dset <= max_dset); @@ -1850,40 +1684,25 @@ verify_datasets(hid_t file_id, unsigned min_dset, unsigned max_dset) LOGPRINT(2, "verify_datasets()\n"); - /* --------------------------------- - * "Clear" ID arrays - */ - - for (i = 0; i < MAX_DSET_COUNT; i++) { + /* Initialize ID arrays */ + for (unsigned i = 0; i < MAX_DSET_COUNT; i++) { LOGPRINT(3, "clearing IDs [%d]\n", i); dataset_ids[i] = H5I_INVALID_HID; filespace_ids[i] = H5I_INVALID_HID; } - /* --------------------------------- - * Generate dataspace, dataset, and 'filespace' IDs - */ - + /* Generate dataspace, dataset, and 'filespace' IDs */ if (_open_chunking_ids(file_id, min_dset, max_dset, chunk_dims, filespace_ids, dataset_ids, - &memspace_id) == FAIL) { + &memspace_id) < 0) TEST_ERROR; - } - - /* --------------------------------- - * Read and verify data from datasets - */ - if (_verify_datasets(min_dset, max_dset, filespace_ids, dataset_ids, memspace_id) == FAIL) { + /* Read and verify data from datasets */ + if (_verify_datasets(min_dset, max_dset, filespace_ids, dataset_ids, memspace_id) < 0) TEST_ERROR; - } - - /* --------------------------------- - * Cleanup - */ - if (_close_chunking_ids(min_dset, max_dset, NULL, filespace_ids, dataset_ids, &memspace_id) == FAIL) { + /* Cleanup */ + if (_close_chunking_ids(min_dset, max_dset, NULL, filespace_ids, dataset_ids, &memspace_id) < 0) TEST_ERROR; - } return SUCCEED; @@ -1904,40 +1723,34 @@ error: * * Return: Success: 0 * Failure: -1 - * - * Programmer: Jacob Smith - * 2019 * --------------------------------------------------------------------------- */ static int test_basic_dataset_write(const struct mt_opts *opts) { - struct mirrortest_filenames names; - hid_t file_id = H5I_INVALID_HID; - hid_t fapl_id = H5P_DEFAULT; - hid_t dset_id = H5I_INVALID_HID; - hid_t dspace_id = H5I_INVALID_HID; - hid_t dtype_id = H5T_NATIVE_INT; - hsize_t dims[2] = {DATABUFFER_SIZE, DATABUFFER_SIZE}; - int *buf = NULL; - int i = 0; - int j = 0; + struct mirrortest_filenames *names = NULL; + hid_t file_id = H5I_INVALID_HID; + hid_t fapl_id = H5I_INVALID_HID; + hid_t dset_id = H5I_INVALID_HID; + hid_t dspace_id = H5I_INVALID_HID; + hid_t dtype_id = H5T_NATIVE_INT; + hsize_t dims[2] = {DATABUFFER_SIZE, DATABUFFER_SIZE}; + int *buf = NULL; + int i = 0; + int j = 0; TESTING("Mirror open and dataset writing"); - /* Create FAPL for Splitter[sec2|mirror] - */ - fapl_id = create_mirroring_split_fapl("basic_write", &names, opts); - if (H5I_INVALID_HID == fapl_id) { + if (NULL == (names = HDmalloc(sizeof(struct mirrortest_filenames)))) TEST_ERROR; - } - /* Prepare data to be written - */ - buf = (int *)HDmalloc(DATABUFFER_SIZE * DATABUFFER_SIZE * sizeof(int)); - if (NULL == buf) { + /* Create FAPL for Splitter[sec2|mirror] */ + if ((fapl_id = create_mirroring_split_fapl("basic_write", names, opts)) < 0) + TEST_ERROR; + + /* Prepare data to be written */ + if (NULL == (buf = HDmalloc(DATABUFFER_SIZE * DATABUFFER_SIZE * sizeof(int)))) TEST_ERROR; - } for (i = 0; i < DATABUFFER_SIZE; i++) { for (j = 0; j < DATABUFFER_SIZE; j++) { int k = i * DATABUFFER_SIZE + j; @@ -1948,78 +1761,59 @@ test_basic_dataset_write(const struct mt_opts *opts) /* -------------------- */ /* TEST: Create and Close */ - file_id = H5Fcreate(names.rw, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - if (H5I_INVALID_HID == file_id) { + if ((file_id = H5Fcreate(names->rw, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0) TEST_ERROR; - } - if (H5Fclose(file_id) == FAIL) { + if (H5Fclose(file_id) < 0) TEST_ERROR; - } - file_id = H5I_INVALID_HID; /* -------------------- */ /* TEST: Repoen and Write */ - file_id = H5Fopen(names.rw, H5F_ACC_RDWR, fapl_id); - if (H5I_INVALID_HID == file_id) { + if ((file_id = H5Fopen(names->rw, H5F_ACC_RDWR, fapl_id)) < 0) TEST_ERROR; - } - dspace_id = H5Screate_simple(2, dims, NULL); - if (H5I_INVALID_HID == dspace_id) { + if ((dspace_id = H5Screate_simple(2, dims, NULL)) < 0) TEST_ERROR; - } - dset_id = H5Dcreate2(file_id, "dataset", dtype_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - if (H5I_INVALID_HID == dset_id) { + if ((dset_id = + H5Dcreate2(file_id, "dataset", dtype_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; - } - if (H5Dwrite(dset_id, dtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) == FAIL) { + if (H5Dwrite(dset_id, dtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR; - } - /* -------------------- */ - /* Standard cleanup */ + /* Cleanup */ - HDfree(buf); - buf = NULL; - if (H5Dclose(dset_id) == FAIL) { + if (H5Dclose(dset_id) < 0) TEST_ERROR; - } - if (H5Sclose(dspace_id) == FAIL) { + if (H5Sclose(dspace_id) < 0) TEST_ERROR; - } - if (H5Fclose(file_id) == FAIL) { + if (H5Fclose(file_id) < 0) + TEST_ERROR; + if (H5Pclose(fapl_id) < 0) TEST_ERROR; - } - if (fapl_id != H5P_DEFAULT && fapl_id > 0) { - if (H5Pclose(fapl_id) == FAIL) { - TEST_ERROR; - } - } /* -------------------- */ /* TEST: Verify that the R/W and W/O files are identical */ - if (h5_compare_file_bytes(names.rw, names.wo) < 0) { + if (h5_compare_file_bytes(names->rw, names->wo) < 0) TEST_ERROR; - } + + HDfree(buf); + HDfree(names); PASSED(); return 0; error: + HDfree(buf); + HDfree(names); + H5E_BEGIN_TRY { - (void)H5Fclose(file_id); - if (buf) { - HDfree(buf); - } - (void)H5Dclose(dset_id); - (void)H5Sclose(dspace_id); - if (fapl_id != H5P_DEFAULT && fapl_id > 0) { - (void)H5Pclose(fapl_id); - } + H5Fclose(file_id); + H5Dclose(dset_id); + H5Sclose(dspace_id); + H5Pclose(fapl_id); } H5E_END_TRY; return -1; @@ -2035,104 +1829,79 @@ error: * * Return: Success: 0 * Failure: -1 - * - * Programmer: Jacob Smith - * 2019 * --------------------------------------------------------------------------- */ static int test_chunked_dataset_write(const struct mt_opts *opts) { - struct mirrortest_filenames names; - hid_t file_id = H5I_INVALID_HID; - hid_t fapl_id = H5P_DEFAULT; + struct mirrortest_filenames *names = NULL; + + hid_t file_id = H5I_INVALID_HID; + hid_t fapl_id = H5P_DEFAULT; TESTING("Mirror open and dataset writing (chunked)"); - /* Create FAPL for Splitter[sec2|mirror] - */ - fapl_id = create_mirroring_split_fapl("chunked_write", &names, opts); - if (H5I_INVALID_HID == fapl_id) { + if (NULL == (names = HDmalloc(sizeof(struct mirrortest_filenames)))) + TEST_ERROR; + + /* Create FAPL for Splitter[sec2|mirror] */ + if ((fapl_id = create_mirroring_split_fapl("chunked_write", names, opts)) < 0) TEST_ERROR; - } /* -------------------- */ /* TEST: Create and Close */ - file_id = H5Fcreate(names.rw, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - if (H5I_INVALID_HID == file_id) { + if ((file_id = H5Fcreate(names->rw, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0) TEST_ERROR; - } - if (H5Fclose(file_id) == FAIL) { + if (H5Fclose(file_id) < 0) TEST_ERROR; - } - file_id = H5I_INVALID_HID; /* -------------------- */ /* TEST: Reopen and Write */ - file_id = H5Fopen(names.rw, H5F_ACC_RDWR, fapl_id); - if (H5I_INVALID_HID == file_id) { + if ((file_id = H5Fopen(names->rw, H5F_ACC_RDWR, fapl_id)) < 0) TEST_ERROR; - } - /* Write datasets to file - */ - if (create_datasets(file_id, 0, MAX_DSET_COUNT) == FAIL) { + /* Write datasets to file */ + if (create_datasets(file_id, 0, MAX_DSET_COUNT) < 0) TEST_ERROR; - } - /* Close to 'flush to disk', and reopen file - */ - if (H5Fclose(file_id) == FAIL) { + /* Close to 'flush to disk', and reopen file */ + if (H5Fclose(file_id) < 0) TEST_ERROR; - } - file_id = H5I_INVALID_HID; - /* Reopen file - */ - file_id = H5Fopen(names.rw, H5F_ACC_RDWR, fapl_id); - if (H5I_INVALID_HID == file_id) { + /* Reopen file */ + if ((file_id = H5Fopen(names->rw, H5F_ACC_RDWR, fapl_id)) < 0) TEST_ERROR; - } - /* Verify written data integrity - */ - if (verify_datasets(file_id, 0, MAX_DSET_COUNT) == FAIL) { + /* Verify written data integrity */ + if (verify_datasets(file_id, 0, MAX_DSET_COUNT) < 0) TEST_ERROR; - } - - /* -------------------- */ - /* Standard cleanup */ - if (H5Fclose(file_id) == FAIL) { + /* Cleanup */ + if (H5Fclose(file_id) < 0) + TEST_ERROR; + if (H5Pclose(fapl_id) < 0) TEST_ERROR; - } - file_id = H5I_INVALID_HID; - if (fapl_id != H5P_DEFAULT && fapl_id > 0) { - if (H5Pclose(fapl_id) == FAIL) { - TEST_ERROR; - } - fapl_id = H5I_INVALID_HID; - } /* -------------------- */ /* TEST: Verify that the R/W and W/O files are identical */ - if (h5_compare_file_bytes(names.rw, names.wo) < 0) { + if (h5_compare_file_bytes(names->rw, names->wo) < 0) { TEST_ERROR; } + HDfree(names); + PASSED(); return 0; error: + HDfree(names); H5E_BEGIN_TRY { - (void)H5Fclose(file_id); - if (fapl_id != H5P_DEFAULT && fapl_id > 0) { - (void)H5Pclose(fapl_id); - } + H5Fclose(file_id); + H5Pclose(fapl_id); } H5E_END_TRY; return -1; @@ -2149,100 +1918,82 @@ error: * * Return: Success: 0 * Failure: -1 - * - * Programmer: Jacob Smith - * 2019 * --------------------------------------------------------------------------- */ static int test_on_disk_zoo(const struct mt_opts *opts) { - const char grp_name[] = "/only"; - struct mirrortest_filenames names; - hid_t file_id = H5I_INVALID_HID; - hid_t grp_id = H5I_INVALID_HID; - hid_t fapl_id = H5P_DEFAULT; + const char grp_name[] = "/only"; + struct mirrortest_filenames *names = NULL; + hid_t file_id = H5I_INVALID_HID; + hid_t grp_id = H5I_INVALID_HID; + hid_t fapl_id = H5I_INVALID_HID; TESTING("'Zoo' of on-disk structures"); - /* Create FAPL for Splitter[sec2|mirror] - */ - fapl_id = create_mirroring_split_fapl("zoo", &names, opts); - if (H5I_INVALID_HID == fapl_id) { + if (NULL == (names = HDmalloc(sizeof(struct mirrortest_filenames)))) + TEST_ERROR; + + /* Create FAPL for Splitter[sec2|mirror] */ + if ((fapl_id = create_mirroring_split_fapl("zoo", names, opts)) < 0) TEST_ERROR; - } /* -------------------- */ /* TEST: Create file */ - file_id = H5Fcreate(names.rw, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - if (H5I_INVALID_HID == file_id) { + if ((file_id = H5Fcreate(names->rw, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0) TEST_ERROR; - } - grp_id = H5Gcreate2(file_id, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - if (grp_id == H5I_INVALID_HID) { + if ((grp_id = H5Gcreate2(file_id, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR; - } /* Create datasets in file, close (flush) and reopen, validate. * Use of ( pass ) a conceit required for using create_ and validate_zoo() * from cache_common and/or genall5. */ - if (pass) { + if (pass) create_zoo(file_id, grp_name, 0); - } if (pass) { - if (H5Fclose(file_id) == FAIL) { + if (H5Fclose(file_id) < 0) TEST_ERROR; - } - file_id = H5Fopen(names.rw, H5F_ACC_RDWR, fapl_id); - if (H5I_INVALID_HID == file_id) { + if ((file_id = H5Fopen(names->rw, H5F_ACC_RDWR, fapl_id)) < 0) TEST_ERROR; - } } - if (pass) { + if (pass) validate_zoo(file_id, grp_name, 0); /* sanity-check */ - } if (!pass) { HDprintf("%s", failure_mssg); TEST_ERROR; } - /* -------------------- */ - /* Standard cleanup */ + /* Cleanup */ - if (fapl_id != H5P_DEFAULT && fapl_id >= 0) { - if (H5Pclose(fapl_id) == FAIL) { - TEST_ERROR; - } - } - if (H5Gclose(grp_id) == FAIL) { + if (H5Pclose(fapl_id) < 0) TEST_ERROR; - } - if (H5Fclose(file_id) == FAIL) { + if (H5Gclose(grp_id) < 0) + TEST_ERROR; + if (H5Fclose(file_id) < 0) TEST_ERROR; - } /* -------------------- */ /* TEST: Verify that the R/W and W/O files are identical */ - if (h5_compare_file_bytes(names.rw, names.wo) < 0) { + if (h5_compare_file_bytes(names->rw, names->wo) < 0) TEST_ERROR; - } + + HDfree(names); PASSED(); return 0; error: + HDfree(names); H5E_BEGIN_TRY { - (void)H5Fclose(file_id); - (void)H5Gclose(grp_id); - if (fapl_id != H5P_DEFAULT && fapl_id > 0) { - (void)H5Pclose(fapl_id); - } + H5Fclose(file_id); + H5Gclose(grp_id); + H5Pclose(fapl_id); } H5E_END_TRY; return -1; @@ -2263,146 +2014,122 @@ error: * * Return: Success: 0 * Failure: -1 - * - * Programmer: Jacob Smith - * 2019 * --------------------------------------------------------------------------- */ static int test_vanishing_datasets(const struct mt_opts *opts) { - struct mirrortest_filenames names; - hid_t file_id = H5I_INVALID_HID; - hid_t fapl_id = H5I_INVALID_HID; - hid_t dset_id = H5I_INVALID_HID; - hid_t dspace_id = H5I_INVALID_HID; - hsize_t dims[2] = {DATABUFFER_SIZE, DATABUFFER_SIZE}; - uint32_t buf[DATABUFFER_SIZE][DATABUFFER_SIZE]; /* consider malloc? */ - H5G_info_t group_info; - unsigned int i, j, k; - const unsigned int max_loops = 20; - const unsigned int max_at_one_time = 3; + struct mirrortest_filenames *names = NULL; + hid_t file_id = H5I_INVALID_HID; + hid_t fapl_id = H5I_INVALID_HID; + hid_t dset_id = H5I_INVALID_HID; + hid_t dspace_id = H5I_INVALID_HID; + hsize_t dims[2] = {DATABUFFER_SIZE, DATABUFFER_SIZE}; + H5G_info_t group_info; + unsigned int i, j, k; + const unsigned int max_loops = 20; + const unsigned int max_at_one_time = 3; + struct { + uint32_t arr[DATABUFFER_SIZE][DATABUFFER_SIZE]; + } *buf = NULL; TESTING("Vanishing Datasets"); + if (NULL == (names = HDmalloc(sizeof(struct mirrortest_filenames)))) + TEST_ERROR; + if (NULL == (buf = HDcalloc(1, sizeof(*buf)))) + TEST_ERROR; + /* -------------------- */ /* Set up recurrent data (FAPL, dataspace) */ - /* Create FAPL for Splitter[sec2|mirror] - */ - fapl_id = create_mirroring_split_fapl("vanishing", &names, opts); - if (H5I_INVALID_HID == fapl_id) { + /* Create FAPL for Splitter[sec2|mirror] */ + if ((fapl_id = create_mirroring_split_fapl("vanishing", names, opts)) < 0) TEST_ERROR; - } - dspace_id = H5Screate_simple(2, dims, NULL); - if (dspace_id < 0) { + if ((dspace_id = H5Screate_simple(2, dims, NULL)) < 0) TEST_ERROR; - } - /* create file */ - file_id = H5Fcreate(names.rw, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - if (H5I_INVALID_HID == file_id) { + /* Create file */ + if ((file_id = H5Fcreate(names->rw, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0) TEST_ERROR; - } for (i = 0; i < max_loops; i++) { char namebuf[DSET_NAME_LEN + 1]; - /* deleting datasets */ + /* Delete datasets */ if (i >= max_at_one_time) { - if (HDsnprintf(namebuf, DSET_NAME_LEN, "/dset%02d", (i - max_at_one_time)) > DSET_NAME_LEN) { + if (HDsnprintf(namebuf, DSET_NAME_LEN, "/dset%02d", (i - max_at_one_time)) > DSET_NAME_LEN) TEST_ERROR; - } - if (H5Ldelete(file_id, namebuf, H5P_DEFAULT) < 0) { + if (H5Ldelete(file_id, namebuf, H5P_DEFAULT) < 0) TEST_ERROR; - } - } /* end if deleting a dataset */ + } - /* writing datasets */ + /* Write to datasets */ if (i < (max_loops - max_at_one_time)) { - if (HDsnprintf(namebuf, DSET_NAME_LEN, "/dset%02d", i) > DSET_NAME_LEN) { + if (HDsnprintf(namebuf, DSET_NAME_LEN, "/dset%02d", i) > DSET_NAME_LEN) TEST_ERROR; - } - dset_id = - H5Dcreate2(file_id, namebuf, H5T_STD_U32LE, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - if (H5I_INVALID_HID == dset_id) { + if ((dset_id = H5Dcreate2(file_id, namebuf, H5T_STD_U32LE, dspace_id, H5P_DEFAULT, H5P_DEFAULT, + H5P_DEFAULT)) < 0) TEST_ERROR; - } - for (j = 0; j < DATABUFFER_SIZE; j++) { - for (k = 0; k < DATABUFFER_SIZE; k++) { - buf[j][k] = (uint32_t)i; - } - } + for (j = 0; j < DATABUFFER_SIZE; j++) + for (k = 0; k < DATABUFFER_SIZE; k++) + buf->arr[j][k] = (uint32_t)i; - if (H5Dwrite(dset_id, H5T_STD_U32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) { + if (H5Dwrite(dset_id, H5T_STD_U32LE, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR; - } - if (H5Dclose(dset_id) < 0) { + if (H5Dclose(dset_id) < 0) TEST_ERROR; - } - dset_id = H5I_INVALID_HID; - } /* end if writing a dataset */ + } } /* end for dataset create-destroy cycles */ - if (H5Fclose(file_id) < 0) { + if (H5Fclose(file_id) < 0) TEST_ERROR; - } - file_id = H5I_INVALID_HID; /* verify there are no datasets in file */ - file_id = H5Fopen(names.rw, H5F_ACC_RDONLY, fapl_id); - if (file_id < 0) { + if ((file_id = H5Fopen(names->rw, H5F_ACC_RDONLY, fapl_id)) < 0) TEST_ERROR; - } - if (H5Gget_info(file_id, &group_info) < 0) { + if (H5Gget_info(file_id, &group_info) < 0) TEST_ERROR; - } if (group_info.nlinks > 0) { HDfprintf(stderr, "links in rw file: %" PRIuHSIZE "\n", group_info.nlinks); - HDfflush(stderr); TEST_ERROR; } - if (H5Fclose(file_id) < 0) { + if (H5Fclose(file_id) < 0) TEST_ERROR; - } - file_id = H5Fopen(names.wo, H5F_ACC_RDONLY, fapl_id); - if (file_id < 0) { + if ((file_id = H5Fopen(names->wo, H5F_ACC_RDONLY, fapl_id)) < 0) TEST_ERROR; - } - if (H5Gget_info(file_id, &group_info) < 0) { + if (H5Gget_info(file_id, &group_info) < 0) TEST_ERROR; - } if (group_info.nlinks > 0) { HDfprintf(stderr, "links in wo file: %" PRIuHSIZE "\n", group_info.nlinks); - HDfflush(stderr); TEST_ERROR; } - if (H5Fclose(file_id) < 0) { + if (H5Fclose(file_id) < 0) TEST_ERROR; - } - file_id = H5I_INVALID_HID; - if (h5_compare_file_bytes(names.rw, names.wo) < 0) + if (h5_compare_file_bytes(names->rw, names->wo) < 0) TEST_ERROR; - /* -------------------- */ /* Teardown */ - if (H5Sclose(dspace_id) < 0) { + if (H5Sclose(dspace_id) < 0) TEST_ERROR; - } - if (H5Pclose(fapl_id) < 0) { + if (H5Pclose(fapl_id) < 0) TEST_ERROR; - } + + HDfree(names); + HDfree(buf); PASSED(); return 0; error: + HDfree(names); + HDfree(buf); H5E_BEGIN_TRY { H5Pclose(fapl_id); @@ -2423,9 +2150,6 @@ error: * * Return: Success: 0 * Failure: -1 - * - * Programmer: Jacob Smith - * 2020-03-09 * --------------------------------------------------------------------------- */ static int @@ -2436,7 +2160,10 @@ test_concurrent_access(const struct mt_opts *opts) hid_t dset_id; hid_t fapl_id; hid_t file_id; - } bundle[CONCURRENT_COUNT]; + }; + + struct file_bundle *bundle = NULL; + hid_t dspace_id = H5I_INVALID_HID; hid_t dtype_id = H5T_NATIVE_INT; hsize_t dims[2] = {DATABUFFER_SIZE, DATABUFFER_SIZE}; @@ -2446,7 +2173,10 @@ test_concurrent_access(const struct mt_opts *opts) TESTING("Concurrent opened mirrored files"); - /* blank bundle */ + if (NULL == (bundle = HDmalloc(sizeof(struct file_bundle) * CONCURRENT_COUNT))) + TEST_ERROR; + + /* Initialize bundle */ for (i = 0; i < CONCURRENT_COUNT; i++) { bundle[i].dset_id = H5I_INVALID_HID; bundle[i].fapl_id = H5I_INVALID_HID; @@ -2456,25 +2186,20 @@ test_concurrent_access(const struct mt_opts *opts) *bundle[i].names.log = '\0'; } - /* Create FAPL for Splitter[sec2|mirror] - */ + /* Create FAPL for Splitter[sec2|mirror] */ for (i = 0; i < CONCURRENT_COUNT; i++) { - char _name[16] = ""; - hid_t _fapl_id = H5I_INVALID_HID; - HDsnprintf(_name, 15, "concurrent%d", i); - _fapl_id = create_mirroring_split_fapl(_name, &bundle[i].names, opts); - if (H5I_INVALID_HID == _fapl_id) { + char name[16] = ""; + hid_t fapl_id = H5I_INVALID_HID; + + HDsnprintf(name, 15, "concurrent%d", i); + if ((fapl_id = create_mirroring_split_fapl(name, &bundle[i].names, opts)) < 0) TEST_ERROR; - } - bundle[i].fapl_id = _fapl_id; + bundle[i].fapl_id = fapl_id; } - /* Prepare data to be written - */ - buf = (int *)HDmalloc(DATABUFFER_SIZE * DATABUFFER_SIZE * sizeof(int)); - if (NULL == buf) { + /* Prepare data to be written */ + if (NULL == (buf = HDmalloc(DATABUFFER_SIZE * DATABUFFER_SIZE * sizeof(int)))) TEST_ERROR; - } for (i = 0; i < DATABUFFER_SIZE; i++) { for (j = 0; j < DATABUFFER_SIZE; j++) { int k = i * DATABUFFER_SIZE + j; @@ -2482,76 +2207,59 @@ test_concurrent_access(const struct mt_opts *opts) } } - /* Prepare generic dataspace - */ - dspace_id = H5Screate_simple(2, dims, NULL); - if (H5I_INVALID_HID == dspace_id) { + /* Prepare generic dataspace */ + if ((dspace_id = H5Screate_simple(2, dims, NULL)) < 0) TEST_ERROR; - } /* -------------------- */ /* TEST: Create file and open elements */ for (i = 0; i < CONCURRENT_COUNT; i++) { - hid_t _file_id = H5I_INVALID_HID; - hid_t _dset_id = H5I_INVALID_HID; + hid_t file_id = H5I_INVALID_HID; + hid_t dset_id = H5I_INVALID_HID; - _file_id = H5Fcreate(bundle[i].names.rw, H5F_ACC_TRUNC, H5P_DEFAULT, bundle[i].fapl_id); - if (H5I_INVALID_HID == _file_id) { + if ((file_id = H5Fcreate(bundle[i].names.rw, H5F_ACC_TRUNC, H5P_DEFAULT, bundle[i].fapl_id)) < 0) TEST_ERROR; - } - bundle[i].file_id = _file_id; + bundle[i].file_id = file_id; - _dset_id = - H5Dcreate2(_file_id, "dataset", dtype_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - if (H5I_INVALID_HID == _dset_id) { + if ((dset_id = H5Dcreate2(file_id, "dataset", dtype_id, dspace_id, H5P_DEFAULT, H5P_DEFAULT, + H5P_DEFAULT)) < 0) TEST_ERROR; - } - bundle[i].dset_id = _dset_id; + bundle[i].dset_id = dset_id; } /* -------------------- */ /* TEST: Write to files */ - for (i = 0; i < CONCURRENT_COUNT; i++) { - if (H5Dwrite(bundle[i].dset_id, dtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) == FAIL) { + for (i = 0; i < CONCURRENT_COUNT; i++) + if (H5Dwrite(bundle[i].dset_id, dtype_id, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf) < 0) TEST_ERROR; - } - } /* -------------------- */ /* TEST: Close elements */ for (i = 0; i < CONCURRENT_COUNT; i++) { - if (H5Dclose(bundle[i].dset_id) == FAIL) { + if (H5Dclose(bundle[i].dset_id) < 0) TEST_ERROR; - } - if (H5Fclose(bundle[i].file_id) == FAIL) { + if (H5Fclose(bundle[i].file_id) < 0) TEST_ERROR; - } - if (H5Pclose(bundle[i].fapl_id) == FAIL) { + if (H5Pclose(bundle[i].fapl_id) < 0) TEST_ERROR; - } } - /* -------------------- */ - /* Standard cleanup */ - - HDfree(buf); - buf = NULL; - if (H5Sclose(dspace_id) == FAIL) { + if (H5Sclose(dspace_id) < 0) TEST_ERROR; - } /* -------------------- */ /* TEST: Verify that the R/W and W/O files are identical */ - for (i = 0; i < CONCURRENT_COUNT; i++) { - if (h5_compare_file_bytes(bundle[i].names.rw, bundle[i].names.wo) < 0) { + for (i = 0; i < CONCURRENT_COUNT; i++) + if (h5_compare_file_bytes(bundle[i].names.rw, bundle[i].names.wo) < 0) TEST_ERROR; - } - } + + HDfree(bundle); + HDfree(buf); PASSED(); return 0; @@ -2559,17 +2267,16 @@ test_concurrent_access(const struct mt_opts *opts) error: H5E_BEGIN_TRY { - if (buf) { - HDfree(buf); - } - (void)H5Sclose(dspace_id); + H5Sclose(dspace_id); for (i = 0; i < CONCURRENT_COUNT; i++) { - (void)H5Dclose(bundle[i].dset_id); - (void)H5Fclose(bundle[i].file_id); - (void)H5Pclose(bundle[i].fapl_id); + H5Dclose(bundle[i].dset_id); + H5Fclose(bundle[i].file_id); + H5Pclose(bundle[i].fapl_id); } } H5E_END_TRY; + HDfree(bundle); + HDfree(buf); return -1; } /* end test_concurrent_access() */ @@ -2592,22 +2299,19 @@ parse_args(int argc, char **argv, struct mt_opts *opts) HDstrncpy(opts->ip, SERVER_IP_ADDRESS, H5FD_MIRROR_MAX_IP_LEN); for (i = 1; i < argc; i++) { /* start with first possible option argument */ - if (!HDstrncmp(argv[i], "--ip=", 5)) { + if (!HDstrncmp(argv[i], "--ip=", 5)) HDstrncpy(opts->ip, argv[i] + 5, H5FD_MIRROR_MAX_IP_LEN); - } - else if (!HDstrncmp(argv[i], "--port=", 7)) { + else if (!HDstrncmp(argv[i], "--port=", 7)) opts->portno = HDatoi(argv[i] + 7); - } else { HDprintf("Unrecognized option: '%s'\n", argv[i]); return -1; } } /* end for each argument from command line */ - /* auto-replace 'localhost' with numeric IP */ - if (!HDstrncmp(opts->ip, "localhost", 10)) { /* include null terminator */ + /* Auto-replace 'localhost' with numeric IP */ + if (!HDstrncmp(opts->ip, "localhost", 10)) /* include NUL terminator */ HDstrncpy(opts->ip, "127.0.0.1", H5FD_MIRROR_MAX_IP_LEN); - } return 0; } /* end parse_args() */ @@ -2649,9 +2353,8 @@ confirm_server(struct mt_opts *opts) HDsleep(1); HDprintf("attempt #%u: ERROR connect() (%d)\n%s\n", attempt, errno, HDstrerror(errno)); } - else { + else break; - } } /* Request confirmation from the server */ @@ -2681,13 +2384,10 @@ confirm_server(struct mt_opts *opts) /* --------------------------------------------------------------------------- * Function: main * - * Purpose: Run tests. + * Purpose: Run tests * * Return: Success: 0 * Failure: 1 - * - * Programmer: Jacob Smith - * 2019 * --------------------------------------------------------------------------- */ int @@ -2702,20 +2402,16 @@ main(int argc, char **argv) HDprintf("Testing Mirror VFD functionality.\n"); - /* -------------------- */ /* SETUP */ - /* Create directories for test-generated .h5 files - */ + /* Create directories for test-generated .h5 files */ if (nerrors == 0) { - if ((HDmkdir(MIRROR_RW_DIR, (mode_t)0755) < 0) && (errno != EEXIST)) { + if ((HDmkdir(MIRROR_RW_DIR, (mode_t)0755) < 0) && (errno != EEXIST)) nerrors++; - } } if (nerrors == 0) { - if ((HDmkdir(MIRROR_WO_DIR, (mode_t)0755) < 0) && (errno != EEXIST)) { + if ((HDmkdir(MIRROR_WO_DIR, (mode_t)0755) < 0) && (errno != EEXIST)) nerrors++; - } } if (parse_args(argc, argv, &opts) < 0) { @@ -2728,19 +2424,41 @@ main(int argc, char **argv) HDexit(EXIT_FAILURE); } - /* -------------------- */ /* TESTS */ - /* Tests return negative values; `-=' increments nerrors count */ if (nerrors == 0) { - nerrors -= test_fapl_configuration(); - nerrors -= test_xmit_encode_decode(); - nerrors -= test_create_and_close(&opts); - nerrors -= test_basic_dataset_write(&opts); - nerrors -= test_chunked_dataset_write(&opts); - nerrors -= test_on_disk_zoo(&opts); - nerrors -= test_vanishing_datasets(&opts); - nerrors -= test_concurrent_access(&opts); + H5FD_mirror_xmit_t xmit_mock; /* Re-used header in various xmit tests */ + + /* Set bogus values matching expected; encoding doesn't care + * Use sequential values to easily generate the expected buffer with a + * for loop. + */ + xmit_mock.magic = 0x00010203; + xmit_mock.version = 0x04; + xmit_mock.session_token = 0x05060708; + xmit_mock.xmit_count = 0x090A0B0C; + xmit_mock.op = 0x0D; + + nerrors += test_fapl_configuration() < 0 ? 1 : 0; + + nerrors += test_encdec_uint8_t() < 0 ? 1 : 0; + nerrors += test_encdec_uint16_t() < 0 ? 1 : 0; + nerrors += test_encdec_uint32_t() < 0 ? 1 : 0; + nerrors += test_encdec_uint64_t() < 0 ? 1 : 0; + + nerrors += test_encdec_header(xmit_mock) < 0 ? 1 : 0; + nerrors += test_encdec_set_eoa(xmit_mock) < 0 ? 1 : 0; + nerrors += test_encdec_lock(xmit_mock) < 0 ? 1 : 0; + nerrors += test_encdec_open(xmit_mock) < 0 ? 1 : 0; + nerrors += test_encdec_reply(xmit_mock) < 0 ? 1 : 0; + nerrors += test_encdec_write(xmit_mock) < 0 ? 1 : 0; + + nerrors += test_create_and_close(&opts) < 0 ? 1 : 0; + nerrors += test_basic_dataset_write(&opts) < 0 ? 1 : 0; + nerrors += test_chunked_dataset_write(&opts) < 0 ? 1 : 0; + nerrors += test_on_disk_zoo(&opts) < 0 ? 1 : 0; + nerrors += test_vanishing_datasets(&opts) < 0 ? 1 : 0; + nerrors += test_concurrent_access(&opts) < 0 ? 1 : 0; } if (nerrors) { @@ -2757,7 +2475,6 @@ main(int argc, char **argv) int main(void) { - h5_reset(); HDprintf("Testing Mirror VFD functionality.\n"); HDprintf("SKIPPED - Mirror VFD not built.\n"); return EXIT_SUCCESS; diff --git a/utils/mirror_vfd/mirror_server.c b/utils/mirror_vfd/mirror_server.c index 95480dc..79c9d80 100644 --- a/utils/mirror_vfd/mirror_server.c +++ b/utils/mirror_vfd/mirror_server.c @@ -471,12 +471,13 @@ wait_for_child(int H5_ATTR_UNUSED sig) static int handle_requests(struct server_run *run) { - int connfd = -1; /**/ - char mybuf[H5FD_MIRROR_XMIT_OPEN_SIZE]; /**/ - ssize_t ret; /* general-purpose error-checking */ - int pid; /* process ID of fork */ - struct sigaction sa; - int ret_value = 0; + int connfd = -1; + char *mybuf = NULL; + ssize_t ret; /* general-purpose error-checking */ + int pid; /* process ID of fork */ + struct sigaction sa; + H5FD_mirror_xmit_open_t *xopen = NULL; + int ret_value = 0; if (run == NULL || run->magic != SERVER_RUN_MAGIC) { mirror_log(NULL, V_ERR, "invalid server_run pointer"); @@ -501,6 +502,15 @@ handle_requests(struct server_run *run) return 1; } + if (NULL == (mybuf = HDmalloc(H5FD_MIRROR_XMIT_OPEN_SIZE * sizeof(char)))) { + mirror_log(NULL, V_ERR, "out of memory"); + goto error; + } + if (NULL == (xopen = HDmalloc(sizeof(H5FD_mirror_xmit_open_t)))) { + mirror_log(NULL, V_ERR, "out of memory"); + goto error; + } + /* Keep listening for attempts to connect. */ @@ -518,7 +528,7 @@ handle_requests(struct server_run *run) /* Read handshake from port connection. */ - if ((ret = HDread(connfd, &mybuf, H5FD_MIRROR_XMIT_OPEN_SIZE)) < 0) { + if ((ret = HDread(connfd, mybuf, H5FD_MIRROR_XMIT_OPEN_SIZE)) < 0) { mirror_log(run->loginfo, V_ERR, "read:%d", ret); goto error; } @@ -555,12 +565,11 @@ handle_requests(struct server_run *run) HDclose(connfd); } /* end if "CONFIRM" directive */ else if (H5FD_MIRROR_XMIT_OPEN_SIZE == ret) { - H5FD_mirror_xmit_open_t xopen; mirror_log(run->loginfo, V_INFO, "probable OPEN xmit received"); - H5FD_mirror_xmit_decode_open(&xopen, (const unsigned char *)mybuf); - if (FALSE == H5FD_mirror_xmit_is_open(&xopen)) { + H5FD_mirror_xmit_decode_open(xopen, (const unsigned char *)mybuf); + if (FALSE == H5FD_mirror_xmit_is_open(xopen)) { mirror_log(run->loginfo, V_WARN, "expected OPEN xmit was malformed"); HDclose(connfd); continue; @@ -575,7 +584,7 @@ handle_requests(struct server_run *run) } /* end if fork error */ else if (pid == 0) { /* child process (writer side of fork) */ mirror_log(run->loginfo, V_INFO, "executing writer"); - if (run_writer(connfd, &xopen) < 0) { + if (run_writer(connfd, xopen) < 0) { HDprintf("can't run writer\n"); } else { @@ -605,12 +614,17 @@ done: HDclose(connfd); } + HDfree(mybuf); + HDfree(xopen); + return ret_value; error: if (connfd >= 0) { HDclose(connfd); } + HDfree(mybuf); + HDfree(xopen); return -1; } /* end handle_requests() */ diff --git a/utils/mirror_vfd/mirror_writer.c b/utils/mirror_vfd/mirror_writer.c index a69ea73..ad7cd91 100644 --- a/utils/mirror_vfd/mirror_writer.c +++ b/utils/mirror_vfd/mirror_writer.c @@ -929,25 +929,33 @@ static int process_instructions(struct mirror_session *session) { struct sock_comm comm; - char xmit_buf[H5FD_MIRROR_XMIT_BUFFER_MAX]; /* raw bytes */ - H5FD_mirror_xmit_t xmit_recd; /* for decoded xmit header */ + char *xmit_buf = NULL; /* raw bytes */ + size_t buf_size; + H5FD_mirror_xmit_t xmit_recd; /* for decoded xmit header */ HDassert(session && (session->magic == MW_SESSION_MAGIC)); mirror_log(session->loginfo, V_INFO, "process_instructions()"); + buf_size = H5FD_MIRROR_XMIT_BUFFER_MAX * sizeof(char); + + if (NULL == (xmit_buf = HDmalloc(buf_size))) { + mirror_log(session->loginfo, V_ERR, "out of memory"); + goto error; + } + comm.magic = MW_SOCK_COMM_MAGIC; comm.recd_die = 0; /* Flag for program to terminate */ comm.xmit_recd = &xmit_recd; comm.raw = xmit_buf; - comm.raw_size = sizeof(xmit_buf); + comm.raw_size = buf_size; while (1) { /* sill-listening infinite loop */ /* Use convenience structure for raw/decoded info in/out */ if (receive_communique(session, &comm) < 0) { mirror_log(session->loginfo, V_ERR, "problem reading socket"); - return -1; + goto error; } if (comm.recd_die) { @@ -957,42 +965,42 @@ process_instructions(struct mirror_session *session) switch (xmit_recd.op) { case H5FD_MIRROR_OP_CLOSE: if (do_close(session) < 0) { - return -1; + goto error; } goto done; case H5FD_MIRROR_OP_LOCK: if (do_lock(session, (const unsigned char *)xmit_buf) < 0) { - return -1; + goto error; } break; case H5FD_MIRROR_OP_OPEN: mirror_log(session->loginfo, V_ERR, "OPEN xmit during session"); reply_error(session, "illegal OPEN xmit during session"); - return -1; + goto error; case H5FD_MIRROR_OP_SET_EOA: if (do_set_eoa(session, (const unsigned char *)xmit_buf) < 0) { - return -1; + goto error; } break; case H5FD_MIRROR_OP_TRUNCATE: if (do_truncate(session) < 0) { - return -1; + goto error; } break; case H5FD_MIRROR_OP_UNLOCK: if (do_unlock(session) < 0) { - return -1; + goto error; } break; case H5FD_MIRROR_OP_WRITE: if (do_write(session, (const unsigned char *)xmit_buf) < 0) { - return -1; + goto error; } break; default: mirror_log(session->loginfo, V_ERR, "unrecognized transmission"); reply_error(session, "unrecognized transmission"); - return -1; + goto error; } /* end switch (xmit_recd.op) */ } /* end while still listening */ @@ -1000,7 +1008,12 @@ process_instructions(struct mirror_session *session) done: comm.magic = 0; /* invalidate structure, on principle */ xmit_recd.magic = 0; /* invalidate structure, on principle */ + HDfree(xmit_buf); return 0; + +error: + HDfree(xmit_buf); + return -1; } /* end process_instructions() */ /* --------------------------------------------------------------------------- -- cgit v0.12