summaryrefslogtreecommitdiffstats
path: root/test/vds.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/vds.c')
-rw-r--r--test/vds.c326
1 files changed, 298 insertions, 28 deletions
diff --git a/test/vds.c b/test/vds.c
index 2667e6a..a37f2b0 100644
--- a/test/vds.c
+++ b/test/vds.c
@@ -21,15 +21,26 @@
*/
#include "h5test.h"
#include "H5srcdir.h"
+#include "H5Dprivate.h" /* For H5D_VIRTUAL_DEF_LIST_SIZE */
+
+typedef enum {
+ TEST_API_BASIC,
+ TEST_API_COPY_PLIST,
+ TEST_API_CREATE_DSET,
+ TEST_API_REOPEN_DSET,
+ TEST_API_REOPEN_FILE,
+ TEST_API_NTESTS
+} test_api_config_t;
const char *FILENAME[] = {
"vds_1",
- "vds_2",
- "vds_3",
- "vds_4",
NULL
};
+#define LIST_DOUBLE_SIZE (H5D_VIRTUAL_DEF_LIST_SIZE + 1)
+
+#define FILENAME_BUF_SIZE 1024
+
/*-------------------------------------------------------------------------
* Function: test_api
@@ -47,14 +58,102 @@ const char *FILENAME[] = {
*
*-------------------------------------------------------------------------
*/
+/* Helper function to get DCPL for examination depending on config */
static int
-test_api(void)
+test_api_get_ex_dcpl(test_api_config_t config, hid_t fapl, hid_t dcpl,
+ hid_t *ex_dcpl, hid_t vspace, char *filename)
{
+ hid_t file = -1; /* File */
+ hid_t dset = -1; /* Virtual dataset */
+
+ HDassert((config >= TEST_API_BASIC) && (config < TEST_API_NTESTS));
+ HDassert(fapl >= 0);
+ HDassert(dcpl >= 0);
+ HDassert(ex_dcpl);
+ HDassert(*ex_dcpl < 0);
+ HDassert(vspace >= 0);
+ HDassert(filename);
+
+ /* Take different action depending on test configuration */
+ if(config >= TEST_API_CREATE_DSET) {
+ /* Create file and dataset */
+ if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
+ TEST_ERROR
+ if((dset = H5Dcreate2(file, "vdset", H5T_NATIVE_INT, vspace, H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
+ TEST_ERROR
+
+ /* Reopen dataset if requested */
+ if(config >= TEST_API_REOPEN_DSET) {
+ /* Close dataset */
+ if(H5Dclose(dset) < 0)
+ TEST_ERROR
+ dset = -1;
+
+ /* Reopen file if requested */
+ if(config == TEST_API_REOPEN_FILE) {
+ if(H5Fclose(file) < 0)
+ TEST_ERROR
+ file = -1;
+ if((file = H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0)
+ TEST_ERROR
+ } /* end if */
+
+ /* Open dataset */
+ if((dset = H5Dopen2(file, "vdset", H5P_DEFAULT)) < 0)
+ TEST_ERROR
+ } /* end if */
+
+ /* Get DCPL from dataset */
+ if((*ex_dcpl = H5Dget_create_plist(dset)) < 0)
+ TEST_ERROR
+
+ /* Close dataset and file */
+ if(H5Dclose(dset) < 0)
+ TEST_ERROR
+ dset = -1;
+ if(H5Fclose(file) < 0)
+ TEST_ERROR
+ file = -1;
+ } /* end if */
+ else if(config == TEST_API_COPY_PLIST) {
+ /* Copy property list */
+ if((*ex_dcpl = H5Pcopy(dcpl)) < 0)
+ TEST_ERROR
+ } /* end if */
+ else {
+ /* Simply copy the id to ex_dcpl and increment the ref count so ex_dcpl
+ * can be closed */
+ if(H5Iinc_ref(dcpl) < 0)
+ TEST_ERROR
+ *ex_dcpl = dcpl;
+ } /* end else */
+
+ return 0;
+
+error:
+ H5E_BEGIN_TRY {
+ if(file >= 0)
+ (void)H5Fclose(file);
+ if(dset >= 0)
+ (void)H5Dclose(dset);
+ } H5E_END_TRY;
+
+ return -1;
+} /* end test_api_get_ex_dcpl() */
+
+/* Main test function */
+static int
+test_api(test_api_config_t config, hid_t fapl)
+{
+ char filename[FILENAME_BUF_SIZE];
hid_t dcpl = -1; /* Dataset creation property list */
- hid_t src_space[4] = {-1, -1, -1, -1}; /* Source dataspaces */
+ hid_t ex_dcpl = -1; /* Temporary dcpl for examination */
+ hid_t srcspace[4] = {-1, -1, -1, -1}; /* Source dataspaces */
hid_t vspace[4] = {-1, -1, -1, -1}; /* Virtual dset dataspaces */
- char *src_file[4] = {"src_file1", "src_file2.", "src_file3..", "src_file4..."}; /* Source file names (different lengths) */
- char *src_dset[4] = {"src_dset1....", "src_dset2.....", "src_dset3......", "src_dset4......."}; /* Source dataset names (different lengths) */
+ const char *src_file[4] = {"src_file1", "src_file2.", "src_file3..", "src_file4..."}; /* Source file names (different lengths) */
+ const char *src_dset[4] = {"src_dset1....", "src_dset2.....", "src_dset3......", "src_dset4......."}; /* Source dataset names (different lengths) */
+ char tmp_filename[32];
+ char tmp_dsetname[32];
hsize_t dims[2] = {10, 20}; /* Data space current size */
hsize_t start[2]; /* Hyperslab start */
hsize_t stride[2]; /* Hyperslab stride */
@@ -64,9 +163,31 @@ test_api(void)
ssize_t ssize_out;
hid_t space_out = -1;
char name_out[32];
+ hsize_t blocklist[4];
unsigned i;
- TESTING("virtual dataset API functions");
+ switch(config) {
+ case TEST_API_BASIC:
+ TESTING("virtual dataset API functions")
+ break;
+ case TEST_API_COPY_PLIST:
+ TESTING("virtual dataset API functions with copied plists")
+ break;
+ case TEST_API_CREATE_DSET:
+ TESTING("virtual dataset create")
+ break;
+ case TEST_API_REOPEN_DSET:
+ TESTING("virtual dataset create with reopened dataset")
+ break;
+ case TEST_API_REOPEN_FILE:
+ TESTING("virtual dataset create with reopened file")
+ break;
+ case TEST_API_NTESTS:
+ default:
+ TEST_ERROR
+ } /* end switch */
+
+ h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
/* Create DCPL */
if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
@@ -76,7 +197,7 @@ test_api(void)
* Test 1: All - all selection
*/
/* Create source dataspace */
- if((src_space[0] = H5Screate_simple(2, dims, NULL)) < 0)
+ if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
TEST_ERROR
/* Create virtual dataspace */
@@ -84,23 +205,35 @@ test_api(void)
TEST_ERROR
/* Select all (should not be necessary, but just to be sure) */
- if(H5Sselect_all(src_space[0]) < 0)
+ if(H5Sselect_all(srcspace[0]) < 0)
TEST_ERROR
if(H5Sselect_all(vspace[0]) < 0)
TEST_ERROR
/* Add virtual layout mapping */
- if(H5Pset_virtual(dcpl, vspace[0], src_file[0], src_dset[0], src_space[0]) < 0)
+ if(H5Pset_virtual(dcpl, vspace[0], src_file[0], src_dset[0], srcspace[0]) < 0)
+ TEST_ERROR
+
+ /* Get examination DCPL */
+ if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename) < 0)
TEST_ERROR
+ /* Close dataspaces */
+ if(H5Sclose(srcspace[0]) < 0)
+ TEST_ERROR
+ srcspace[0] = -1;
+ if(H5Sclose(vspace[0]) < 0)
+ TEST_ERROR
+ vspace[0] = -1;
+
/* Test H5Pget_virtual_count */
- if(H5Pget_virtual_count(dcpl, &size_out) < 0)
+ if(H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
TEST_ERROR
if(size_out != 1)
TEST_ERROR
/* Test H5Pget_virtual_vspace */
- if((space_out = H5Pget_virtual_vspace(dcpl, 0)) < 0)
+ if((space_out = H5Pget_virtual_vspace(ex_dcpl, 0)) < 0)
TEST_ERROR
if(H5Sget_select_type(space_out) != H5S_SEL_ALL)
TEST_ERROR
@@ -109,7 +242,7 @@ test_api(void)
space_out = -1;
/* Test H5Pget_virtual_srcspace */
- if((space_out = H5Pget_virtual_srcspace(dcpl, 0)) < 0)
+ if((space_out = H5Pget_virtual_srcspace(ex_dcpl, 0)) < 0)
TEST_ERROR
if(H5Sget_select_type(space_out) != H5S_SEL_ALL)
TEST_ERROR
@@ -118,12 +251,12 @@ test_api(void)
space_out = -1;
/* Test H5Pget_virtual_filename */
- if((ssize_out = H5Pget_virtual_filename(dcpl, 0, NULL, 0)) < 0)
+ if((ssize_out = H5Pget_virtual_filename(ex_dcpl, 0, NULL, 0)) < 0)
TEST_ERROR
if((size_t)ssize_out != HDstrlen(src_file[0]))
TEST_ERROR
HDassert((size_t)ssize_out < sizeof(name_out));
- if((ssize_out = H5Pget_virtual_filename(dcpl, 0, name_out, sizeof(name_out))) < 0)
+ if((ssize_out = H5Pget_virtual_filename(ex_dcpl, 0, name_out, sizeof(name_out))) < 0)
TEST_ERROR
if((size_t)ssize_out != HDstrlen(src_file[0]))
TEST_ERROR
@@ -131,12 +264,12 @@ test_api(void)
TEST_ERROR
/* Test H5Pget_virtual_dsetname */
- if((ssize_out = H5Pget_virtual_dsetname(dcpl, 0, NULL, 0)) < 0)
+ if((ssize_out = H5Pget_virtual_dsetname(ex_dcpl, 0, NULL, 0)) < 0)
TEST_ERROR
if((size_t)ssize_out != HDstrlen(src_dset[0]))
TEST_ERROR
HDassert((size_t)ssize_out < sizeof(name_out));
- if((ssize_out = H5Pget_virtual_dsetname(dcpl, 0, name_out, sizeof(name_out))) < 0)
+ if((ssize_out = H5Pget_virtual_dsetname(ex_dcpl, 0, name_out, sizeof(name_out))) < 0)
TEST_ERROR
if((size_t)ssize_out != HDstrlen(src_dset[0]))
TEST_ERROR
@@ -144,13 +277,146 @@ test_api(void)
TEST_ERROR
/* Close */
- if(H5Sclose(src_space[0]) < 0)
+ if(H5Pclose(ex_dcpl) < 0)
+ TEST_ERROR
+ ex_dcpl = -1;
+
+
+ /*
+ * Test X: Enough Selections to trigger doubling of mapping list
+ */
+ /* Clear virtual layout in DCPL */
+ if(H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
+ TEST_ERROR
+
+ /* Create source dataspace */
+ dims[0] = 1;
+ if((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+ TEST_ERROR
+
+ /* Select all in source space (should not be necessary, but just to be sure) */
+ if(H5Sselect_all(srcspace[0]) < 0)
TEST_ERROR
- src_space[0] = -1;
+
+ /* Create virtual dataspace */
+ dims[0] = LIST_DOUBLE_SIZE;
+ if((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
+ TEST_ERROR
+
+ /* Init hyperslab values */
+ start[0] = 0;
+ start[1] = 0;
+ count[0] = 1;
+ count[1] = 1;
+ block[0] = 1;
+ block[1] = 20;
+
+ /* Build virtual layout */
+ for(i = 0; i < LIST_DOUBLE_SIZE; i++) {
+ /* Select row in virual dataspace */
+ start[0] = (hsize_t)i;
+ if(H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, block) < 0)
+ TEST_ERROR
+
+ /* Create file and dataset names */
+ (void)HDsnprintf(tmp_filename, sizeof(tmp_filename), "src_file%u", i);
+ tmp_filename[sizeof(tmp_filename) - 1] = '\0';
+ (void)HDsnprintf(tmp_dsetname, sizeof(tmp_dsetname), "src_dset%u", i);
+ tmp_dsetname[sizeof(tmp_dsetname) - 1] = '\0';
+
+ /* Add virtual layout mapping */
+ if(H5Pset_virtual(dcpl, vspace[0], tmp_filename, tmp_dsetname, srcspace[0]) < 0)
+ TEST_ERROR
+ } /* end if */
+
+ /* Get examination DCPL */
+ if(test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename) < 0)
+ TEST_ERROR
+
+ /* Close dataspaces */
+ if(H5Sclose(srcspace[0]) < 0)
+ TEST_ERROR
+ srcspace[0] = -1;
if(H5Sclose(vspace[0]) < 0)
TEST_ERROR
vspace[0] = -1;
+ /* Test H5Pget_virtual_count */
+ if(H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
+ TEST_ERROR
+ if(size_out != LIST_DOUBLE_SIZE)
+ TEST_ERROR
+
+ /* Verify virtual layout */
+ for(i = 0; i < LIST_DOUBLE_SIZE; i++) {
+ /* Test H5Pget_virtual_vspace */
+ if((space_out = H5Pget_virtual_vspace(ex_dcpl, i)) < 0)
+ TEST_ERROR
+ if(H5Sget_select_type(space_out) != H5S_SEL_HYPERSLABS)
+ TEST_ERROR
+ if((ssize_out = H5Sget_select_hyper_nblocks(space_out)) < 0)
+ TEST_ERROR
+ if(ssize_out != 1)
+ TEST_ERROR
+ if(H5Sget_select_hyper_blocklist(space_out, 0, 1, blocklist) < 0)
+ TEST_ERROR
+ if(blocklist[0] != (hsize_t)i)
+ TEST_ERROR
+ if(blocklist[1] != 0)
+ TEST_ERROR
+ if(blocklist[2] != (hsize_t)i)
+ TEST_ERROR
+ if(blocklist[3] != 19)
+ TEST_ERROR
+ if(H5Sclose(space_out) < 0)
+ TEST_ERROR
+ space_out = -1;
+
+ /* Test H5Pget_virtual_srcspace */
+ if((space_out = H5Pget_virtual_srcspace(ex_dcpl, i)) < 0)
+ TEST_ERROR
+ if(H5Sget_select_type(space_out) != H5S_SEL_ALL)
+ TEST_ERROR
+ if(H5Sclose(space_out) < 0)
+ TEST_ERROR
+ space_out = -1;
+
+ /* Test H5Pget_virtual_filename */
+ (void)HDsnprintf(tmp_filename, sizeof(tmp_filename), "src_file%u", i);
+ tmp_filename[sizeof(tmp_filename) - 1] = '\0';
+ if((ssize_out = H5Pget_virtual_filename(ex_dcpl, i, NULL, 0)) < 0)
+ TEST_ERROR
+ if((size_t)ssize_out != HDstrlen(tmp_filename))
+ TEST_ERROR
+ HDassert((size_t)ssize_out < sizeof(name_out));
+ if((ssize_out = H5Pget_virtual_filename(ex_dcpl, i, name_out, sizeof(name_out))) < 0)
+ TEST_ERROR
+ if((size_t)ssize_out != HDstrlen(tmp_filename))
+ TEST_ERROR
+ if(HDstrncmp(name_out, tmp_filename, (size_t)ssize_out + 1) != 0)
+ TEST_ERROR
+
+ /* Test H5Pget_virtual_dsetname */
+ (void)HDsnprintf(tmp_dsetname, sizeof(tmp_dsetname), "src_dset%u", i);
+ tmp_dsetname[sizeof(tmp_dsetname) - 1] = '\0';
+ if((ssize_out = H5Pget_virtual_dsetname(ex_dcpl, i, NULL, 0)) < 0)
+ TEST_ERROR
+ if((size_t)ssize_out != HDstrlen(tmp_dsetname))
+ TEST_ERROR
+ HDassert((size_t)ssize_out < sizeof(name_out));
+ if((ssize_out = H5Pget_virtual_dsetname(ex_dcpl, i, name_out, sizeof(name_out))) < 0)
+ TEST_ERROR
+ if((size_t)ssize_out != HDstrlen(tmp_dsetname))
+ TEST_ERROR
+ if(HDstrncmp(name_out, tmp_dsetname, (size_t)ssize_out + 1) != 0)
+ TEST_ERROR
+ } /* end if */
+
+ /* Close */
+ if(H5Pclose(ex_dcpl) < 0)
+ TEST_ERROR
+ ex_dcpl = -1;
+
/* Close */
if(H5Pclose(dcpl) < 0)
@@ -162,9 +428,9 @@ test_api(void)
error:
H5E_BEGIN_TRY {
- for(i = 0; i < (sizeof(src_space) / sizeof(src_space[0])); i++) {
- if(src_space[i] >= 0)
- (void)H5Sclose(src_space[i]);
+ for(i = 0; i < (sizeof(srcspace) / sizeof(srcspace[0])); i++) {
+ if(srcspace[i] >= 0)
+ (void)H5Sclose(srcspace[i]);
if(vspace[i] >= 0)
(void)H5Sclose(vspace[i]);
} /* end for */
@@ -172,6 +438,8 @@ error:
(void)H5Sclose(space_out);
if(dcpl >= 0)
(void)H5Pclose(dcpl);
+ if(ex_dcpl >= 0)
+ (void)H5Pclose(ex_dcpl);
} H5E_END_TRY;
return 1;
@@ -196,7 +464,8 @@ int
main(void)
{
char filename[FILENAME_BUF_SIZE];
- hid_t file, grp, fapl;
+ hid_t fapl;
+ int test_api_config;
int nerrors = 0;
/* Testing setup */
@@ -205,15 +474,16 @@ main(void)
h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
- nerrors += test_api();
+ for(test_api_config = (int)TEST_API_BASIC; test_api_config < (int)TEST_API_NTESTS; test_api_config++)
+ nerrors += test_api((test_api_config_t)test_api_config, fapl);
/* Verify symbol table messages are cached */
- //nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0); VDSINC
+ nerrors += (h5_verify_cached_stabs(FILENAME, fapl) < 0 ? 1 : 0);
if(nerrors)
goto error;
printf("All virtual dataset tests passed.\n");
- //h5_cleanup(FILENAME, fapl); VDSINC
+ h5_cleanup(FILENAME, fapl);
return 0;
@@ -222,5 +492,5 @@ error:
printf("***** %d VIRTUAL DATASET TEST%s FAILED! *****\n",
nerrors, 1 == nerrors ? "" : "S");
return 1;
-}
+}