text: /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
   * Copyright by The HDF Group.                                               *
   * All rights reserved.                                                      *
   *                                                                           *
   * This file is part of HDF5.  The full HDF5 copyright notice, including     *
   * terms governing use, modification, and redistribution, is contained in    *
   * the COPYING file, which can be found at the root of the source code       *
   * distribution tree, or in https://www.hdfgroup.org/licenses.               *
   * If you do not have access to either file, you may request a copy from     *
   * help@hdfgroup.org.                                                        *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  
  /*
   * Programmer:  Neil Fortner
   *              Monday, February 16, 2015
   *
   * Purpose:     Tests datasets with virtual layout.
   */
  #include "h5test.h"
  #include "H5Dprivate.h" /* For H5D_VIRTUAL_DEF_LIST_SIZE */
  
  typedef enum {
      TEST_API_BASIC,
      TEST_API_COPY_PLIST,
      TEST_API_ENCDEC_PLIST,
      TEST_API_CREATE_DSET,
      TEST_API_REOPEN_DSET,
      TEST_API_REOPEN_FILE,
      TEST_API_NTESTS
  } test_api_config_t;
  
  const char *FILENAME[] = {"vds_virt_0", "vds_virt_1", "vds_src_0",  "vds_src_1", "vds%%_src",
                            "vds_dapl",   "vds_virt_2", "vds_virt_3", "vds_src_2", "vds_src_3",
                            "vds%%_src2", "vds_dapl2",  NULL};
  
  /* Define to enable verbose test output */
  /* #define VDS_TEST_VERBOSE 1 */
  
  #ifdef VDS_TEST_VERBOSE
  
  /* For verbose output just use standard error printing */
  #define TESTING_2_SUPPRESSED(WHAT) TESTING_2(WHAT)
  #define PASSED_SUPPRESSED()        PASSED()
  #define TEST_ERROR_SUPPRESSED      TEST_ERROR
  
  /* Print config directly to output */
  #define PRINT_CONFIG(...)                                                                                    \
      {                                                                                                        \
          HDprintf("Config: " __VA_ARGS__);                                                                    \
          HDputs("");                                                                                          \
      }
  
  #else /* VDS_TEST_VERBOSE */
  
  /* Global strings for error output */
  char vds_config_str_g[128] = "";
  char vds_test_str_g[128]   = "";
  
  /* Replacement for TESTING_2 for non-verbose-output */
  #define TESTING_2_SUPPRESSED(WHAT)                                                                           \
      {                                                                                                        \
          HDsnprintf(vds_test_str_g, sizeof(vds_test_str_g), WHAT);                                            \
      }
  
  /* Suppress output from PASSED() */
  #define PASSED_SUPPRESSED()
  
  /* Replacement for TEST_ERROR for non-verbose output */
  #define TEST_ERROR_SUPPRESSED                                                                                \
      {                                                                                                        \
          printf("Failed config: %s\nFailed test: %s\n", vds_config_str_g, vds_test_str_g);                    \
          TEST_ERROR                                                                                           \
      }
  
  /* Replacement for HDprintf for printing configuration for non-verbose output */
  #define PRINT_CONFIG(...) HDsnprintf(vds_config_str_g, sizeof(vds_config_str_g), __VA_ARGS__);
  
  #endif /* VDS_TEST_VERBOSE */
  
  /* I/O test config flags */
  #define TEST_IO_CLOSE_SRC      0x01u
  #define TEST_IO_DIFFERENT_FILE 0x02u
  #define TEST_IO_REOPEN_VIRT    0x04u
  #define TEST_IO_FCLOSE_SEMI    0x08u
  #define TEST_IO_FCLOSE_STRONG  0x10u
  #define TEST_IO_NTESTS         0x20u
  
  #define LIST_DOUBLE_SIZE (H5D_VIRTUAL_DEF_LIST_SIZE + 1)
  
  #define FILENAME_BUF_SIZE 1024
  
  #define TMPDIR "tmp_vds/"
  
  /*-------------------------------------------------------------------------
   * Function:    vds_select_equal
   *
   * Purpose:     Helper function to check if the selections in the two
   *              provided dataspaces are the same.
   *
   * Return:      Success:        0
   *              Failure:        -1
   *-------------------------------------------------------------------------
   */
  static htri_t
  vds_select_equal(hid_t space1, hid_t space2)
  {
      H5S_sel_type type1;
      H5S_sel_type type2;
      hsize_t *    buf1 = NULL;
      hsize_t *    buf2 = NULL;
      size_t       i;
      htri_t       ret_value = TRUE;
  
      /* Get and compare selection types */
      if ((type1 = H5Sget_select_type(space1)) < 0)
          TEST_ERROR
      if ((type2 = H5Sget_select_type(space2)) < 0)
          TEST_ERROR
      if (type1 != type2)
          return FALSE;
  
      /* Check selection type */
      switch (type1) {
          case H5S_SEL_NONE:
          case H5S_SEL_ALL:
              break;
  
          case H5S_SEL_POINTS: {
              int      rank1;
              int      rank2;
              hssize_t npoints1;
              hssize_t npoints2;
  
              /* Get and compare rank */
              if ((rank1 = H5Sget_simple_extent_ndims(space1)) < 0)
                  TEST_ERROR
              if ((rank2 = H5Sget_simple_extent_ndims(space2)) < 0)
                  TEST_ERROR
              if (rank1 != rank2)
                  return FALSE;
  
              /* Get and compare number of points */
              if ((npoints1 = H5Sget_select_elem_npoints(space1)) < 0)
                  TEST_ERROR
              if ((npoints2 = H5Sget_select_elem_npoints(space2)) < 0)
                  TEST_ERROR
              if (npoints1 != npoints2)
                  return FALSE;
  
              /* Allocate point lists.  Do not return directly after
               * allocating, to make sure buffers are freed. */
              if (NULL == (buf1 = (hsize_t *)HDmalloc((size_t)rank1 * (size_t)npoints1 * sizeof(hsize_t))))
                  TEST_ERROR
              if (NULL == (buf2 = (hsize_t *)HDmalloc((size_t)rank1 * (size_t)npoints1 * sizeof(hsize_t))))
                  TEST_ERROR
  
              /* Get and compare point lists */
              if (H5Sget_select_elem_pointlist(space1, (hsize_t)0, (hsize_t)npoints1, buf1) < 0)
                  TEST_ERROR
              if (H5Sget_select_elem_pointlist(space2, (hsize_t)0, (hsize_t)npoints1, buf2) < 0)
                  TEST_ERROR
              for (i = 0; i < ((size_t)rank1 * (size_t)npoints1); i++)
                  if (buf1[i] != buf2[i]) {
                      ret_value = FALSE;
                      break;
                  }
  
              /* Free buffers */
              HDfree(buf1);
              buf1 = NULL;
              HDfree(buf2);
              buf2 = NULL;
          } /* end block */
  
          break;
  
          case H5S_SEL_HYPERSLABS: {
              int      rank1;
              int      rank2;
              hssize_t nblocks1;
              hssize_t nblocks2;
  
              /* Get and compare rank */
              if ((rank1 = H5Sget_simple_extent_ndims(space1)) < 0)
                  TEST_ERROR
              if ((rank2 = H5Sget_simple_extent_ndims(space2)) < 0)
                  TEST_ERROR
              if (rank1 != rank2)
                  return FALSE;
  
              /* Get and compare number of blocks */
              if ((nblocks1 = H5Sget_select_hyper_nblocks(space1)) < 0)
                  TEST_ERROR
              if ((nblocks2 = H5Sget_select_hyper_nblocks(space2)) < 0)
                  TEST_ERROR
              if (nblocks1 != nblocks2)
                  return FALSE;
  
              /* Allocate block lists.  Do not return directly afer
               * allocating, to make sure buffers are freed. */
              if (NULL ==
                  (buf1 = (hsize_t *)HDmalloc((size_t)2 * (size_t)rank1 * (size_t)nblocks1 * sizeof(*buf1))))
                  TEST_ERROR
              if (NULL ==
                  (buf2 = (hsize_t *)HDmalloc((size_t)2 * (size_t)rank1 * (size_t)nblocks1 * sizeof(*buf2))))
                  TEST_ERROR
  
              /* Get and compare block lists */
              if (H5Sget_select_hyper_blocklist(space1, (hsize_t)0, (hsize_t)nblocks1, buf1) < 0)
                  TEST_ERROR
              if (H5Sget_select_hyper_blocklist(space2, (hsize_t)0, (hsize_t)nblocks1, buf2) < 0)
                  TEST_ERROR
              for (i = 0; i < ((size_t)2 * (size_t)rank1 * (size_t)nblocks1); i++)
                  if (buf1[i] != buf2[i]) {
                      ret_value = FALSE;
                      break;
                  }
  
              /* Free buffers */
              HDfree(buf1);
              buf1 = NULL;
              HDfree(buf2);
              buf2 = NULL;
          } /* end block */
  
          break;
  
          case H5S_SEL_ERROR:
          case H5S_SEL_N:
          default:
              TEST_ERROR
      } /* end switch */
  
      return ret_value;
  
  error:
      if (buf1)
          HDfree(buf1);
      if (buf2)
          HDfree(buf2);
  
      return -1;
  } /* end vds_select_equal() */
  
  /*-------------------------------------------------------------------------
   * Function:    vds_check_mapping
   *
   * Purpose:     Helper function to check if the ith virtual mapping in the
   *              provided dcpl is the same as that described by the other
   *              parameters.
   *
   * Return:      Success:        0
   *              Failure:        -1
   *-------------------------------------------------------------------------
   */
  static int
  vds_check_mapping(hid_t dcpl, size_t i, hid_t vspace, hid_t srcspace, const char *filename,
                    const char *dsetname)
  {
      hid_t   space_out = -1;
      char    name_out[32];
      htri_t  tri_ret;
      ssize_t str_len;
  
      HDassert(dcpl >= 0);
      HDassert(vspace >= 0);
      HDassert(srcspace >= 0);
      HDassert(filename);
      HDassert(dsetname);
  
      /* Check vspace */
      if ((space_out = H5Pget_virtual_vspace(dcpl, i)) < 0)
          TEST_ERROR
      if ((tri_ret = H5Sextent_equal(space_out, vspace)) < 0)
          TEST_ERROR
      if (!tri_ret)
          TEST_ERROR
      if ((tri_ret = vds_select_equal(space_out, vspace)) < 0)
          TEST_ERROR
      if (!tri_ret)
          TEST_ERROR
      if (H5Sclose(space_out) < 0)
          TEST_ERROR
      space_out = -1;
  
      /* Check srcspace */
      if ((space_out = H5Pget_virtual_srcspace(dcpl, i)) < 0)
          TEST_ERROR
      if ((tri_ret = vds_select_equal(space_out, srcspace)) < 0)
          TEST_ERROR
      if (!tri_ret)
          TEST_ERROR
      if (H5Sclose(space_out) < 0)
          TEST_ERROR
      space_out = -1;
  
      /* Check filename */
      if ((str_len = H5Pget_virtual_filename(dcpl, i, NULL, (size_t)0)) < 0)
          TEST_ERROR
      if ((size_t)str_len != HDstrlen(filename))
          TEST_ERROR
      HDassert((size_t)str_len < sizeof(name_out));
      if ((str_len = H5Pget_virtual_filename(dcpl, i, name_out, sizeof(name_out))) < 0)
          TEST_ERROR
      if ((size_t)str_len != HDstrlen(filename))
          TEST_ERROR
      if (HDstrncmp(name_out, filename, (size_t)str_len + 1) != 0)
          TEST_ERROR
  
      /* Check dsetname */
      if ((str_len = H5Pget_virtual_dsetname(dcpl, i, NULL, (size_t)0)) < 0)
          TEST_ERROR
      if ((size_t)str_len != HDstrlen(dsetname))
          TEST_ERROR
      HDassert((size_t)str_len < sizeof(name_out));
      if ((str_len = H5Pget_virtual_dsetname(dcpl, i, name_out, sizeof(name_out))) < 0)
          TEST_ERROR
      if ((size_t)str_len != HDstrlen(dsetname))
          TEST_ERROR
      if (HDstrncmp(name_out, dsetname, (size_t)str_len + 1) != 0)
          TEST_ERROR
  
      return 0;
  
  error:
      H5E_BEGIN_TRY { H5Sclose(space_out); }
      H5E_END_TRY
  
      return -1;
  } /* end vds_check_mapping() */
  
  /*-------------------------------------------------------------------------
   * Function:    test_api_get_ex_dcpl
   *
   * Purpose:     Tests API functions related to virtual datasets.
   *
   * Return:      Success:        0
   *              Failure:        number of errors
   *-------------------------------------------------------------------------
   */
  /* Helper function to get DCPL for examination depending on config */
  static int
  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, hsize_t exp_meta_size)
  {
      hid_t              file = -1;        /* File */
      hid_t              dset = -1;        /* Virtual dataset */
      H5D_space_status_t space_status;     /* Dataset space status */
      void *             plist_buf = NULL; /* Serialized property list buffer */
      H5O_native_info_t  ninfo;            /* Object info struct */
      htri_t             tri_ret;
  
      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
  
          /* Test H5Dget_space_status */
          if (H5Dget_space_status(dset, &space_status) < 0)
              TEST_ERROR
          if (space_status != H5D_SPACE_STATUS_ALLOCATED)
              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_RDWR, fapl)) < 0)
                      TEST_ERROR
              }
  
              /* Open dataset */
              if ((dset = H5Dopen2(file, "vdset", H5P_DEFAULT)) < 0)
                  TEST_ERROR
          }
  
          /* Get DCPL from dataset */
          if ((*ex_dcpl = H5Dget_create_plist(dset)) < 0)
              TEST_ERROR
  
          /* Test H5Dget_offset() (just returns HADDR_UNDEF) */
          if (HADDR_UNDEF != H5Dget_offset(dset))
              TEST_ERROR
  
          /* Test H5Oget_info returns correct metadata size */
          if (H5Oget_native_info(dset, &ninfo, H5O_NATIVE_INFO_META_SIZE) < 0)
              TEST_ERROR
          if (ninfo.meta_size.obj.index_size != (hsize_t)0)
              TEST_ERROR
          if (config == TEST_API_REOPEN_FILE) {
              if (ninfo.meta_size.obj.heap_size != exp_meta_size) {
                  HDprintf("VDS metadata size: %llu Expected: %llu\n",
                           (long long unsigned)ninfo.meta_size.obj.heap_size,
                           (long long unsigned)exp_meta_size);
                  TEST_ERROR
              }
          }
          else if ((ninfo.meta_size.obj.heap_size != exp_meta_size) &&
                   (ninfo.meta_size.obj.heap_size != (hsize_t)0))
              TEST_ERROR
          if (ninfo.meta_size.attr.index_size != (hsize_t)0)
              TEST_ERROR
          if (ninfo.meta_size.attr.index_size != (hsize_t)0)
              TEST_ERROR
  
          /* Test H5Dget_space_status */
          if (H5Dget_space_status(dset, &space_status) < 0)
              TEST_ERROR
          if (space_status != H5D_SPACE_STATUS_ALLOCATED)
              TEST_ERROR
  
          /* Close dataset */
          if (H5Dclose(dset) < 0)
              TEST_ERROR
          dset = -1;
  
          /* Delete dataset */
          if (H5Ldelete(file, "vdset", H5P_DEFAULT) < 0)
              TEST_ERROR
  
          /* Close file */
          if (H5Fclose(file) < 0)
              TEST_ERROR
          file = -1;
      }
      else if (config == TEST_API_COPY_PLIST) {
          /* Copy property list */
          if ((*ex_dcpl = H5Pcopy(dcpl)) < 0)
              TEST_ERROR
      }
      else if (config == TEST_API_ENCDEC_PLIST) {
          size_t plist_buf_size;
  
          /* Encode property list to plist_buf */
          if (H5Pencode2(dcpl, NULL, &plist_buf_size, fapl) < 0)
              TEST_ERROR
          if (NULL == (plist_buf = HDmalloc(plist_buf_size)))
              TEST_ERROR
          if (H5Pencode2(dcpl, plist_buf, &plist_buf_size, fapl) < 0)
              TEST_ERROR
  
          /* Decode serialized property list to *ex_dcpl */
          if ((*ex_dcpl = H5Pdecode(plist_buf)) < 0)
              TEST_ERROR
  
          /* Free plist_buf */
          HDfree(plist_buf);
          plist_buf = NULL;
      }
      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;
      }
  
      /* Verify examination DCPL is equal to original DCPL.  Do not compare the
       * plist to itself, and do not do the comparison if we reopened the file,
       * because in that case the extent of the source dset will not be corrent.
       */
      if ((*ex_dcpl != dcpl) && (config != TEST_API_REOPEN_FILE)) {
          if ((tri_ret = H5Pequal(dcpl, *ex_dcpl)) < 0)
              TEST_ERROR
          if (!tri_ret)
              TEST_ERROR
      }
  
      return 0;
  
  error:
      H5E_BEGIN_TRY
      {
          H5Fclose(file);
          H5Dclose(dset);
      }
      H5E_END_TRY;
      if (plist_buf)
          HDfree(plist_buf);
  
      return -1;
  } /* end test_api_get_ex_dcpl() */
  
  /* Main test function */
  static int
  test_api(test_api_config_t config, hid_t fapl, H5F_libver_t low)
  {
      char        filename[FILENAME_BUF_SIZE];
      hid_t       dcpl        = -1;               /* Dataset creation property list */
      hid_t       ex_dcpl     = -1;               /* Temporary dcpl for examination */
      hid_t       srcspace[4] = {-1, -1, -1, -1}; /* Source dataspaces */
      hid_t       vspace[LIST_DOUBLE_SIZE];       /* Virtual dset dataspaces */
      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 */
      hsize_t     count[2];           /* Hyperslab count */
      hsize_t     block[2];           /* Hyperslab block */
      hsize_t     coord[10];          /* Point selection array */
      size_t      size_out;
      herr_t      ret;
      unsigned    i;
  
      /* Initialize vspace */
      for (i = 0; i < (unsigned)(sizeof(vspace) / sizeof(vspace[0])); i++)
          vspace[i] = -1;
  
      switch (config) {
          case TEST_API_BASIC:
              TESTING_2("virtual dataset API functions")
              break;
          case TEST_API_COPY_PLIST:
              TESTING_2("virtual dataset API functions with copied plists")
              break;
          case TEST_API_ENCDEC_PLIST:
              TESTING_2("virtual dataset API functions with encoded and decoded plists")
              break;
          case TEST_API_CREATE_DSET:
              TESTING_2("virtual dataset create")
              break;
          case TEST_API_REOPEN_DSET:
              TESTING_2("virtual dataset create with reopened dataset")
              break;
          case TEST_API_REOPEN_FILE:
              TESTING_2("virtual dataset create with reopened file")
              break;
          case TEST_API_NTESTS:
          default:
              TEST_ERROR
      }
  
      h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
  
      /* Create DCPL */
      if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
          TEST_ERROR
  
      /*
       * Test 1: All - all selection
       */
      /* Create source dataspace */
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Create virtual dataspace */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Select all (should not be necessary, but just to be sure) */
      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], srcspace[0]) < 0)
          TEST_ERROR
  
      /* Get examination DCPL */
      if (test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)69) < 0)
          TEST_ERROR
  
      /* Test H5Pget_virtual_count */
      if (H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
          TEST_ERROR
      if (size_out != (size_t)1)
          TEST_ERROR
  
      /* Check that the mapping in the DCPL is correct */
      if (vds_check_mapping(ex_dcpl, (size_t)0, vspace[0], srcspace[0], src_file[0], src_dset[0]) < 0)
          TEST_ERROR
  
      /* Close */
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR
      vspace[0] = -1;
      if (H5Pclose(ex_dcpl) < 0)
          TEST_ERROR
      ex_dcpl = -1;
  
      /*
       * Test 2: Hyper - hyper selection
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR
  
      /* Create source dataspace */
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Create virtual dataspace */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Select regular hyperslab in source space */
      start[0]  = 2;
      start[1]  = 1;
      stride[0] = 3;
      stride[1] = 5;
      count[0]  = 2;
      count[1]  = 3;
      block[0]  = 2;
      block[1]  = 4;
      if (H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR
  
      /* Select composite hyperslab in virtual space */
      count[0] = 1;
      count[1] = 1;
      block[0] = 5;
      block[1] = 6;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, block) < 0)
          TEST_ERROR
      start[0] = 7;
      start[1] = 0;
      block[0] = 1;
      block[1] = 18;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_OR, start, NULL, count, block) < 0)
          TEST_ERROR
  
      /* Add virtual layout mapping */
      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,
                               (low >= H5F_LIBVER_V112) ? (hsize_t)99 : (low >= H5F_LIBVER_V110 ? 174 : 213)) <
          0)
          TEST_ERROR
  
      /* Test H5Pget_virtual_count */
      if (H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
          TEST_ERROR
      if (size_out != (size_t)1)
          TEST_ERROR
  
      /* Check that the mapping in the DCPL is correct */
      if (vds_check_mapping(ex_dcpl, (size_t)0, vspace[0], srcspace[0], src_file[0], src_dset[0]) < 0)
          TEST_ERROR
  
      /* Close */
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR
      vspace[0] = -1;
      if (H5Pclose(ex_dcpl) < 0)
          TEST_ERROR
      ex_dcpl = -1;
  
  #ifdef VDS_POINT_SELECTIONS /* VDS does not currently support point selections */
      /*
       * Test 3: Point - point selection
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR
  
      /* Create source dataspace */
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Create virtual dataspace */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Select points in source space */
      coord[0] = 5;
      coord[1] = 15;
      coord[2] = 7;
      coord[3] = 19;
      coord[4] = 8;
      coord[5] = 0;
      coord[6] = 2;
      coord[7] = 14;
      coord[8] = 8;
      coord[9] = 18;
      if (H5Sselect_elements(srcspace[0], H5S_SELECT_SET, (size_t)5, coord) < 0)
          TEST_ERROR
  
      /* Select points in virtual space */
      coord[0] = 3;
      coord[1] = 12;
      coord[2] = 7;
      coord[3] = 11;
      coord[4] = 4;
      coord[5] = 9;
      coord[6] = 7;
      coord[7] = 11;
      coord[8] = 5;
      coord[9] = 5;
      if (H5Sselect_elements(vspace[0], H5S_SELECT_SET, (size_t)5, coord) < 0)
          TEST_ERROR
  
      /* Add virtual layout mapping */
      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, (hsize_t)0) < 0)
          TEST_ERROR
  
      /* Test H5Pget_virtual_count */
      if (H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
          TEST_ERROR
      if (size_out != (size_t)1)
          TEST_ERROR
  
      /* Check that the mapping in the DCPL is correct */
      if (vds_check_mapping(ex_dcpl, (size_t)0, vspace[0], srcspace[0], src_file[0], src_dset[0]) < 0)
          TEST_ERROR
  
      /* Close */
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR
      vspace[0] = -1;
      if (H5Pclose(ex_dcpl) < 0)
          TEST_ERROR
      ex_dcpl = -1;
  
      /*
       * Test 4: Point - hyper selection
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR
  
      /* Create source dataspace */
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Create virtual dataspace */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Select hyperslab in source space */
      start[0] = 2;
      start[1] = 7;
      count[0] = 1;
      count[1] = 1;
      block[0] = 1;
      block[1] = 5;
      if (H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, block) < 0)
          TEST_ERROR
  
      /* Select points in virtual space */
      coord[0] = 1;
      coord[1] = 1;
      coord[2] = 4;
      coord[3] = 17;
      coord[4] = 3;
      coord[5] = 9;
      coord[6] = 5;
      coord[7] = 13;
      coord[8] = 7;
      coord[9] = 16;
      if (H5Sselect_elements(vspace[0], H5S_SELECT_SET, (size_t)5, coord) < 0)
          TEST_ERROR
  
      /* Add virtual layout mapping */
      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, (hsize_t)0) < 0)
          TEST_ERROR
  
      /* Test H5Pget_virtual_count */
      if (H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
          TEST_ERROR
      if (size_out != (size_t)1)
          TEST_ERROR
  
      /* Check that the mapping in the DCPL is correct */
      if (vds_check_mapping(ex_dcpl, (size_t)0, vspace[0], srcspace[0], src_file[0], src_dset[0]) < 0)
          TEST_ERROR
  
      /* Close */
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR
      vspace[0] = -1;
      if (H5Pclose(ex_dcpl) < 0)
          TEST_ERROR
      ex_dcpl = -1;
  
      /*
       * Test 5: All previous mappings together
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR
  
      /* Create dataspaces */
      for (i = 0; i < 4; i++) {
          /* Create source dataspace */
          if ((srcspace[i] = H5Screate_simple(2, dims, NULL)) < 0)
              TEST_ERROR
  
          /* Create virtual dataspace */
          if ((vspace[i] = H5Screate_simple(2, dims, NULL)) < 0)
              TEST_ERROR
      }
  
      /* Select all (should not be necessary, but just to be sure) */
      if (H5Sselect_all(srcspace[0]) < 0)
          TEST_ERROR
      if (H5Sselect_all(vspace[0]) < 0)
          TEST_ERROR
  
      /* Select regular hyperslab in source space */
      start[0]  = 2;
      start[1]  = 1;
      stride[0] = 3;
      stride[1] = 5;
      count[0]  = 2;
      count[1]  = 3;
      block[0]  = 2;
      block[1]  = 4;
      if (H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR
  
      /* Select composite hyperslab in virtual space */
      count[0] = 1;
      count[1] = 1;
      block[0] = 5;
      block[1] = 6;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, count, block) < 0)
          TEST_ERROR
      start[0] = 7;
      start[1] = 0;
      block[0] = 1;
      block[1] = 18;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, NULL, count, block) < 0)
          TEST_ERROR
  
      /* Select points in source space */
      coord[0] = 5;
      coord[1] = 15;
      coord[2] = 7;
      coord[3] = 19;
      coord[4] = 8;
      coord[5] = 0;
      coord[6] = 2;
      coord[7] = 14;
      coord[8] = 8;
      coord[9] = 18;
      if (H5Sselect_elements(srcspace[2], H5S_SELECT_SET, (size_t)5, coord) < 0)
          TEST_ERROR
  
      /* Select points in virtual space */
      coord[0] = 3;
      coord[1] = 12;
      coord[2] = 7;
      coord[3] = 11;
      coord[4] = 4;
      coord[5] = 9;
      coord[6] = 7;
      coord[7] = 11;
      coord[8] = 5;
      coord[9] = 5;
      if (H5Sselect_elements(vspace[2], H5S_SELECT_SET, (size_t)5, coord) < 0)
          TEST_ERROR
  
      /* Select hyperslab in source space */
      start[0] = 2;
      start[1] = 7;
      count[0] = 1;
      count[1] = 1;
      block[0] = 1;
      block[1] = 5;
      if (H5Sselect_hyperslab(srcspace[3], H5S_SELECT_SET, start, NULL, count, block) < 0)
          TEST_ERROR
  
      /* Select points in virtual space */
      coord[0] = 1;
      coord[1] = 1;
      coord[2] = 4;
      coord[3] = 17;
      coord[4] = 3;
      coord[5] = 9;
      coord[6] = 5;
      coord[7] = 13;
      coord[8] = 7;
      coord[9] = 16;
      if (H5Sselect_elements(vspace[3], H5S_SELECT_SET, (size_t)5, coord) < 0)
          TEST_ERROR
  
      /* Add virtual layout mappings */
      for (i = 0; i < 4; i++)
          if (H5Pset_virtual(dcpl, vspace[i], src_file[i], src_dset[i], srcspace[i]) < 0)
              TEST_ERROR
  
      /* Get examination DCPL */
      if (test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)0) < 0)
          TEST_ERROR
  
      /* Test H5Pget_virtual_count */
      if (H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
          TEST_ERROR
      if (size_out != (size_t)4)
          TEST_ERROR
  
      /* Check that the mappings in the DCPL are correct */
      for (i = 0; i < 4; i++)
          if (vds_check_mapping(ex_dcpl, (size_t)i, vspace[i], srcspace[i], src_file[i], src_dset[i]) < 0)
              TEST_ERROR
  
      /* Close */
      for (i = 0; i < 4; i++) {
          if (H5Sclose(srcspace[i]) < 0)
              TEST_ERROR
          srcspace[i] = -1;
          if (H5Sclose(vspace[i]) < 0)
              TEST_ERROR
          vspace[i] = -1;
      }
      if (H5Pclose(ex_dcpl) < 0)
          TEST_ERROR
      ex_dcpl = -1;
  
  #else  /* VDS_POINT_SELECTIONS */
  
      /*
       * Test 3: Verify point selections fail
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR
  
      /* Create source dataspace */
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Create virtual dataspace */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Select points in source space */
      coord[0] = 5;
      coord[1] = 15;
      coord[2] = 7;
      coord[3] = 19;
      coord[4] = 8;
      coord[5] = 0;
      coord[6] = 2;
      coord[7] = 14;
      coord[8] = 8;
      coord[9] = 18;
      if (H5Sselect_elements(srcspace[0], H5S_SELECT_SET, (size_t)5, coord) < 0)
          TEST_ERROR
  
      /* Select points in virtual space */
      coord[0] = 3;
      coord[1] = 12;
      coord[2] = 7;
      coord[3] = 11;
      coord[4] = 4;
      coord[5] = 9;
      coord[6] = 7;
      coord[7] = 11;
      coord[8] = 5;
      coord[9] = 5;
      if (H5Sselect_elements(vspace[0], H5S_SELECT_SET, (size_t)5, coord) < 0)
          TEST_ERROR
  
      /* Attempt to add virtual layout mapping */
      H5E_BEGIN_TRY { ret = H5Pset_virtual(dcpl, vspace[0], src_file[0], src_dset[0], srcspace[0]); }
      H5E_END_TRY
      if (ret >= 0)
          TEST_ERROR
  #endif /* VDS_POINT_SELECTIONS */
  
      /*
       * Test 6: 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
  
      /* Init virtual space extent */
      dims[0] = LIST_DOUBLE_SIZE;
  
      /* 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++) {
          /* Create virtual dataspace */
          if ((vspace[i] = H5Screate_simple(2, dims, NULL)) < 0)
              TEST_ERROR
  
          /* Select row in virual dataspace */
          start[0] = (hsize_t)i;
          if (H5Sselect_hyperslab(vspace[i], 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[i], tmp_filename, tmp_dsetname, srcspace[0]) < 0)
              TEST_ERROR
      }
  
      /* Get examination DCPL */
      if (test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename,
                               (low >= H5F_LIBVER_V112) ? (hsize_t)607 : (hsize_t)697) < 0)
          TEST_ERROR
  
      /* Test H5Pget_virtual_count */
      if (H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
          TEST_ERROR
      if (size_out != (size_t)LIST_DOUBLE_SIZE)
          TEST_ERROR
  
      /* Verify virtual layout */
      for (i = 0; i < LIST_DOUBLE_SIZE; i++) {
          /* Generate source file name */
          (void)HDsnprintf(tmp_filename, sizeof(tmp_filename), "src_file%u", i);
          tmp_filename[sizeof(tmp_filename) - 1] = '\0';
  
          /* Generate source dset name */
          (void)HDsnprintf(tmp_dsetname, sizeof(tmp_dsetname), "src_dset%u", i);
          tmp_dsetname[sizeof(tmp_dsetname) - 1] = '\0';
  
          /* Check that the mapping in the DCPL is correct */
          if (vds_check_mapping(ex_dcpl, (size_t)i, vspace[i], srcspace[0], tmp_filename, tmp_dsetname) < 0)
              TEST_ERROR
      }
  
      /* Close */
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR
      srcspace[0] = -1;
      for (i = 0; i < LIST_DOUBLE_SIZE; i++) {
          if (H5Sclose(vspace[i]) < 0)
              TEST_ERROR
          vspace[i] = -1;
      }
      if (H5Pclose(ex_dcpl) < 0)
          TEST_ERROR
      ex_dcpl = -1;
  
      /*
       * Test 7: Empty VDS
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR
  
      /* Create virtual dataspace */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR
  
      /* Select all (should not be necessary, but just to be sure) */
      if (H5Sselect_all(vspace[0]) < 0)
          TEST_ERROR
  
      /* Get examination DCPL */
      if (test_api_get_ex_dcpl(config, fapl, dcpl, &ex_dcpl, vspace[0], filename, (hsize_t)0) < 0)
          TEST_ERROR
  
      /* Test H5Pget_virtual_count */
      if (H5Pget_virtual_count(ex_dcpl, &size_out) < 0)
          TEST_ERROR
      if (size_out != (size_t)0)
          TEST_ERROR
  
      /* Close */
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR
      vspace[0] = -1;
      if (H5Pclose(ex_dcpl) < 0)
          TEST_ERROR
      ex_dcpl = -1;
  
      /* Close */
      if (H5Pclose(dcpl) < 0)
          TEST_ERROR
      dcpl = -1;
  
      PASSED();
      return 0;
  
  error:
      H5E_BEGIN_TRY
      {
          for (i = 0; i < (sizeof(srcspace) / sizeof(srcspace[0])); i++)
              H5Sclose(srcspace[i]);
          for (i = 0; i < (sizeof(vspace) / sizeof(vspace[0])); i++)
              H5Sclose(vspace[i]);
          H5Pclose(dcpl);
          H5Pclose(ex_dcpl);
      }
      H5E_END_TRY;
  
      return 1;
  } /* end test_api() */
  
  /*-------------------------------------------------------------------------
   * Function:    test_vds_prefix_first
   *
   * Purpose:     Set up vds link prefix via H5Pset_virtual_prefix() to be "tmp"
   *        Should be able to access the target source files in tmp directory via the prefix set
   *        by H5Pset_virtual_prefix()
   *
   * Return:      Success:        0
   *              Failure:        -1
   *-------------------------------------------------------------------------
   */
  static int
  test_vds_prefix_first(unsigned config, hid_t vds_fapl, hid_t src_fapl)
  {
      char *      srcfilename             = NULL;
      char *      srcfilename_map         = NULL;
      char *      vfilename               = NULL;
      char *      srcfilenamepct          = NULL;
      char *      srcfilenamepct_map      = NULL;
      const char *srcfilenamepct_map_orig = "vds%%%%_src";
      hid_t       srcfile[4]              = {-1, -1, -1, -1}; /* Files with source dsets */
      hid_t       vfile                   = -1;               /* File with virtual dset */
      hid_t       dcpl                    = -1;               /* Dataset creation property list */
      hid_t       dapl                    = -1;               /* Dataset access property list */
      hid_t       srcspace[4]             = {-1, -1, -1, -1}; /* Source dataspaces */
      hid_t       vspace[4]               = {-1, -1, -1, -1}; /* Virtual dset dataspaces */
      hid_t       memspace                = -1;               /* Memory dataspace */
      hid_t       srcdset[4]              = {-1, -1, -1, -1}; /* Source datsets */
      hid_t       vdset                   = -1;               /* Virtual dataset */
      hsize_t     dims[4]                 = {10, 26, 0, 0};   /* Data space current size */
      int         buf[10][26];                                /* Write and expected read buffer */
      int         rbuf[10][26];                               /* Read buffer */
      int         fill = -1;                                  /* Fill value */
      int         i, j;
      char        buffer[1024]; /* buffer to read vds_prefix       */
  
      TESTING_2_SUPPRESSED("basic virtual dataset I/O via H5Pset_vds_prefix(): all selection")
  
      if ((srcfilename = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilename_map = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((vfilename = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilenamepct = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilenamepct_map = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
  
      h5_fixname(FILENAME[0], vds_fapl, vfilename, FILENAME_BUF_SIZE);
      h5_fixname(FILENAME[8], src_fapl, srcfilename, FILENAME_BUF_SIZE);
      h5_fixname_printf(FILENAME[8], src_fapl, srcfilename_map, FILENAME_BUF_SIZE);
      h5_fixname(FILENAME[10], src_fapl, srcfilenamepct, FILENAME_BUF_SIZE);
      h5_fixname_printf(srcfilenamepct_map_orig, src_fapl, srcfilenamepct_map, FILENAME_BUF_SIZE);
  
      /* create tmp directory and get current working directory path */
      if (HDmkdir(TMPDIR, (mode_t)0755) < 0 && errno != EEXIST)
          TEST_ERROR_SUPPRESSED
  
      /* Create DCPL */
      if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Set fill value */
      if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Initialize VDS prefix items */
      if ((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
          TEST_ERROR_SUPPRESSED
  
      if (H5Pset_virtual_prefix(dapl, TMPDIR) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pget_virtual_prefix(dapl, buffer, sizeof(buffer)) < 0)
          TEST_ERROR_SUPPRESSED
  
      if (HDstrcmp(buffer, TMPDIR) != 0)
          FAIL_PUTS_ERROR("vds prefix not set correctly");
  
      /* Create source dataspace */
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspace */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select all (should not be necessary, but just to be sure) */
      if (H5Sselect_all(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sselect_all(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mapping */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if (NULL == HDgetcwd(buffer, 1024))
              TEST_ERROR_SUPPRESSED
          if (HDchdir(TMPDIR) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if (HDchdir(buffer) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source dataset */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Write data directly to source dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcdset and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data through virtual dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++) {
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != buf[i][j]) {
                  TEST_ERROR_SUPPRESSED
              }
      }
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write data through virtual dataset */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcdset and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (NULL == HDgetcwd(buffer, 1024))
                  TEST_ERROR_SUPPRESSED
              if (HDchdir(TMPDIR) < 0)
                  TEST_ERROR_SUPPRESSED
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
              if (HDchdir(buffer) < 0)
                  TEST_ERROR_SUPPRESSED
          }
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data directly from source dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(srcdset[0], H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != buf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (H5Dclose(srcdset[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[0] = -1;
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(srcfile[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcfile[0] = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Pclose(dapl) < 0)
          TEST_ERROR_SUPPRESSED
      dapl = -1;
      if (H5Pclose(dcpl) < 0)
          TEST_ERROR_SUPPRESSED
      dcpl = -1;
  
      HDfree(srcfilename);
      HDfree(srcfilename_map);
      HDfree(vfilename);
      HDfree(srcfilenamepct);
      HDfree(srcfilenamepct_map);
  
      PASSED_SUPPRESSED();
      return 0;
  
  error:
      H5E_BEGIN_TRY
      {
          for (i = 0; i < (int)(sizeof(srcdset) / sizeof(srcdset[0])); i++)
              H5Dclose(srcdset[i]);
          H5Dclose(vdset);
          for (i = 0; i < (int)(sizeof(srcfile) / sizeof(srcfile[0])); i++)
              H5Fclose(srcfile[i]);
          H5Fclose(vfile);
          for (i = 0; i < (int)(sizeof(srcspace) / sizeof(srcspace[0])); i++)
              H5Sclose(srcspace[i]);
          for (i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++)
              H5Sclose(vspace[i]);
          H5Sclose(memspace);
          H5Pclose(dapl);
          H5Pclose(dcpl);
      }
      H5E_END_TRY;
  
      if (HDsetenv("HDF5_VDS_PREFIX", "", 1) < 0)
          TEST_ERROR_SUPPRESSED
  
      HDfree(srcfilename);
      HDfree(srcfilename_map);
      HDfree(vfilename);
      HDfree(srcfilenamepct);
      HDfree(srcfilenamepct_map);
  
      return 1;
  } /* end test_vds_prefix */
  
  /*-------------------------------------------------------------------------
   * Function:    test_basic_io
   *
   * Purpose:     Tests VDS I/O without unlimited selections or
   *              pattern-matching file/dataset strings
   *
   * Return:      Success:        0
   *              Failure:        number of errors
   *-------------------------------------------------------------------------
   */
  static int
  test_basic_io(unsigned config, hid_t vds_fapl, hid_t src_fapl)
  {
      char *      srcfilename             = NULL;
      char *      srcfilename_map         = NULL;
      char *      vfilename               = NULL;
      char *      vfilename2              = NULL;
      char *      srcfilenamepct          = NULL;
      char *      srcfilenamepct_map      = NULL;
      const char *srcfilenamepct_map_orig = "vds%%%%_src";
      hid_t       srcfile[4]              = {-1, -1, -1, -1}; /* Files with source dsets */
      hid_t       vfile                   = -1;               /* File with virtual dset */
      hid_t       vfile2                  = -1;               /* File with copied virtual dset */
      hid_t       dcpl                    = -1;               /* Dataset creation property list */
      hid_t       srcspace[4]             = {-1, -1, -1, -1}; /* Source dataspaces */
      hid_t       vspace[4]               = {-1, -1, -1, -1}; /* Virtual dset dataspaces */
      hid_t       memspace                = -1;               /* Memory dataspace */
      hid_t       srcdset[4]              = {-1, -1, -1, -1}; /* Source datsets */
      hid_t       vdset                   = -1;               /* Virtual dataset */
      hsize_t     dims[4]                 = {10, 26, 0, 0};   /* Data space current size */
      hsize_t     start[4];                                   /* Hyperslab start */
      hsize_t     stride[4];                                  /* Hyperslab stride */
      hsize_t     count[4];                                   /* Hyperslab count */
      hsize_t     block[4];                                   /* Hyperslab block */
      hssize_t    offset[2] = {0, 0};                         /* Selection offset */
      int         buf[10][26];                                /* Write and expected read buffer */
      int         rbuf[10][26];                               /* Read buffer */
      int         rbuf99[9][9];                               /* 9x9 Read buffer */
      int         evbuf[10][26];                              /* Expected VDS "buffer" */
      int         erbuf[10][26];                              /* Expected read buffer */
      int         fill = -1;                                  /* Fill value */
      herr_t      ret;                                        /* Generic return value */
      int         i, j, u, v;
  
      TESTING_2_SUPPRESSED("basic virtual dataset I/O")
  
      if ((srcfilename = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilename_map = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((vfilename = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((vfilename2 = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilenamepct = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilenamepct_map = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
  
      h5_fixname(FILENAME[0], vds_fapl, vfilename, FILENAME_BUF_SIZE);
      h5_fixname(FILENAME[1], vds_fapl, vfilename2, FILENAME_BUF_SIZE);
      h5_fixname(FILENAME[2], src_fapl, srcfilename, FILENAME_BUF_SIZE);
      h5_fixname_printf(FILENAME[2], src_fapl, srcfilename_map, FILENAME_BUF_SIZE);
      h5_fixname(FILENAME[4], src_fapl, srcfilenamepct, FILENAME_BUF_SIZE);
      h5_fixname_printf(srcfilenamepct_map_orig, src_fapl, srcfilenamepct_map, FILENAME_BUF_SIZE);
  
      /* Create DCPL */
      if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Set fill value */
      if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill) < 0)
          TEST_ERROR_SUPPRESSED
  
      /*
       * Test 1: All - all selection
       */
      /* Create source dataspace */
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspace */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select all (should not be necessary, but just to be sure) */
      if (H5Sselect_all(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sselect_all(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mapping */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source dataset */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Write data directly to source dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcdset and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data through virtual dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != buf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write data through virtual dataset */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcdset and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data directly from source dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(srcdset[0], H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != buf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (H5Dclose(srcdset[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[0] = -1;
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(srcfile[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcfile[0] = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
  
      /*
       * Test 2: 2 Source datasets, hyperslab virtual mappings, '%' in source
       * dataset name, also test H5Ocopy()
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[1] = 13;
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select all in source space (should not be necessary, but just to be sure)
       */
      if (H5Sselect_all(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 13;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "%%src_dset1", srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "src_dset2%%", srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset dims */
      dims[1] = 26;
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "%src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2%", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Write data directly to source datasets */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data through virtual dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != buf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write data through virtual dataset */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "%src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2%", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data directly from source datasets */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dread(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != buf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Test H5Ocopy() to same file */
      /* Copy virtual dataset */
      if (H5Ocopy(vfile, "v_dset", vfile, "v_dset2", H5P_DEFAULT, H5P_DEFAULT) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close v_dset */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write data directly to source datasets */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Open v_dset2 */
      if ((vdset = H5Dopen2(vfile, "v_dset2", H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through copied virtual dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != buf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Reopen srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "%src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2%", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Only copy to a different file if the source datasets are in a different
       * file */
      if (config & TEST_IO_DIFFERENT_FILE) {
          /* Close v_dset2 */
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
  
          /* Create file to copy virtual dataset to */
          if ((vfile2 = H5Fcreate(vfilename2, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Copy virtual dataset */
          if (H5Ocopy(vfile, "v_dset", vfile2, "v_dset3", H5P_DEFAULT, H5P_DEFAULT) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Adjust write buffer */
          for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
              for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
                  buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
          /* Write data directly to source datasets */
          if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
              TEST_ERROR_SUPPRESSED
          if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Close srcdsets and srcfile if config option specified */
          if (config & TEST_IO_CLOSE_SRC) {
              if (H5Dclose(srcdset[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[0] = -1;
              if (H5Dclose(srcdset[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[1] = -1;
  
              if (config & TEST_IO_DIFFERENT_FILE) {
                  if (H5Fclose(srcfile[0]) < 0)
                      TEST_ERROR_SUPPRESSED
                  srcfile[0] = -1;
              }
          }
  
          /* Reopen copied virtual file if config option specified */
          if (config & TEST_IO_REOPEN_VIRT) {
              if (H5Fclose(vfile2) < 0)
                  TEST_ERROR_SUPPRESSED
              vfile2 = -1;
              if ((vfile2 = H5Fopen(vfilename2, H5F_ACC_RDWR, vds_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          }
  
          /* Open v_dset3 */
          if ((vdset = H5Dopen2(vfile2, "v_dset3", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through copied virtual dataset */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
          if (H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
              for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
                  if (rbuf[i][j] != buf[i][j])
                      TEST_ERROR_SUPPRESSED
  
          /* Reopen srcdsets and srcfile if config option specified */
          if (config & TEST_IO_CLOSE_SRC) {
              if (config & TEST_IO_DIFFERENT_FILE)
                  if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, src_fapl)) < 0)
                      TEST_ERROR_SUPPRESSED
              if ((srcdset[0] = H5Dopen2(srcfile[0], "%src_dset1", H5P_DEFAULT)) < 0)
                  TEST_ERROR_SUPPRESSED
              if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2%", H5P_DEFAULT)) < 0)
                  TEST_ERROR_SUPPRESSED
          }
      }
  
      /* Close */
      if (H5Dclose(srcdset[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[0] = -1;
      if (H5Dclose(srcdset[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[1] = -1;
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(srcfile[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcfile[0] = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (vfile2 >= 0 && H5Fclose(vfile2) < 0)
          TEST_ERROR_SUPPRESSED
      vfile2 = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
  
      /*
       * Test 3: 2 Source datasets, hyperslab virtual mappings with offsets
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[1] = 13;
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select all in source space (should not be necessary, but just to be sure)
       */
      if (H5Sselect_all(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      start[0] = 0;
      start[1] = 3;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      offset[1] = -3;
      if (H5Soffset_simple(vspace[0], offset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "%%src_dset1", srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      offset[1] = 10;
      if (H5Soffset_simple(vspace[0], offset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "src_dset2%%", srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset dims */
      dims[1] = 26;
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "%src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2%", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Write data directly to source datasets */
      offset[1] = -3;
      if (H5Soffset_simple(vspace[0], offset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      offset[1] = 10;
      if (H5Soffset_simple(vspace[0], offset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data through virtual dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != buf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write data through virtual dataset */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "%src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2%", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data directly from source datasets */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      offset[1] = -3;
      if (H5Soffset_simple(vspace[0], offset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dread(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      offset[1] = 10;
      if (H5Soffset_simple(vspace[0], offset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dread(srcdset[1], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != buf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (H5Dclose(srcdset[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[0] = -1;
      if (H5Dclose(srcdset[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[1] = -1;
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(srcfile[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcfile[0] = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
  
      /*
       * Test 4: 2 Source datasets, hyperslab virtual mappings on one mapping at a
       * time, '%' in source file name
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[1] = 13;
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select all in source space (should not be necessary, but just to be sure)
       */
      if (H5Sselect_all(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 13;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilenamepct_map : ".",
                         "src_dset1", srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilenamepct_map : ".",
                         "src_dset2", srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset dims */
      dims[1] = 26;
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilenamepct, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Write data directly to source datasets */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read first source dataset through virtual dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(vdset, H5T_NATIVE_INT, vspace[0], vspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != (j < (int)(sizeof(buf[0]) / sizeof(buf[0][0]) / 2) ? buf[i][j] : 0))
                  TEST_ERROR_SUPPRESSED
  
      /* Read second source dataset through virtual dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(vdset, H5T_NATIVE_INT, vspace[1], vspace[1], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != (j < (int)(sizeof(buf[0]) / sizeof(buf[0][0]) / 2) ? 0 : buf[i][j]))
                  TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write first source dataset through virtual dataset */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, vspace[0], vspace[0], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write second source dataset through virtual dataset */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, vspace[1], vspace[1], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilenamepct, H5F_ACC_RDONLY, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data directly from source datasets */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(srcdset[0], H5T_NATIVE_INT, vspace[0], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dread(srcdset[1], H5T_NATIVE_INT, vspace[1], H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != (j < (int)(sizeof(buf[0]) / sizeof(buf[0][0]) / 2)
                                     ? (buf[i][j] - (int)(sizeof(buf) / sizeof(buf[0][0])))
                                     : buf[i][j]))
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (H5Dclose(srcdset[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[0] = -1;
      if (H5Dclose(srcdset[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[1] = -1;
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(srcfile[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcfile[0] = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
  
      /*
       * Test 5: 2 Source datasets, hyperslab virtual mappings and selections
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspaces */
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in source space */
      start[0] = 0;
      start[1] = 0;
      count[0] = 10;
      count[1] = 13;
      if (H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 13;
      if (H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      start[0] = 0;
      start[1] = 0;
      count[0] = 5;
      count[1] = 26;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 5;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2",
                         srcspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[1], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Write data directly to source datasets */
      /* Write first dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update evbuf */
      for (i = 0; i < 5; i++) {
          for (j = 0; j < 13; j++)
              evbuf[i][j] = buf[2 * i][j];
          for (/* j = 13 */; j < 26; j++)
              evbuf[i][j] = buf[2 * i + 1][j - 13];
      }
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write second dataset */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update evbuf */
      for (i = 0; i < 5; i++) {
          for (j = 0; j < 13; j++)
              evbuf[i + 5][j] = buf[2 * i][j + 13];
          for (/* j = 13 */; j < 26; j++)
              evbuf[i + 5][j] = buf[2 * i + 1][j];
      }
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data through virtual dataset by hyperslab */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Read first slice */
      if (H5Dread(vdset, H5T_NATIVE_INT, vspace[0], srcspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++) {
          for (j = 0; j < 13; j++)
              erbuf[i][j] = evbuf[2 * i][j];
          for (/* j = 13 */; j < 26; j++)
              erbuf[i][j] = evbuf[2 * i + 1][j - 13];
      }
  
      /* Read second slice */
      if (H5Dread(vdset, H5T_NATIVE_INT, vspace[1], srcspace[1], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++) {
          for (j = 0; j < 13; j++)
              erbuf[i + 5][j] = evbuf[2 * i][j + 13];
          for (/* j = 13 */; j < 26; j++)
              erbuf[i + 5][j] = evbuf[2 * i + 1][j];
      }
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write data through virtual dataset */
      /* Write first slice */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, vspace[0], srcspace[0], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update evbuf */
      for (i = 0; i < 5; i++) {
          for (j = 0; j < 13; j++)
              evbuf[2 * i][j] = buf[i][j];
          for (/* j = 13 */; j < 26; j++)
              evbuf[2 * i + 1][j - 13] = buf[i][j];
      }
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write second slice */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, vspace[1], srcspace[1], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update evbuf */
      for (i = 0; i < 5; i++) {
          for (j = 0; j < 13; j++)
              evbuf[2 * i][j + 13] = buf[i + 5][j];
          for (/* j = 13 */; j < 26; j++)
              evbuf[2 * i + 1][j] = buf[i + 5][j];
      }
  
      /* Reopen srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data directly from source datasets */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Read first dataset */
      if (H5Dread(srcdset[0], H5T_NATIVE_INT, srcspace[0], srcspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++) {
          for (j = 0; j < 13; j++)
              erbuf[2 * i][j] = evbuf[i][j];
          for (/* j = 13 */; j < 26; j++)
              erbuf[2 * i + 1][j - 13] = evbuf[i][j];
      }
  
      /* Read second dataset */
      if (H5Dread(srcdset[1], H5T_NATIVE_INT, srcspace[1], srcspace[1], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++) {
          for (j = 0; j < 13; j++)
              erbuf[2 * i][j + 13] = evbuf[i + 5][j];
          for (/* j = 13 */; j < 26; j++)
              erbuf[2 * i + 1][j] = evbuf[i + 5][j];
      }
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (H5Dclose(srcdset[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[0] = -1;
      if (H5Dclose(srcdset[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[1] = -1;
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(srcfile[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcfile[0] = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(srcspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[1] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
  
      /*
       * Test 6: 2 Source datasets, checkerboard/stripe pattern to trigger
       * sequence list refresh internally
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create memory dataspace */
      if ((memspace = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      dims[1] = 52;
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace and file space for second operation (srcspace[1])
       */
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset dims */
      dims[1] = 26;
  
      /* Select hyperslabs (stripe) in source space and file space for second
       * operation (srcspace[1]) */
      start[0]  = 0;
      start[1]  = 0;
      stride[0] = 1;
      stride[1] = 2;
      count[0]  = 1;
      count[1]  = 26;
      block[0]  = 10;
      block[1]  = 1;
      if (H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 1;
      if (H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs (checkerboard) in virtual spaces */
      start[0]  = 0;
      start[1]  = 0;
      stride[0] = 2;
      stride[1] = 2;
      count[0]  = 5;
      count[1]  = 26;
      block[0]  = 1;
      block[1]  = 1;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 1;
      start[1] = 1;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_OR, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 0;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 1;
      start[1] = 0;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Write data directly to source datasets */
      /* Write first dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i += 2)
          for (j = 0; j < 26; j++)
              erbuf[i][j] = buf[i][j];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write second dataset */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 1; i < 10; i += 2)
          for (j = 0; j < 26; j++)
              erbuf[i][j] = buf[i][j];
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data through virtual dataset by hyperslab */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Read first stripe pattern */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Read second stripe pattern */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, srcspace[1], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i += 2)
          for (j = 0; j < 26; j++) {
              erbuf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
              erbuf[i + 1][j] -= (int)(sizeof(buf) / sizeof(buf[0][0]));
          }
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write data through virtual dataset */
      /* Write first slice */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i += 2)
          for (j = 0; j < 26; j++)
              erbuf[i][j] = buf[i][j];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write second slice */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, memspace, srcspace[1], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 1; i < 10; i += 2)
          for (j = 0; j < 26; j++)
              erbuf[i][j] = buf[i][j];
  
      /* Reopen srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data directly from source datasets */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Read first dataset */
      if (H5Dread(srcdset[0], H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i += 2)
          for (j = 0; j < 26; j++) {
              erbuf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
              erbuf[i + 1][j] -= (int)(sizeof(buf) / sizeof(buf[0][0]));
          }
  
      /* Read second dataset */
      if (H5Dread(srcdset[1], H5T_NATIVE_INT, memspace, srcspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (H5Dclose(srcdset[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[0] = -1;
      if (H5Dclose(srcdset[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[1] = -1;
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(srcfile[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcfile[0] = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(srcspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[1] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
      if (H5Sclose(memspace) < 0)
          TEST_ERROR_SUPPRESSED
      memspace = -1;
  
      /*
       * Test 7: 1 Source dataset, two mappings, 4 dimensional virtual dataset
       * and 3 dimensional source dataset
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create memory dataspace */
      if ((memspace = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      dims[0] = 3;
      dims[1] = 3;
      dims[2] = 3;
      dims[3] = 3;
      if ((vspace[0] = H5Screate_simple(4, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(4, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspaces */
      dims[0] = 2;
      dims[1] = 4;
      dims[2] = 4;
      if ((srcspace[0] = H5Screate_simple(3, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcspace[1] = H5Screate_simple(3, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset dims */
      dims[0] = 10;
      dims[1] = 26;
  
      /* Select hyperslabs (stripes) in source spaces */
      start[0]  = 0;
      start[1]  = 0;
      start[2]  = 0;
      stride[0] = 1;
      stride[1] = 2;
      stride[2] = 1;
      count[0]  = 1;
      count[1]  = 2;
      count[2]  = 1;
      block[0]  = 2;
      block[1]  = 1;
      block[2]  = 4;
      if (H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 1;
      if (H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs (corners) in first virtual space */
      start[0]  = 0;
      start[1]  = 0;
      start[2]  = 0;
      start[3]  = 0;
      stride[0] = 2;
      stride[1] = 2;
      stride[2] = 2;
      stride[3] = 2;
      count[0]  = 2;
      count[1]  = 2;
      count[2]  = 2;
      count[3]  = 2;
      block[0]  = 1;
      block[1]  = 1;
      block[2]  = 1;
      block[3]  = 1;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs ("+" pattern) in second virtual space */
      start[0]  = 1;
      start[1]  = 1;
      start[2]  = 0;
      start[3]  = 0;
      stride[0] = 2;
      stride[1] = 2;
      stride[2] = 2;
      stride[3] = 2;
      count[0]  = 1;
      count[1]  = 1;
      count[2]  = 2;
      count[3]  = 2;
      block[0]  = 1;
      block[1]  = 1;
      block[2]  = 1;
      block[3]  = 1;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 0;
      start[2] = 1;
      count[1] = 2;
      count[2] = 1;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 0;
      start[1] = 1;
      count[0] = 2;
      count[1] = 1;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 1;
      count[0] = 1;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 0;
      start[3] = 1;
      count[1] = 2;
      count[3] = 1;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_OR, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source dataset */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      count[0] = 2;
      count[1] = 16;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write data directly to source dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcdset and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      count[0] = 9;
      count[1] = 3;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset by hyperslab */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select stripe */
      start[0] = 0;
      start[1] = 0;
      start[2] = 0;
      start[3] = 0;
      count[0] = 3;
      count[1] = 3;
      count[2] = 1;
      count[3] = 3;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read first stripe pattern */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      HDmemset(erbuf, 0, sizeof(erbuf));
      for (i = 0; i < 9; i++)
          for (j = 0; j < 3; j++)
              erbuf[i][j] = fill;
      erbuf[0][0] = buf[0][0];
      erbuf[0][2] = buf[0][1];
      erbuf[2][0] = buf[0][8];
      erbuf[2][2] = buf[0][9];
      erbuf[6][0] = buf[1][0];
      erbuf[6][2] = buf[1][1];
      erbuf[8][0] = buf[1][8];
      erbuf[8][2] = buf[1][9];
      erbuf[4][0] = buf[0][13];
      erbuf[4][2] = buf[0][14];
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select stripe */
      start[0] = 0;
      start[1] = 0;
      start[2] = 1;
      start[3] = 0;
      count[0] = 3;
      count[1] = 3;
      count[2] = 1;
      count[3] = 3;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 3;
      count[0] = 9;
      count[1] = 3;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read second stripe pattern */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 9; i++)
          for (j = 3; j < 6; j++)
              erbuf[i][j] = fill;
      erbuf[1][3] = buf[0][4];
      erbuf[1][5] = buf[0][5];
      erbuf[3][3] = buf[0][6];
      erbuf[3][4] = buf[0][7];
      erbuf[3][5] = buf[0][12];
      erbuf[4][3] = buf[0][15];
      erbuf[4][5] = buf[1][4];
      erbuf[5][3] = buf[1][7];
      erbuf[5][4] = buf[1][12];
      erbuf[5][5] = buf[1][13];
      erbuf[7][3] = buf[1][14];
      erbuf[7][5] = buf[1][15];
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if ((j >= 3) && (j < 6)) {
                  if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select stripe */
      start[0] = 0;
      start[1] = 0;
      start[2] = 2;
      start[3] = 0;
      count[0] = 3;
      count[1] = 3;
      count[2] = 1;
      count[3] = 3;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 6;
      count[0] = 9;
      count[1] = 3;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read third stripe pattern */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 9; i++)
          for (j = 6; j < 9; j++)
              erbuf[i][j] = fill;
      erbuf[0][6] = buf[0][2];
      erbuf[0][8] = buf[0][3];
      erbuf[2][6] = buf[0][10];
      erbuf[2][8] = buf[0][11];
      erbuf[6][6] = buf[1][2];
      erbuf[6][8] = buf[1][3];
      erbuf[8][6] = buf[1][10];
      erbuf[8][8] = buf[1][11];
      erbuf[4][6] = buf[1][5];
      erbuf[4][8] = buf[1][6];
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if ((j >= 6) && (j < 9)) {
                  if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Now read entire VDS */
      /* Set memory space extent to 9x9, select all in order to reach part of the
       * code in H5S_select_subtract() */
      dims[0] = 9;
      dims[1] = 9;
      if (H5Sset_extent_simple(memspace, 2, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sselect_all(memspace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read third stripe pattern */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf99[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(rbuf99) / sizeof(rbuf99[0])); i++)
          for (j = 0; j < (int)(sizeof(rbuf99[0]) / sizeof(rbuf99[0][0])); j++)
              if (rbuf99[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Write data through virtual dataset by hyperslab */
      /* Select stripe (only select mapped elements) */
      start[0]  = 0;
      start[1]  = 0;
      start[2]  = 0;
      start[3]  = 0;
      stride[0] = 2;
      stride[1] = 2;
      stride[2] = 1;
      stride[3] = 2;
      count[0]  = 2;
      count[1]  = 2;
      count[2]  = 1;
      count[3]  = 2;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0]  = 1;
      start[1]  = 1;
      start[2]  = 0;
      start[3]  = 0;
      stride[0] = 1;
      stride[1] = 1;
      stride[2] = 1;
      stride[3] = 2;
      count[0]  = 1;
      count[1]  = 1;
      count[2]  = 1;
      count[3]  = 2;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_OR, start, stride, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset extent of memspace, select hyperslab */
      dims[0] = 10;
      dims[1] = 26;
      if (H5Sset_extent_simple(memspace, 2, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 0;
      start[1] = 0;
      count[0] = 1;
      count[1] = 10;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write data through virtual dataset by hyperslab */
      /* Write first stripe pattern */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      HDmemset(erbuf, 0, sizeof(erbuf));
      erbuf[0][0]  = buf[0][0];
      erbuf[0][1]  = buf[0][1];
      erbuf[0][8]  = buf[0][2];
      erbuf[0][9]  = buf[0][3];
      erbuf[1][0]  = buf[0][6];
      erbuf[1][1]  = buf[0][7];
      erbuf[1][8]  = buf[0][8];
      erbuf[1][9]  = buf[0][9];
      erbuf[0][13] = buf[0][4];
      erbuf[0][14] = buf[0][5];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Select stripe (only select mapped elements) */
      start[0]  = 0;
      start[1]  = 1;
      start[2]  = 1;
      start[3]  = 0;
      stride[0] = 1;
      stride[1] = 1;
      stride[2] = 1;
      stride[3] = 2;
      count[0]  = 3;
      count[1]  = 1;
      count[2]  = 1;
      count[3]  = 2;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0]  = 1;
      start[1]  = 0;
      start[2]  = 1;
      start[3]  = 0;
      stride[0] = 1;
      stride[1] = 2;
      stride[2] = 1;
      stride[3] = 1;
      count[0]  = 1;
      count[1]  = 2;
      count[2]  = 1;
      count[3]  = 3;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_OR, start, stride, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      count[0] = 1;
      count[1] = 12;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write second slice */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      erbuf[0][4]  = buf[0][0];
      erbuf[0][5]  = buf[0][1];
      erbuf[0][6]  = buf[0][2];
      erbuf[0][7]  = buf[0][3];
      erbuf[0][12] = buf[0][4];
      erbuf[0][15] = buf[0][5];
      erbuf[1][4]  = buf[0][6];
      erbuf[1][7]  = buf[0][7];
      erbuf[1][12] = buf[0][8];
      erbuf[1][13] = buf[0][9];
      erbuf[1][14] = buf[0][10];
      erbuf[1][15] = buf[0][11];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] += (int)(sizeof(buf) / sizeof(buf[0][0]));
  
      /* Select stripe (only select mapped elements) */
      start[0]  = 0;
      start[1]  = 0;
      start[2]  = 2;
      start[3]  = 0;
      stride[0] = 2;
      stride[1] = 2;
      stride[2] = 1;
      stride[3] = 2;
      count[0]  = 2;
      count[1]  = 2;
      count[2]  = 1;
      count[3]  = 2;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0]  = 1;
      start[1]  = 1;
      start[2]  = 2;
      start[3]  = 0;
      stride[0] = 1;
      stride[1] = 1;
      stride[2] = 1;
      stride[3] = 2;
      count[0]  = 1;
      count[1]  = 1;
      count[2]  = 1;
      count[3]  = 2;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_OR, start, stride, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      count[0] = 1;
      count[1] = 10;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write third slice */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      erbuf[0][2]  = buf[0][0];
      erbuf[0][3]  = buf[0][1];
      erbuf[0][10] = buf[0][2];
      erbuf[0][11] = buf[0][3];
      erbuf[1][2]  = buf[0][6];
      erbuf[1][3]  = buf[0][7];
      erbuf[1][10] = buf[0][8];
      erbuf[1][11] = buf[0][9];
      erbuf[1][5]  = buf[0][4];
      erbuf[1][6]  = buf[0][5];
  
      /* Reopen srcdset and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDONLY, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read data directly from source dataset */
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      count[0] = 2;
      count[1] = 16;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Read dataset */
      if (H5Dread(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Now try writing to whole VDS (should fail due to unmapped elements) */
      count[0] = 9;
      count[1] = 9;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      H5E_BEGIN_TRY { ret = H5Dwrite(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]); }
      H5E_END_TRY
      if (ret >= 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (H5Dclose(srcdset[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[0] = -1;
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(srcfile[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcfile[0] = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(srcspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[1] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
      if (H5Sclose(memspace) < 0)
          TEST_ERROR_SUPPRESSED
      memspace = -1;
  
      /*
       * Test 8: For code coverage: Horizontal block virtual mappings, and file
       * selection, grid memory selection
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create memory dataspace */
      if ((memspace = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      dims[0] = 8;
      dims[1] = 15;
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[0] = 4;
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select all in source space (should not be necessary, but just to be sure)
       */
      if (H5Sselect_all(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 4;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset dims */
      dims[0] = 10;
      dims[1] = 26;
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset erbuf */
      HDmemset(erbuf[0], 0, sizeof(rbuf));
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Select hyperslab in memory */
      start[0] = 0;
      start[1] = 0;
      count[0] = 4;
      count[1] = 15;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write data directly to first source dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      u = 0;
      v = 0;
      for (i = 2; i < 4; i++)
          for (j = 0; j < 15; j++) {
              erbuf[u][v] = buf[i][j];
              v += 2;
              if (v >= 24) {
                  u += 2;
                  v = 0;
              }
          }
  
      /* Select hyperslab in memory */
      start[0] = 4;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write data directly to second source dataset */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 4; i < 6; i++)
          for (j = 0; j < 15; j++) {
              erbuf[u][v] = buf[i][j];
              v += 2;
              if (v >= 24) {
                  u += 2;
                  v = 0;
              }
          }
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Select hyperslab in memory */
      start[0]  = 0;
      start[1]  = 0;
      stride[0] = 2;
      stride[1] = 2;
      count[0]  = 5;
      count[1]  = 12;
      block[0]  = 1;
      block[1]  = 1;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslab in file */
      start[0] = 2;
      start[1] = 0;
      count[0] = 4;
      count[1] = 15;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
      if (H5Sclose(memspace) < 0)
          TEST_ERROR_SUPPRESSED
      memspace = -1;
  
      /*
       * Test 9: For code coverage: Horizontal block virtual mappings, and file
       * selection, grid memory selection, 3 mappings, 3D memory space
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create memory dataspace */
      dims[1] = 13;
      dims[2] = 2;
      if ((memspace = H5Screate_simple(3, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      dims[0] = 6;
      dims[1] = 10;
      if ((vspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[2] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[0] = 2;
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select all in source space (should not be necessary, but just to be sure)
       */
      if (H5Sselect_all(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 2;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 4;
      if (H5Sselect_hyperslab(vspace[2], H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[2], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset3",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset dims */
      dims[0] = 10;
      dims[1] = 26;
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset3", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset erbuf */
      HDmemset(erbuf[0], 0, sizeof(rbuf));
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Select hyperslab in memory */
      start[0] = 0;
      start[1] = 0;
      start[2] = 0;
      count[0] = 2;
      count[1] = 5;
      count[2] = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write data directly to first source dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      u = 0;
      v = 0;
      for (i = 0; i < 2; i++)
          for (j = 0; j < 10; j++) {
              erbuf[u][v] = buf[i][j];
              if (++v == 6)
                  v += 2;
              else if (v == 14) {
                  u += 2;
                  v = 0;
              }
          }
  
      /* Select hyperslab in memory */
      start[0] = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write data directly to second source dataset */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 2; i < 4; i++)
          for (j = 0; j < 10; j++) {
              erbuf[u][v] = buf[i][j];
              if (++v == 6)
                  v += 2;
              else if (v == 14) {
                  u += 2;
                  v = 0;
              }
          }
  
      /* Select hyperslab in memory */
      start[0] = 4;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write data directly to third source dataset */
      if (H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 4; i < 6; i++)
          for (j = 0; j < 10; j++) {
              erbuf[u][v] = buf[i][j];
              if (++v == 6)
                  v += 2;
              else if (v == 14) {
                  u += 2;
                  v = 0;
              }
          }
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Dclose(srcdset[2]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[2] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Select hyperslab in memory */
      start[0]  = 0;
      start[1]  = 0;
      start[2]  = 0;
      stride[0] = 2;
      stride[1] = 4;
      stride[2] = 1;
      count[0]  = 5;
      count[1]  = 2;
      count[2]  = 1;
      block[0]  = 1;
      block[1]  = 3;
      block[2]  = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Dclose(srcdset[2]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[2] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
      if (H5Sclose(vspace[2]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[2] = -1;
      if (H5Sclose(memspace) < 0)
          TEST_ERROR_SUPPRESSED
      memspace = -1;
  
      /*
       * Test 10: For code coverage: Vertical stripe virtual mappings, vertical
       * block file selection, block memory selection, 3D VDS
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create memory dataspace */
      if ((memspace = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      dims[0] = 10;
      dims[1] = 9;
      dims[2] = 6;
      if ((vspace[0] = H5Screate_simple(3, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(3, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[1] = 12;
      if ((srcspace[0] = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select all in source space (should not be necessary, but just to be sure)
       */
      if (H5Sselect_all(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      start[0]  = 0;
      start[1]  = 0;
      start[2]  = 0;
      count[0]  = 1;
      count[1]  = 4;
      count[2]  = 3;
      stride[0] = 1;
      stride[1] = 2;
      stride[2] = 2;
      block[0]  = 10;
      block[1]  = 1;
      block[2]  = 1;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[2] = 1;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reset dims */
      dims[0] = 10;
      dims[1] = 26;
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Initialize erbuf */
      HDmemset(erbuf[0], 0, sizeof(rbuf));
      for (i = 0; i < 10; i++)
          for (j = 0; j < 24; j += 6) {
              erbuf[i][j]     = -1;
              erbuf[i][j + 1] = -1;
          }
  
      /* Populate write buffer */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              buf[i][j] = (i * (int)(sizeof(buf[0]) / sizeof(buf[0][0]))) + j;
  
      /* Select hyperslab in memory */
      start[0] = 0;
      start[1] = 0;
      count[0] = 10;
      count[1] = 12;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write data directly to first source dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      u = 0;
      v = 0;
      for (i = 0; i < 10; i++)
          for (j = 0; j < 8; j++) {
              if (v == 0 || v == 12)
                  erbuf[u][v] = buf[i][j];
              v += 2;
              if (!(v % 6))
                  v += 6;
              if (v >= 28) {
                  u++;
                  v = 0;
              }
          }
  
      /* Select hyperslab in memory */
      start[1] = 8;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write data directly to second source dataset */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      u = 0;
      v = 1;
      for (i = 0; i < 10; i++)
          for (j = 8; j < 16; j++) {
              if (v == 1 || v == 13)
                  erbuf[u][v] = buf[i][j];
              v += 2;
              if (!((v - 1) % 6))
                  v += 6;
              if (v >= 28) {
                  u++;
                  v = 1;
              }
          }
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Select hyperslab in memory */
      start[0]  = 0;
      start[1]  = 0;
      stride[0] = 1;
      stride[1] = 6;
      count[0]  = 1;
      count[1]  = 4;
      block[0]  = 10;
      block[1]  = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslab in file */
      start[0] = 0;
      start[1] = 0;
      start[2] = 0;
      count[0] = 10;
      count[1] = 4;
      count[2] = 2;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, vspace[0], H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)(sizeof(buf) / sizeof(buf[0])); i++)
          for (j = 0; j < (int)(sizeof(buf[0]) / sizeof(buf[0][0])); j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
      if (H5Sclose(memspace) < 0)
          TEST_ERROR_SUPPRESSED
      memspace = -1;
  
      /* Close */
      if (H5Pclose(dcpl) < 0)
          TEST_ERROR_SUPPRESSED
      dcpl = -1;
  
      HDfree(srcfilename);
      HDfree(srcfilename_map);
      HDfree(vfilename);
      HDfree(vfilename2);
      HDfree(srcfilenamepct);
      HDfree(srcfilenamepct_map);
  
      PASSED_SUPPRESSED();
      return 0;
  
  error:
      H5E_BEGIN_TRY
      {
          for (i = 0; i < (int)(sizeof(srcdset) / sizeof(srcdset[0])); i++)
              H5Dclose(srcdset[i]);
          H5Dclose(vdset);
          for (i = 0; i < (int)(sizeof(srcfile) / sizeof(srcfile[0])); i++)
              H5Fclose(srcfile[i]);
          H5Fclose(vfile);
          H5Fclose(vfile2);
          for (i = 0; i < (int)(sizeof(srcspace) / sizeof(srcspace[0])); i++)
              H5Sclose(srcspace[i]);
          for (i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++)
              H5Sclose(vspace[i]);
          H5Sclose(memspace);
          H5Pclose(dcpl);
      }
      H5E_END_TRY;
  
      HDfree(srcfilename);
      HDfree(srcfilename_map);
      HDfree(vfilename);
      HDfree(vfilename2);
      HDfree(srcfilenamepct);
      HDfree(srcfilenamepct_map);
  
      return 1;
  } /* end test_basic_io() */
  
  /*-------------------------------------------------------------------------
   * Function:    test_unlim
   *
   * Purpose:     Tests VDS with unlimited selections
   *
   * Return:      Success:        0
   *              Failure:        number of errors
   *-------------------------------------------------------------------------
   */
  static int
  test_unlim(unsigned config, hid_t vds_fapl, hid_t src_fapl)
  {
      char           srcfilename[FILENAME_BUF_SIZE];
      char           srcfilename_map[FILENAME_BUF_SIZE];
      char           vfilename[FILENAME_BUF_SIZE];
      hid_t          srcfile[4]  = {-1, -1, -1, -1}; /* Files with source dsets */
      hid_t          vfile       = -1;               /* File with virtual dset */
      hid_t          dcpl        = -1;               /* Dataset creation property list */
      hid_t          srcdcpl     = -1;               /* DCPL for source dset */
      hid_t          dapl        = -1;               /* Dataset access property list */
      hid_t          srcspace[4] = {-1, -1, -1, -1}; /* Source dataspaces */
      hid_t          vspace[4]   = {-1, -1, -1, -1}; /* Virtual dset dataspaces */
      hid_t          memspace    = -1;               /* Memory dataspace */
      hid_t          filespace   = -1;               /* File dataspace */
      hid_t          srcdset[4]  = {-1, -1, -1, -1}; /* Source datsets */
      hid_t          vdset       = -1;               /* Virtual dataset */
      hsize_t        dims[2]     = {10, 10};         /* Data space current size */
      hsize_t        mdims[2]    = {10, 20};         /* Data space maximum size */
      hsize_t        cdims[2]    = {4, 4};           /* Chunk dimensions */
      hsize_t        start[4];                       /* Hyperslab start */
      hsize_t        stride[4];                      /* Hyperslab stride */
      hsize_t        count[4];                       /* Hyperslab count */
      hsize_t        block[4];                       /* Hyperslab block */
      int            buf[10][20];                    /* Write and expected read buffer */
      int            rbuf[10][20];                   /* Read buffer */
      int            erbuf[10][20];                  /* Expected read buffer */
      int            ndims;                          /* Number of dimensions */
      int            fill = -1;                      /* Fill value */
      H5D_vds_view_t virtual_view;                   /* Virtual view property */
      int            i, j;
  
      TESTING_2_SUPPRESSED("virtual dataset I/O with unlimited selections")
  
      h5_fixname(FILENAME[0], vds_fapl, vfilename, sizeof vfilename);
      h5_fixname(FILENAME[2], src_fapl, srcfilename, sizeof srcfilename);
      h5_fixname_printf(FILENAME[2], src_fapl, srcfilename_map, sizeof srcfilename_map);
  
      /* Create DCPLs */
      if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Set fill value */
      if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Set chunk dimensions */
      if (H5Pset_chunk(srcdcpl, 2, cdims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create DAPL */
      if ((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create memory space */
      if ((memspace = H5Screate_simple(2, mdims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /*
       * Test 1: 2 Source datasets, single unlimited hyperslab virtual mappings
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[0]  = 5;
      mdims[0] = 5;
      if ((srcspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      mdims[0] = 10;
  
      /* Select hyperslab in source space */
      start[0] = 0;
      start[1] = 0;
      count[0] = 5;
      count[1] = H5S_UNLIMITED;
      if (H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 5;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] = (i * (int)mdims[1]) + j;
  
      /* Initialize erbuf */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              erbuf[i][j] = fill;
  
      /* Write data directly to source datasets */
      /* Select hyperslab in memory */
      start[0] = 0;
      count[1] = 10;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write first dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++)
          for (j = 0; j < 10; j++)
              erbuf[i][j] = buf[i][j];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write second dataset */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++)
          for (j = 0; j < 10; j++)
              erbuf[i + 5][j] = buf[i][j];
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Test H5Pget_virtual_view() */
      if (H5Pget_virtual_view(dapl, &virtual_view) < 0)
          TEST_ERROR_SUPPRESSED
      if (virtual_view != H5D_VDS_LAST_AVAILABLE)
          TEST_ERROR_SUPPRESSED
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Test H5Pget_virtual_view() */
      if (H5Pget_virtual_view(dapl, &virtual_view) < 0)
          TEST_ERROR_SUPPRESSED
      if (virtual_view != H5D_VDS_FIRST_MISSING)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[0] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[0] */
      dims[0] = 5;
      dims[1] = 15;
      if (H5Dset_extent(srcdset[0], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to new area of srcdset */
      count[1] = 5;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if ((filespace = H5Dget_space(srcdset[0])) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 10;
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcdset[0] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions.  Note that since we are using
       * H5D_VDS_FIRST_MISSING and we only extended one source dataset the
       * dimensions will not have changed. */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf to reflect new data that is now visible due to the change to
       * H5D_VDS_LAST_AVAILABLE */
      for (i = 0; i < 5; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][j + 10] = buf[i][j];
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 15)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[1] */
      dims[0] = 5;
      dims[1] = 20;
      if (H5Dset_extent(srcdset[1], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to new area of srcdset */
      count[1] = 10;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if ((filespace = H5Dget_space(srcdset[1])) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 10;
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++)
          for (j = 0; j < 10; j++)
              erbuf[i + 5][j + 10] = buf[i][j];
  
      /* Close srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 20)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Now just read middle 2 rows */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      start[0] = 4;
      count[0] = 2;
      count[1] = 20;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, memspace, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data - algorithmically check for only 2 middle rows being
       * read so we don't have to wipe out erbuf and then restore it afterwards */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              if ((i == 4) || (i == 5)) {
                  if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Now test reopening virtual dataset without calling H5Dget_space, if
       * REOPEN_VIRT flag set */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          start[0] = 0;
          start[1] = 0;
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++)
                  if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
  
          /* Now try setting extent manually */
          /* Shrink to 18 */
          dims[1] = 18;
          if (H5Dset_extent(vdset, dims) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          start[0] = 0;
          start[1] = 0;
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Shrink to 15 */
          dims[1] = 15;
          if (H5Dset_extent(vdset, dims) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          start[0] = 0;
          start[1] = 0;
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
      }
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 15)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Now test reopening virtual dataset without calling H5Dget_space, if
       * REOPEN_VIRT flag set */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          start[1] = 0;
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Now try setting extent manually */
          /* Grow to 18 */
          dims[1] = 18;
          if (H5Dset_extent(vdset, dims) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          start[0] = 0;
          start[1] = 0;
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Grow to 20 */
          dims[1] = 20;
          if (H5Dset_extent(vdset, dims) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          start[0] = 0;
          start[1] = 0;
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++)
                  if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
      }
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      else if (!(config & TEST_IO_DIFFERENT_FILE)) {
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
  
      /*
       * Test 2: 2 Source datasets, interleaved slices, single element wide
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      dims[0] = 10;
      dims[1] = 10;
      if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[1]  = 5;
      mdims[1] = 10;
      if ((srcspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      mdims[1] = 20;
  
      /* Select hyperslab in source space */
      start[0] = 0;
      start[1] = 0;
      count[0] = 10;
      count[1] = H5S_UNLIMITED;
      if (H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      stride[0] = 1;
      stride[1] = 2;
      count[0]  = 1;
      count[1]  = H5S_UNLIMITED;
      block[0]  = 10;
      block[1]  = 1;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 1;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 0;
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] = (i * (int)mdims[1]) + j;
  
      /* Initialize erbuf */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              erbuf[i][j] = fill;
  
      /* Write data directly to source datasets */
      /* Select hyperslab in memory */
      count[0] = 10;
      count[1] = 5;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write first dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][2 * j] = buf[i][j];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write second dataset */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][(2 * j) + 1] = buf[i][j];
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[0] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[0] */
      dims[1] = 7;
      if (H5Dset_extent(srcdset[0], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to new area of srcdset */
      count[1] = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if ((filespace = H5Dget_space(srcdset[0])) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 5;
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 0;
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf to reflect only new data that is now visible under
       * H5D_VDS_FIRST_MISSING (first slice) */
      for (i = 0; i < 10; i++)
          erbuf[i][10] = buf[i][0];
  
      /* Close srcdset[0] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions.  Note that since we are using
       * H5D_VDS_FIRST_MISSING and we only extended one source dataset the
       * dimension will only have changed to add one more slice. */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 11)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf to reflect new data that is now visible due to the change to
       * H5D_VDS_LAST_AVAILABLE (second new slice) */
      for (i = 0; i < 10; i++)
          erbuf[i][12] = buf[i][1];
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 13)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[1] */
      dims[1] = 10;
      if (H5Dset_extent(srcdset[1], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to new area of srcdset */
      count[1] = 5;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if ((filespace = H5Dget_space(srcdset[1])) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 5;
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 0;
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][(2 * j) + 11] = buf[i][j];
  
      /* Close srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 20)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Now just read middle 2 rows */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      start[0] = 4;
      count[0] = 2;
      count[1] = 20;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 0;
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, memspace, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data - algorithmically check for only 2 middle rows being
       * read so we don't have to wipe out erbuf and then restore it afterwards */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              if ((i == 4) || (i == 5)) {
                  if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf to reflect new data that is no longer visible due to the
       * change to H5D_VDS_FIRST_MISSING */
      for (i = 0; i < 10; i++)
          for (j = 15; j < 20; j += 2)
              erbuf[i][j] = fill;
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 14)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      else if (!(config & TEST_IO_DIFFERENT_FILE)) {
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
  
      /*
       * Test 3: 3 Source datasets, interleaved slices, two elements wide
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      dims[0] = 10;
      dims[1] = 10;
      if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[2] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspaces */
      dims[1]  = 4;
      mdims[1] = 8;
      if ((srcspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      dims[1]  = 4;
      mdims[1] = 6;
      if ((srcspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      dims[1]  = 2;
      mdims[1] = 6;
      if ((srcspace[2] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      mdims[1] = 20;
  
      /* Select hyperslab in source spaces */
      start[0] = 0;
      start[1] = 0;
      count[0] = 10;
      count[1] = H5S_UNLIMITED;
      if (H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sselect_hyperslab(srcspace[2], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      stride[0] = 1;
      stride[1] = 6;
      count[0]  = 1;
      count[1]  = H5S_UNLIMITED;
      block[0]  = 10;
      block[1]  = 2;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 2;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 4;
      if (H5Sselect_hyperslab(vspace[2], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 0;
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2",
                         srcspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[2], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset3",
                         srcspace[2]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[1], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset3", H5T_NATIVE_INT, srcspace[2], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] = (i * (int)mdims[1]) + j;
  
      /* Initialize erbuf */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              erbuf[i][j] = fill;
  
      /* Write data directly to source datasets */
      /* Select hyperslab in memory */
      count[0] = 10;
      count[1] = 4;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write first dataset */
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 2; j++) {
              erbuf[i][6 * j]       = buf[i][2 * j];
              erbuf[i][(6 * j) + 1] = buf[i][(2 * j) + 1];
          }
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write second dataset */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 2; j++) {
              erbuf[i][(6 * j) + 2] = buf[i][2 * j];
              erbuf[i][(6 * j) + 3] = buf[i][(2 * j) + 1];
          }
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Select hyperslab in memory */
      count[0] = 10;
      count[1] = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write third dataset */
      if (H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++) {
          erbuf[i][4] = buf[i][0];
          erbuf[i][5] = buf[i][1];
      }
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Dclose(srcdset[2]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[2] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[0] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[0] */
      dims[1] = 7;
      if (H5Dset_extent(srcdset[0], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to new area of srcdset */
      count[1] = 3;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if ((filespace = H5Dget_space(srcdset[0])) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 4;
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 0;
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcdset[0] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions.  Note that since we are using
       * H5D_VDS_FIRST_MISSING the size will not have changed. */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf to reflect new data that is now visible due to the change to
       * H5D_VDS_LAST_AVAILABLE */
      for (i = 0; i < 10; i++) {
          erbuf[i][12] = buf[i][0];
          erbuf[i][13] = buf[i][1];
          erbuf[i][18] = buf[i][2];
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 19)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[2] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[2] = H5Dopen2(srcfile[0], "src_dset3", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[2] */
      dims[1] = 5;
      if (H5Dset_extent(srcdset[2], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to new area of srcdset */
      count[1] = 3;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if ((filespace = H5Dget_space(srcdset[2])) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 2;
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 0;
      if (H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++) {
          erbuf[i][10] = buf[i][0];
          erbuf[i][11] = buf[i][1];
          erbuf[i][16] = buf[i][2];
      }
  
      /* Close srcdset[2] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[2]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[2] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions.  Note that the dimensions will not have
       * changed. */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 19)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 14)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[1] */
      dims[1] = 6;
      if (H5Dset_extent(srcdset[1], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to new area of srcdset */
      count[1] = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if ((filespace = H5Dget_space(srcdset[1])) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 4;
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 0;
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++) {
          erbuf[i][14] = buf[i][0];
          erbuf[i][15] = buf[i][1];
      }
  
      /* Close srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 17)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 19)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Now just read middle 2 rows */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
      start[0] = 4;
      count[0] = 2;
      count[1] = 19;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 0;
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data - algorithmically check for only 2 middle rows being
       * read */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if ((i == 4) || (i == 5)) {
                  if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Dclose(srcdset[2]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[2] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      else if (!(config & TEST_IO_DIFFERENT_FILE)) {
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(srcspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[1] = -1;
      if (H5Sclose(srcspace[2]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[2] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
  
      /*
       * Test 4: 2 Source datasets, offset starts
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspaces */
      dims[0]  = 5;
      dims[1]  = 0;
      mdims[0] = 5;
      if ((srcspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      dims[1] = 5;
      if ((srcspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      mdims[0] = 10;
  
      /* Select hyperslab in source spaces */
      start[0] = 0;
      start[1] = 0;
      count[0] = 5;
      count[1] = H5S_UNLIMITED;
      if (H5Sselect_hyperslab(srcspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      start[1] = 10;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 5;
      start[1] = 0;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset1",
                         srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset2",
                         srcspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace[1], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] = (i * (int)mdims[1]) + j;
  
      /* Initialize erbuf */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              erbuf[i][j] = fill;
  
      /* Write data directly to second source dataset */
      /* Select hyperslab in memory */
      start[0] = 0;
      start[1] = 0;
      count[0] = 5;
      count[1] = 5;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Write second dataset */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++)
          for (j = 0; j < 5; j++)
              erbuf[i + 5][j] = buf[i][j];
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 5)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 5)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[0] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[0] */
      dims[0] = 5;
      dims[1] = 5;
      if (H5Dset_extent(srcdset[0], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[0] */
      start[0] = 0;
      start[1] = 0;
      count[0] = 5;
      count[1] = 5;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][j + 10] = buf[i][j];
  
      /* Close srcdset[0] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 5)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 15)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      else if (!(config & TEST_IO_DIFFERENT_FILE)) {
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[0] = -1;
      if (H5Sclose(srcspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace[1] = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
  
      /* Close */
      if (H5Pclose(dcpl) < 0)
          TEST_ERROR_SUPPRESSED
      dcpl = -1;
      if (H5Pclose(srcdcpl) < 0)
          TEST_ERROR_SUPPRESSED
      dcpl = -1;
      if (H5Pclose(dapl) < 0)
          TEST_ERROR_SUPPRESSED
      dapl = -1;
      if (H5Sclose(memspace) < 0)
          TEST_ERROR_SUPPRESSED
      memspace = -1;
  
      PASSED_SUPPRESSED();
      return 0;
  
  error:
      H5E_BEGIN_TRY
      {
          for (i = 0; i < (int)(sizeof(srcdset) / sizeof(srcdset[0])); i++)
              H5Dclose(srcdset[i]);
          H5Dclose(vdset);
          for (i = 0; i < (int)(sizeof(srcfile) / sizeof(srcfile[0])); i++)
              H5Fclose(srcfile[i]);
          H5Fclose(vfile);
          for (i = 0; i < (int)(sizeof(srcspace) / sizeof(srcspace[0])); i++)
              H5Sclose(srcspace[i]);
          for (i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++)
              H5Sclose(vspace[i]);
          H5Sclose(filespace);
          H5Sclose(memspace);
          H5Pclose(dcpl);
          H5Pclose(srcdcpl);
          H5Pclose(dapl);
      }
      H5E_END_TRY;
  
      return 1;
  } /* end test_unlim() */
  
  /*-------------------------------------------------------------------------
   * Function:    test_printf
   *
   * Purpose:     Tests VDS with unlimited selections and printf style
   *              source dataset resolution
   *
   * Return:      Success:        0
   *              Failure:        number of errors
   *-------------------------------------------------------------------------
   */
  static int
  test_printf(unsigned config, hid_t vds_fapl, hid_t src_fapl)
  {
      char *      srcfilename                 = NULL;
      char *      srcfilename_map             = NULL;
      char *      srcfilename2                = NULL;
      char *      srcfilename2_map            = NULL;
      char *      vfilename                   = NULL;
      char *      printf_srcfilename_map      = NULL;
      char *      srcfilenamepct              = NULL;
      char *      srcfilenamepct_map          = NULL;
      const char *printf_srcfilename_map_orig = "vds_src_%b";
      const char *srcfilenamepct_map_orig     = "vds%%%%_src";
      hid_t       srcfile[4]                  = {-1, -1, -1, -1};         /* Files with source dsets */
      hid_t       vfile                       = -1;                       /* File with virtual dset */
      hid_t       dcpl                        = -1;                       /* Dataset creation property list */
      hid_t       dapl                        = -1;                       /* Dataset access property list */
      hid_t       srcspace                    = -1;                       /* Source dataspace */
      hid_t       vspace[2]                   = {-1, -1};                 /* Virtual dset dataspaces */
      hid_t       memspace                    = -1;                       /* Memory dataspace */
      hid_t       filespace                   = -1;                       /* File dataspace */
      hid_t       srcdset[6]                  = {-1, -1, -1, -1, -1, -1}; /* Source datsets */
      hid_t       vdset                       = -1;                       /* Virtual dataset */
      hsize_t     dims[2]                     = {10, 0};                  /* Data space current size */
      hsize_t     mdims[2]                    = {10, 20};                 /* Data space maximum size */
      hsize_t     start[2]                    = {0, 0};                   /* Hyperslab start */
      hsize_t     stride[2];                                              /* Hyperslab stride */
      hsize_t     count[2];                                               /* Hyperslab count */
      hsize_t     block[2];                                               /* Hyperslab block */
      int         buf[10][20];                                            /* Write and expected read buffer */
      int         rbuf[10][20];                                           /* Read buffer */
      int         erbuf[10][20];                                          /* Expected read buffer */
      int         ndims;                                                  /* Number of dimensions */
      int         fill = -1;                                              /* Fill value */
      hsize_t     gap_size;                                               /* Gap size property */
      int         i, j;
  
      TESTING_2_SUPPRESSED("virtual dataset I/O with printf source")
  
      if ((srcfilename = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilename_map = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilename2 = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilename2_map = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((vfilename = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((printf_srcfilename_map = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilenamepct = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
      if ((srcfilenamepct_map = (char *)HDcalloc(FILENAME_BUF_SIZE, sizeof(char))) == NULL)
          TEST_ERROR_SUPPRESSED;
  
      h5_fixname(FILENAME[0], vds_fapl, vfilename, FILENAME_BUF_SIZE);
      h5_fixname(FILENAME[2], src_fapl, srcfilename, FILENAME_BUF_SIZE);
      h5_fixname_printf(FILENAME[2], src_fapl, srcfilename_map, FILENAME_BUF_SIZE);
      h5_fixname(FILENAME[3], src_fapl, srcfilename2, FILENAME_BUF_SIZE);
      h5_fixname_printf(FILENAME[2], src_fapl, srcfilename2_map, FILENAME_BUF_SIZE);
      h5_fixname_printf(printf_srcfilename_map_orig, src_fapl, printf_srcfilename_map, FILENAME_BUF_SIZE);
      h5_fixname(FILENAME[4], src_fapl, srcfilenamepct, FILENAME_BUF_SIZE);
      h5_fixname_printf(srcfilenamepct_map_orig, src_fapl, srcfilenamepct_map, FILENAME_BUF_SIZE);
  
      /* Create DCPL */
      if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Set fill value */
      if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create DAPL */
      if ((dapl = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create memory space */
      if ((memspace = H5Screate_simple(2, mdims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /*
       * Test 1: 1 Source dataset mapping, 10x5 blocks
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspace */
      if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[1] = 5;
      if ((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual space */
      stride[0] = 1;
      stride[1] = 5;
      count[0]  = 1;
      count[1]  = H5S_UNLIMITED;
      block[0]  = 10;
      block[1]  = 5;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mapping */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".", "src_dset%b",
                         srcspace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 0)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Create 2 source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] = (i * (int)mdims[1]) + j;
  
      /* Initialize erbuf */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              erbuf[i][j] = fill;
  
      /* Write to srcdset[0] */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][j] = buf[i][j];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[1] */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][j + 5] = buf[i][j];
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcfile if config option specified */
      if ((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
          if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
      /* Create 3rd source dataset */
      if ((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset2", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[2] */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][j + 10] = buf[i][j];
  
      /* Close srcdset[2] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[2]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[2] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 15)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Now try with different selections */
      count[0] = 10;
      for (start[1] = (hsize_t)0; start[1] < (hsize_t)5; start[1]++)
          for (count[1] = (hsize_t)1; count[1] < (hsize_t)11; count[1]++) {
              /* Reset rbuf */
              HDmemset(rbuf[0], 0, sizeof(rbuf));
  
              /* Select hyperslab in memory space */
              if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
                  TEST_ERROR_SUPPRESSED
  
              /* Select hyperslab in file space */
              if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
                  TEST_ERROR_SUPPRESSED
  
              /* Read data */
              if (H5Dread(vdset, H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, rbuf[0]) < 0)
                  TEST_ERROR_SUPPRESSED
  
              /* Verify read data */
              for (i = 0; i < (int)mdims[0]; i++)
                  for (j = 0; j < (int)mdims[1]; j++) {
                      if ((j < (int)start[1]) || (j >= (int)(start[1] + count[1]))) {
                          if (rbuf[i][j] != 0)
                              TEST_ERROR_SUPPRESSED
                      }
                      else if (rbuf[i][j] != erbuf[i][j])
                          TEST_ERROR_SUPPRESSED
                  }
          }
      start[1] = 0;
  
      /* Now try writing through VDS */
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslab in file space */
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write data through VDS */
      if (H5Dwrite(vdset, H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dopen2(srcfile[0], "src_dset0", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile[0], "src_dset1", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcdset[2] = H5Dopen2(srcfile[0], "src_dset2", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Read srcdset[0] */
      count[0] = 10;
      count[1] = 5;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dread(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 5; j++)
              if (rbuf[i][j] != buf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Read srcdset[1] */
      if (H5Dread(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 5; j++)
              if (rbuf[i][j] != buf[i][j + 5])
                  TEST_ERROR_SUPPRESSED
  
      /* Read srcdset[2] */
      if (H5Dread(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < 10; i++)
          for (j = 0; j < 5; j++)
              if (rbuf[i][j] != buf[i][j + 10])
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (H5Dclose(srcdset[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[0] = -1;
      if (H5Dclose(srcdset[1]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[1] = -1;
      if (H5Dclose(srcdset[2]) < 0)
          TEST_ERROR_SUPPRESSED
      srcdset[2] = -1;
      if (H5Fclose(srcfile[0]) < 0)
          TEST_ERROR_SUPPRESSED
      srcfile[0] = -1;
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
  
      /*
       * Test 2: 1 Source dataset mapping, 10x1 blocks, test printf gap setting,
       * '%' in source file name
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[1] = 1;
      if ((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual space */
      stride[0] = 1;
      stride[1] = 1;
      count[0]  = 1;
      count[1]  = H5S_UNLIMITED;
      block[0]  = 10;
      block[1]  = 1;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mapping */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilenamepct_map : ".",
                         "src_dset%b", srcspace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilenamepct, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 0)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilenamepct, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Create source datasets in a pattern with increasing gaps:
       * XX-X--X---X----X */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset1", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset3", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[3] = H5Dcreate2(srcfile[0], "src_dset6", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[4] = H5Dcreate2(srcfile[0], "src_dset10", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[5] = H5Dcreate2(srcfile[0], "src_dset15", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] = (i * (int)mdims[1]) + j;
  
      /* Initialize erbuf */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              erbuf[i][j] = fill;
  
      /* Write to srcdset[0] */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][0] = buf[i][0];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[1] */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][1] = buf[i][0];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[2] */
      if (H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][3] = buf[i][0];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[3] */
      if (H5Dwrite(srcdset[3], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][6] = buf[i][0];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[4] */
      if (H5Dwrite(srcdset[4], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][10] = buf[i][0];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[5] */
      if (H5Dwrite(srcdset[5], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][15] = buf[i][0];
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          for (i = 0; i < 6; i++) {
              if (H5Dclose(srcdset[i]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[i] = -1;
          }
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 2)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Test H5Pget_virtual_printf_gap() */
      if (H5Pget_virtual_printf_gap(dapl, &gap_size) < 0)
          TEST_ERROR_SUPPRESSED
      if (gap_size != (hsize_t)0)
          TEST_ERROR_SUPPRESSED
  
      /* Close VDS and reopen with printf gap set to 1, reopen file as well if
       * config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_printf_gap(dapl, (hsize_t)1) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Test H5Pget_virtual_printf_gap() */
      if (H5Pget_virtual_printf_gap(dapl, &gap_size) < 0)
          TEST_ERROR_SUPPRESSED
      if (gap_size != (hsize_t)1)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 4)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with printf gap set to 2, reopen file as well if
       * config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_printf_gap(dapl, (hsize_t)2) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Test H5Pget_virtual_printf_gap() */
      if (H5Pget_virtual_printf_gap(dapl, &gap_size) < 0)
          TEST_ERROR_SUPPRESSED
      if (gap_size != (hsize_t)2)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 7)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with printf gap set to 3, reopen file as well if
       * config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_printf_gap(dapl, (hsize_t)3) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Test H5Pget_virtual_printf_gap() */
      if (H5Pget_virtual_printf_gap(dapl, &gap_size) < 0)
          TEST_ERROR_SUPPRESSED
      if (gap_size != (hsize_t)3)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 11)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with printf gap set to 4, reopen file as well if
       * config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_printf_gap(dapl, (hsize_t)4) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Test H5Pget_virtual_printf_gap() */
      if (H5Pget_virtual_printf_gap(dapl, &gap_size) < 0)
          TEST_ERROR_SUPPRESSED
      if (gap_size != (hsize_t)4)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 16)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 2)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reset dapl */
      if (H5Pset_virtual_printf_gap(dapl, (hsize_t)0) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          for (i = 0; i < 6; i++) {
              if (H5Dclose(srcdset[i]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[i] = -1;
          }
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      else if (!(config & TEST_IO_DIFFERENT_FILE)) {
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
  
      /* Next 2 tests are always run with a different source file, so only run if
       * that config option is set (so they're not run twice with the same
       * configuration) */
      if (config & TEST_IO_DIFFERENT_FILE) {
          /*
           * Test 3: 1 Source dataset mapping, 10x5 blocks, printf source file
           */
          /* Clean up files so the source files do not exist yet */
          H5Iinc_ref(vds_fapl); /* Prevent FAPL from being closed */
          h5_clean_files(FILENAME, vds_fapl);
  
          /* Clear virtual layout in DCPL */
          if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Create virtual dataspaces */
          if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Create source dataspace */
          dims[1] = 5;
          if ((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Select hyperslabs in virtual space */
          stride[0] = 1;
          stride[1] = 5;
          count[0]  = 1;
          count[1]  = H5S_UNLIMITED;
          block[0]  = 10;
          block[1]  = 5;
          if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Add virtual layout mapping */
          if (H5Pset_virtual(dcpl, vspace[0], printf_srcfilename_map, "src_dset", srcspace) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Create virtual file */
          if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Create virtual dataset */
          if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Reopen virtual dataset and file if config option specified */
          if (config & TEST_IO_REOPEN_VIRT) {
              if (H5Dclose(vdset) < 0)
                  TEST_ERROR_SUPPRESSED
              vdset = -1;
              if (H5Fclose(vfile) < 0)
                  TEST_ERROR_SUPPRESSED
              vfile = -1;
              if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
              if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          }
  
          /* Get VDS space */
          if ((filespace = H5Dget_space(vdset)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Get VDS space dimensions */
          if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
              TEST_ERROR_SUPPRESSED
          if (ndims != 2)
              TEST_ERROR_SUPPRESSED
          if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
              TEST_ERROR_SUPPRESSED
          if (dims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (dims[1] != 0)
              TEST_ERROR_SUPPRESSED
          if (mdims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (mdims[1] != 20)
              TEST_ERROR_SUPPRESSED
  
          /* Close filespace */
          if (H5Sclose(filespace) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Create 2 source files, one source dataset */
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                       H5P_DEFAULT, H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcfile[1] = H5Fcreate(srcfilename2, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Populate write buffer */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++)
                  buf[i][j] = (i * (int)mdims[1]) + j;
  
          /* Initialize erbuf */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++)
                  erbuf[i][j] = fill;
  
          /* Write to srcdset[0] */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
              TEST_ERROR_SUPPRESSED
          if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Update erbuf */
          for (i = 0; i < 10; i++)
              for (j = 0; j < 5; j++)
                  erbuf[i][j] = buf[i][j];
  
          /* Close srcdset and srcfiles if config option specified */
          if (config & TEST_IO_CLOSE_SRC) {
              if (H5Dclose(srcdset[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[0] = -1;
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
              if (H5Fclose(srcfile[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[1] = -1;
          }
  
          /* Reopen virtual dataset and file if config option specified */
          if (config & TEST_IO_REOPEN_VIRT) {
              if (H5Dclose(vdset) < 0)
                  TEST_ERROR_SUPPRESSED
              vdset = -1;
              if (H5Fclose(vfile) < 0)
                  TEST_ERROR_SUPPRESSED
              vfile = -1;
              if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
              if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          }
  
          /* Get VDS space */
          if ((filespace = H5Dget_space(vdset)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Get VDS space dimensions */
          if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
              TEST_ERROR_SUPPRESSED
          if (ndims != 2)
              TEST_ERROR_SUPPRESSED
          if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
              TEST_ERROR_SUPPRESSED
          if (dims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (dims[1] != 5)
              TEST_ERROR_SUPPRESSED
          if (mdims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (mdims[1] != 20)
              TEST_ERROR_SUPPRESSED
  
          /* Close filespace */
          if (H5Sclose(filespace) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Reopen srcfile[1] if config option specified */
          if (config & TEST_IO_CLOSE_SRC)
              if ((srcfile[1] = H5Fopen(srcfilename2, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
  
          /* Create 2nd source dataset */
          if ((srcdset[1] = H5Dcreate2(srcfile[1], "src_dset", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                       H5P_DEFAULT, H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Adjust write buffer */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++)
                  buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
          /* Write to srcdset[1] */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
              TEST_ERROR_SUPPRESSED
          if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Update erbuf */
          for (i = 0; i < 10; i++)
              for (j = 0; j < 5; j++)
                  erbuf[i][j + 5] = buf[i][j];
  
          /* Close srcdset[1] and srcfile[1] if config option specified */
          if (config & TEST_IO_CLOSE_SRC) {
              if (H5Dclose(srcdset[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[1] = -1;
              if (H5Fclose(srcfile[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[1] = -1;
          }
  
          /* Reopen virtual dataset and file if config option specified */
          if (config & TEST_IO_REOPEN_VIRT) {
              if (H5Dclose(vdset) < 0)
                  TEST_ERROR_SUPPRESSED
              vdset = -1;
              if (H5Fclose(vfile) < 0)
                  TEST_ERROR_SUPPRESSED
              vfile = -1;
              if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
              if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          }
  
          /* Get VDS space */
          if ((filespace = H5Dget_space(vdset)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Get VDS space dimensions */
          if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
              TEST_ERROR_SUPPRESSED
          if (ndims != 2)
              TEST_ERROR_SUPPRESSED
          if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
              TEST_ERROR_SUPPRESSED
          if (dims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (dims[1] != 10)
              TEST_ERROR_SUPPRESSED
          if (mdims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (mdims[1] != 20)
              TEST_ERROR_SUPPRESSED
  
          /* Close filespace */
          if (H5Sclose(filespace) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Close */
          if (!(config & TEST_IO_CLOSE_SRC)) {
              if (H5Dclose(srcdset[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[0] = -1;
              if (H5Dclose(srcdset[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[1] = -1;
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
              if (H5Fclose(srcfile[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[1] = -1;
          }
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if (H5Sclose(srcspace) < 0)
              TEST_ERROR_SUPPRESSED
          srcspace = -1;
          if (H5Sclose(vspace[0]) < 0)
              TEST_ERROR_SUPPRESSED
          vspace[0] = -1;
  
          /*
           * Test 4: 1 Source dataset mapping, 10x5 blocks, printf source file and
           * source dset, extra %%s in source dataset name
           */
          /* Clean up files so the source files do not exist yet */
          H5Iinc_ref(vds_fapl); /* Prevent FAPL from being closed */
          h5_clean_files(FILENAME, vds_fapl);
  
          /* Clear virtual layout in DCPL */
          if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Create virtual dataspaces */
          if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Create source dataspace */
          dims[1] = 5;
          if ((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Select hyperslabs in virtual space */
          stride[0] = 1;
          stride[1] = 5;
          count[0]  = 1;
          count[1]  = H5S_UNLIMITED;
          block[0]  = 10;
          block[1]  = 5;
          if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Add virtual layout mapping */
          if (H5Pset_virtual(dcpl, vspace[0], printf_srcfilename_map, "%%src%%_dset%%%b", srcspace) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Create virtual file */
          if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Create virtual dataset */
          if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Reopen virtual dataset and file if config option specified */
          if (config & TEST_IO_REOPEN_VIRT) {
              if (H5Dclose(vdset) < 0)
                  TEST_ERROR_SUPPRESSED
              vdset = -1;
              if (H5Fclose(vfile) < 0)
                  TEST_ERROR_SUPPRESSED
              vfile = -1;
              if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
              if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          }
  
          /* Get VDS space */
          if ((filespace = H5Dget_space(vdset)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Get VDS space dimensions */
          if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
              TEST_ERROR_SUPPRESSED
          if (ndims != 2)
              TEST_ERROR_SUPPRESSED
          if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
              TEST_ERROR_SUPPRESSED
          if (dims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (dims[1] != 0)
              TEST_ERROR_SUPPRESSED
          if (mdims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (mdims[1] != 20)
              TEST_ERROR_SUPPRESSED
  
          /* Close filespace */
          if (H5Sclose(filespace) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Create 2 source files, one source dataset */
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcdset[0] = H5Dcreate2(srcfile[0], "%src%_dset%0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                       H5P_DEFAULT, H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((srcfile[1] = H5Fcreate(srcfilename2, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Populate write buffer */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++)
                  buf[i][j] = (i * (int)mdims[1]) + j;
  
          /* Initialize erbuf */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++)
                  erbuf[i][j] = fill;
  
          /* Write to srcdset[0] */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
              TEST_ERROR_SUPPRESSED
          if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Update erbuf */
          for (i = 0; i < 10; i++)
              for (j = 0; j < 5; j++)
                  erbuf[i][j] = buf[i][j];
  
          /* Close srcdset and srcfiles if config option specified */
          if (config & TEST_IO_CLOSE_SRC) {
              if (H5Dclose(srcdset[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[0] = -1;
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
              if (H5Fclose(srcfile[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[1] = -1;
          }
  
          /* Reopen virtual dataset and file if config option specified */
          if (config & TEST_IO_REOPEN_VIRT) {
              if (H5Dclose(vdset) < 0)
                  TEST_ERROR_SUPPRESSED
              vdset = -1;
              if (H5Fclose(vfile) < 0)
                  TEST_ERROR_SUPPRESSED
              vfile = -1;
              if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
              if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          }
  
          /* Get VDS space */
          if ((filespace = H5Dget_space(vdset)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Get VDS space dimensions */
          if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
              TEST_ERROR_SUPPRESSED
          if (ndims != 2)
              TEST_ERROR_SUPPRESSED
          if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
              TEST_ERROR_SUPPRESSED
          if (dims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (dims[1] != 5)
              TEST_ERROR_SUPPRESSED
          if (mdims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (mdims[1] != 20)
              TEST_ERROR_SUPPRESSED
  
          /* Close filespace */
          if (H5Sclose(filespace) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Reopen srcfile[1] if config option specified */
          if (config & TEST_IO_CLOSE_SRC)
              if ((srcfile[1] = H5Fopen(srcfilename2, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
  
          /* Create 2nd source dataset */
          if ((srcdset[1] = H5Dcreate2(srcfile[1], "%src%_dset%1", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                       H5P_DEFAULT, H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Adjust write buffer */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++)
                  buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
          /* Write to srcdset[1] */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
              TEST_ERROR_SUPPRESSED
          if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Update erbuf */
          for (i = 0; i < 10; i++)
              for (j = 0; j < 5; j++)
                  erbuf[i][j + 5] = buf[i][j];
  
          /* Close srcdset[1] and srcfile[1] if config option specified */
          if (config & TEST_IO_CLOSE_SRC) {
              if (H5Dclose(srcdset[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[1] = -1;
              if (H5Fclose(srcfile[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[1] = -1;
          }
  
          /* Reopen virtual dataset and file if config option specified */
          if (config & TEST_IO_REOPEN_VIRT) {
              if (H5Dclose(vdset) < 0)
                  TEST_ERROR_SUPPRESSED
              vdset = -1;
              if (H5Fclose(vfile) < 0)
                  TEST_ERROR_SUPPRESSED
              vfile = -1;
              if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
              if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          }
  
          /* Get VDS space */
          if ((filespace = H5Dget_space(vdset)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Get VDS space dimensions */
          if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
              TEST_ERROR_SUPPRESSED
          if (ndims != 2)
              TEST_ERROR_SUPPRESSED
          if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
              TEST_ERROR_SUPPRESSED
          if (dims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (dims[1] != 10)
              TEST_ERROR_SUPPRESSED
          if (mdims[0] != 10)
              TEST_ERROR_SUPPRESSED
          if (mdims[1] != 20)
              TEST_ERROR_SUPPRESSED
  
          /* Close filespace */
          if (H5Sclose(filespace) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Close */
          if (!(config & TEST_IO_CLOSE_SRC)) {
              if (H5Dclose(srcdset[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[0] = -1;
              if (H5Dclose(srcdset[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[1] = -1;
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
              if (H5Fclose(srcfile[1]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[1] = -1;
          }
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if (H5Sclose(srcspace) < 0)
              TEST_ERROR_SUPPRESSED
          srcspace = -1;
          if (H5Sclose(vspace[0]) < 0)
              TEST_ERROR_SUPPRESSED
          vspace[0] = -1;
      }
  
      /*
       * Test 5: 2 Source mappings, interleaved slices, single element wide,
       * hyperslab selection in source, extra %%s in source dataset names
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      dims[0] = 10;
      dims[1] = 10;
      if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace (2 elements wide) */
      dims[1] = 2;
      if ((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslab in source space */
      count[0] = 10;
      count[1] = 1;
      if (H5Sselect_hyperslab(srcspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      stride[0] = 1;
      stride[1] = 2;
      count[0]  = 1;
      count[1]  = H5S_UNLIMITED;
      block[0]  = 10;
      block[1]  = 1;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 1;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[1] = 0;
  
      /* Add virtual layout mappings */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "%bsrc_dset_a%b%%", srcspace) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "src_dset_b%b%%%%", srcspace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 0)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Create 2 source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "0src_dset_a0%", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset_b0%%", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] = (i * (int)mdims[1]) + j;
  
      /* Initialize erbuf */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              erbuf[i][j] = fill;
  
      /* Write to srcdset[0] */
      block[0] = 10;
      block[1] = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][0] = buf[i][0];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[1] */
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][1] = buf[i][0];
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 2)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcfile if config option specified */
      if ((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
          if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
      /* Create 3rd source dataset */
      if ((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset_b1%%", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[2] */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][3] = buf[i][0];
  
      /* Close srcdset[2] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[2]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[2] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 4)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions.  Make sure that the 4th slice is no longer
       * visible due to the change to H5D_VDS_FIRST_MISSING. */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 2)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcfile if config option specified */
      if ((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
          if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
      /* Create 4th source dataset */
      if ((srcdset[3] = H5Dcreate2(srcfile[0], "2src_dset_a2%", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[3] */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[3], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][4] = buf[i][0];
  
      /* Close srcdset[3] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[3]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[3] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 2)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions.  Make sure that the 4th slice is now visible
       * due to the change to H5D_VDS_LAST_AVAILABLE. */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 4)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with printf_gap set to 1, reopen file as well if
       * config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_printf_gap(dapl, (hsize_t)1) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions.  Make sure that the 6th slice is now visible
       * due to the change to printf_gap. */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 5)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reset dapl */
      if (H5Pset_virtual_printf_gap(dapl, (hsize_t)0) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          for (i = 0; i < 4; i++) {
              if (H5Dclose(srcdset[i]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[i] = -1;
          }
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      else if (!(config & TEST_IO_DIFFERENT_FILE)) {
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
  
      /*
       * Test 6: 2 Source mappings, side-by-side, 5x5 and 5x10 blocks
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      dims[0] = 10;
      dims[1] = 10;
      if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace (1 dimensional) */
      dims[0] = 50;
      if ((srcspace = H5Screate_simple(1, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslab in source space */
      count[0] = 25;
      if (H5Sselect_hyperslab(srcspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual spaces */
      stride[0] = 1;
      stride[1] = 5;
      count[0]  = 1;
      count[1]  = H5S_UNLIMITED;
      block[0]  = 5;
      block[1]  = 5;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[0]  = 5;
      stride[1] = 10;
      block[1]  = 10;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 0;
  
      /* Add virtual layout mappings (select ALL in source space for second
       * mapping) */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "src_dset_a%b", srcspace) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sselect_all(srcspace) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "src_dset_b%b", srcspace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 0)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Create 2 source datasets */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset_a0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdset[1] = H5Dcreate2(srcfile[0], "src_dset_b0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] = (i * (int)mdims[1]) + j;
  
      /* Initialize erbuf */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              erbuf[i][j] = fill;
  
      /* Write to srcdset[0] */
      block[0] = 5;
      block[1] = 5;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      count[0] = 25;
      if (H5Sselect_hyperslab(srcspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, srcspace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][j] = buf[i][j];
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[1] */
      block[1] = 10;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sselect_all(srcspace) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, srcspace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++)
          for (j = 0; j < 10; j++)
              erbuf[i + 5][j] = buf[i][j];
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions.  Make sure that the 4th slice is no longer
       * visible due to the change to H5D_VDS_FIRST_MISSING. */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 5)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcfile if config option specified */
      if ((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
          if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
      /* Create 3rd source dataset */
      if ((srcdset[2] = H5Dcreate2(srcfile[0], "src_dset_a1", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[2] */
      block[1] = 5;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sselect_hyperslab(srcspace, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, srcspace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][j + 5] = buf[i][j];
  
      /* Close srcdset[2] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[2]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[2] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with view set to H5D_VDS_LAST_AVAILABLE, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions.  There should be no change. */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcfile if config option specified */
      if ((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
          if ((srcfile[0] = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
      /* Create 4th source dataset */
      if ((srcdset[3] = H5Dcreate2(srcfile[0], "src_dset_a2", H5T_NATIVE_INT, srcspace, H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[3] */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[3], H5T_NATIVE_INT, memspace, srcspace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 5; i++)
          for (j = 0; j < 5; j++)
              erbuf[i][j + 10] = buf[i][j];
  
      /* Close srcdset[3] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[3]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[3] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 15)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Now test reopening virtual dataset without calling H5Dget_space, if
       * REOPEN_VIRT flag set */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Now try setting extent manually */
          /* Shrink to 12 */
          dims[1] = 12;
          if (H5Dset_extent(vdset, dims) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Shrink to 10 */
          dims[1] = 12;
          if (H5Dset_extent(vdset, dims) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
      }
  
      /* Close VDS and reopen with view set to H5D_VDS_FIRST_MISSING, reopen file
       * as well if config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_view(dapl, H5D_VDS_FIRST_MISSING) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Now test reopening virtual dataset without calling H5Dget_space, if
       * REOPEN_VIRT flag set */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Now try setting extent manually */
          /* Grow to 12 */
          dims[1] = 12;
          if (H5Dset_extent(vdset, dims) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
  
          /* Grow to 15 */
          dims[1] = 15;
          if (H5Dset_extent(vdset, dims) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data through virtual dataset */
          /* Reset rbuf */
          HDmemset(rbuf[0], 0, sizeof(rbuf));
  
          /* Select hyperslab in memory space */
          if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Read data */
          if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
              TEST_ERROR_SUPPRESSED
  
          /* Verify read data */
          for (i = 0; i < (int)mdims[0]; i++)
              for (j = 0; j < (int)mdims[1]; j++) {
                  if (j >= (int)dims[1]) {
                      if (rbuf[i][j] != 0)
                          TEST_ERROR_SUPPRESSED
                  }
                  else if (rbuf[i][j] != erbuf[i][j])
                      TEST_ERROR_SUPPRESSED
              }
      }
  
      /* Reset dapl */
      if (H5Pset_virtual_view(dapl, H5D_VDS_LAST_AVAILABLE) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          for (i = 0; i < 4; i++) {
              if (H5Dclose(srcdset[i]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[i] = -1;
          }
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      else if (!(config & TEST_IO_DIFFERENT_FILE)) {
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
      if (H5Sclose(vspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[1] = -1;
  
      /*
       * Test 7: 1 Source dataset mapping, 10x1 blocks, test reallocating sub_dset
       * array
       */
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual dataspaces */
      if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source dataspace */
      dims[1] = 1;
      if ((srcspace = H5Screate_simple(2, dims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Select hyperslabs in virtual space */
      stride[0] = 1;
      stride[1] = 1;
      count[0]  = 1;
      count[1]  = H5S_UNLIMITED;
      block[0]  = 10;
      block[1]  = 1;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Add virtual layout mapping */
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilenamepct_map : ".",
                         "src_dset%b", srcspace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile[0] = H5Fcreate(srcfilenamepct, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile[0] = vfile;
          if (H5Iinc_ref(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 0)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile[0] = H5Fopen(srcfilenamepct, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Create 1 source dataset */
      if ((srcdset[0] = H5Dcreate2(srcfile[0], "src_dset0", H5T_NATIVE_INT, srcspace, H5P_DEFAULT, H5P_DEFAULT,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] = (i * (int)mdims[1]) + j;
  
      /* Initialize erbuf */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              erbuf[i][j] = fill;
  
      /* Write to srcdset[0] */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 10; i++)
          erbuf[i][0] = buf[i][0];
  
      /* Close srcdset[0] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile[0]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile[0] = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 1)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Close VDS and reopen with printf gap set to 127, reopen file as well if
       * config option specified */
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual_printf_gap(dapl, (hsize_t)127) < 0)
          TEST_ERROR_SUPPRESSED
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      if ((vdset = H5Dopen2(vfile, "v_dset", dapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 1)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 20)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reset dapl */
      if (H5Pset_virtual_printf_gap(dapl, (hsize_t)0) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          if (H5Dclose(srcdset[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[0] = -1;
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      else if (!(config & TEST_IO_DIFFERENT_FILE)) {
          if (H5Fclose(srcfile[0]) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile[0] = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      if (H5Sclose(srcspace) < 0)
          TEST_ERROR_SUPPRESSED
      srcspace = -1;
      if (H5Sclose(vspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
      vspace[0] = -1;
  
      /* Close */
      if (H5Pclose(dcpl) < 0)
          TEST_ERROR_SUPPRESSED
      dcpl = -1;
      if (H5Pclose(dapl) < 0)
          TEST_ERROR_SUPPRESSED
      dapl = -1;
      if (H5Sclose(memspace) < 0)
          TEST_ERROR_SUPPRESSED
      memspace = -1;
  
      HDfree(srcfilename);
      HDfree(srcfilename_map);
      HDfree(srcfilename2);
      HDfree(srcfilename2_map);
      HDfree(vfilename);
      HDfree(printf_srcfilename_map);
      HDfree(srcfilenamepct);
      HDfree(srcfilenamepct_map);
  
      PASSED_SUPPRESSED();
      return 0;
  
  error:
      H5E_BEGIN_TRY
      {
          for (i = 0; i < (int)(sizeof(srcdset) / sizeof(srcdset[0])); i++)
              H5Dclose(srcdset[i]);
          H5Dclose(vdset);
          for (i = 0; i < (int)(sizeof(srcfile) / sizeof(srcfile[0])); i++)
              H5Fclose(srcfile[i]);
          H5Fclose(vfile);
          H5Sclose(srcspace);
          for (i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++)
              H5Sclose(vspace[i]);
          H5Sclose(filespace);
          H5Sclose(memspace);
          H5Pclose(dcpl);
          H5Pclose(dapl);
      }
      H5E_END_TRY;
  
      HDfree(srcfilename);
      HDfree(srcfilename_map);
      HDfree(srcfilename2);
      HDfree(srcfilename2_map);
      HDfree(vfilename);
      HDfree(printf_srcfilename_map);
      HDfree(srcfilenamepct);
      HDfree(srcfilenamepct_map);
  
      return 1;
  } /* end test_printf() */
  
  /*-------------------------------------------------------------------------
   * Function:    test_all
   *
   * Purpose:     Tests fixed, unlimited, and printf selections in the same
   *              VDS
   *
   * Return:      Success:        0
   *              Failure:        number of errors
   *-------------------------------------------------------------------------
   */
  static int
  test_all(unsigned config, hid_t vds_fapl, hid_t src_fapl)
  {
      char    vfilename[FILENAME_BUF_SIZE];
      char    srcfilename[FILENAME_BUF_SIZE];
      char    srcfilename_map[FILENAME_BUF_SIZE];
      hid_t   srcfile     = -1;                   /* File with source dsets */
      hid_t   vfile       = -1;                   /* File with virtual dset */
      hid_t   dcpl        = -1;                   /* Dataset creation property list */
      hid_t   srcdcpl     = -1;                   /* DCPL for source dset */
      hid_t   srcspace[3] = {-1, -1, -1};         /* Source dataspaces */
      hid_t   vspace[3]   = {-1, -1, -1};         /* Virtual dset dataspaces */
      hid_t   memspace    = -1;                   /* Memory dataspace */
      hid_t   filespace   = -1;                   /* File dataspace */
      hid_t   srcdset[5]  = {-1, -1, -1, -1, -1}; /* Source datsets */
      hid_t   vdset       = -1;                   /* Virtual dataset */
      hsize_t dims[2]     = {6, 6};               /* Data space current size */
      hsize_t mdims[2]    = {10, 10};             /* Data space maximum size */
      hsize_t cdims[2]    = {2, 2};               /* Chunk dimensions */
      hsize_t start[2];                           /* Hyperslab start */
      hsize_t stride[2];                          /* Hyperslab stride */
      hsize_t count[2];                           /* Hyperslab count */
      hsize_t block[2];                           /* Hyperslab block */
      int     buf[10][10];                        /* Write and expected read buffer */
      int     rbuf[10][10];                       /* Read buffer */
      int     erbuf[10][10];                      /* Expected read buffer */
      int     ndims;                              /* Number of dimensions */
      int     fill = -1;                          /* Fill value */
      int     i, j;
  
      TESTING_2_SUPPRESSED("virtual dataset I/O with mixed selection types")
  
      h5_fixname(FILENAME[0], vds_fapl, vfilename, sizeof vfilename);
      h5_fixname(FILENAME[2], src_fapl, srcfilename, sizeof srcfilename);
      h5_fixname_printf(FILENAME[2], src_fapl, srcfilename_map, sizeof srcfilename_map);
  
      /* Create DCPLs */
      if ((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcdcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Set fill value */
      if (H5Pset_fill_value(dcpl, H5T_NATIVE_INT, &fill) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Set chunk dimensions */
      if (H5Pset_chunk(srcdcpl, 2, cdims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create memory space */
      if ((memspace = H5Screate_simple(2, mdims, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Clear virtual layout in DCPL */
      if (H5Pset_layout(dcpl, H5D_VIRTUAL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create fixed mapping */
      if ((vspace[0] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 3;
      start[1] = 3;
      count[0] = 3;
      count[1] = 3;
      if (H5Sselect_hyperslab(vspace[0], H5S_SELECT_SET, start, NULL, count, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcspace[0] = H5Screate_simple(2, count, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[0], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "src_dset_fixed", srcspace[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create unlimited mapping */
      if ((vspace[1] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 3;
      start[1] = 0;
      count[0] = 1;
      count[1] = 1;
      block[0] = H5S_UNLIMITED;
      block[1] = 3;
      if (H5Sselect_hyperslab(vspace[1], H5S_SELECT_SET, start, NULL, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      dims[0] = 0;
      dims[1] = 3;
      if ((srcspace[1] = H5Screate_simple(2, dims, block)) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 0;
      if (H5Sselect_hyperslab(srcspace[1], H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[1], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "src_dset_unlim", srcspace[1]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create printf mapping */
      if ((vspace[2] = H5Screate_simple(2, dims, mdims)) < 0)
          TEST_ERROR_SUPPRESSED
      start[0]  = 0;
      start[1]  = 2;
      stride[0] = 1;
      stride[1] = 3;
      count[0]  = 1;
      count[1]  = H5S_UNLIMITED;
      block[0]  = 3;
      block[1]  = 2;
      if (H5Sselect_hyperslab(vspace[2], H5S_SELECT_SET, start, stride, count, block) < 0)
          TEST_ERROR_SUPPRESSED
      if ((srcspace[2] = H5Screate_simple(2, block, NULL)) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Pset_virtual(dcpl, vspace[2], config & TEST_IO_DIFFERENT_FILE ? srcfilename_map : ".",
                         "src_dset_printf_%b", srcspace[2]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create virtual file */
      if ((vfile = H5Fcreate(vfilename, H5F_ACC_TRUNC, H5P_DEFAULT, vds_fapl)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create source file if requested */
      if (config & TEST_IO_DIFFERENT_FILE) {
          if ((srcfile = H5Fcreate(srcfilename, H5F_ACC_TRUNC, H5P_DEFAULT, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
      }
      else {
          srcfile = vfile;
          if (H5Iinc_ref(srcfile) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Create virtual dataset */
      if ((vdset = H5Dcreate2(vfile, "v_dset", H5T_NATIVE_INT, vspace[0], H5P_DEFAULT, dcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Close srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile = -1;
          }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 6)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 6)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 10)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Reopen srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC)
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
  
      /* Create fixed source dataset */
      if ((srcdset[0] = H5Dcreate2(srcfile, "src_dset_fixed", H5T_NATIVE_INT, srcspace[0], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Create unlimited source_dataset */
      if ((srcdset[1] = H5Dcreate2(srcfile, "src_dset_unlim", H5T_NATIVE_INT, srcspace[1], H5P_DEFAULT, srcdcpl,
                                   H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Populate write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] = (i * (int)mdims[1]) + j;
  
      /* Initialize erbuf */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              erbuf[i][j] = fill;
  
      /* Write to srcdset[0] */
      start[0] = 0;
      start[1] = 0;
      block[0] = 3;
      block[1] = 3;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[0], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 3; i++)
          for (j = 0; j < 3; j++)
              erbuf[i + 3][j + 3] = buf[i][j];
  
      /* Close srcdsets and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          for (i = 0; i < 2; i++) {
              if (H5Dclose(srcdset[i]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[i] = -1;
          }
  
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 6)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 6)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 10)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if ((i >= (int)dims[0]) || (j >= (int)dims[1])) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile, "src_dset_unlim", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[1] */
      dims[0] = 2;
      dims[1] = 3;
      if (H5Dset_extent(srcdset[1], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[1] */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 2; i++)
          for (j = 0; j < 3; j++)
              erbuf[i + 3][j] = buf[i][j];
  
      /* Close srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 6)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 6)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 10)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if ((i >= (int)dims[0]) || (j >= (int)dims[1])) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcfile if config option specified */
      if ((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
          if ((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
      /* Create first printf source dataset */
      if ((srcdset[2] = H5Dcreate2(srcfile, "src_dset_printf_0", H5T_NATIVE_INT, srcspace[2], H5P_DEFAULT,
                                   srcdcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[2] */
      start[0] = 0;
      start[1] = 0;
      block[0] = 3;
      block[1] = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[2], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 3; i++)
          for (j = 0; j < 2; j++)
              erbuf[i][j + 2] = buf[i][j];
  
      /* Close srcdset[2] srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[2]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[2] = -1;
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 6)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 6)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 10)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if ((i >= (int)dims[0]) || (j >= (int)dims[1])) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile, "src_dset_unlim", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[1] */
      dims[0] = 3;
      dims[1] = 3;
      if (H5Dset_extent(srcdset[1], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to new area of srcdset[1] */
      start[0] = 0;
      start[1] = 0;
      block[0] = 1;
      block[1] = 3;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if ((filespace = H5Dget_space(srcdset[1])) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 2;
      start[1] = 0;
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 3; i++)
          erbuf[5][i] = buf[0][i];
  
      /* Close srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 6)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 6)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 10)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if ((i >= (int)dims[0]) || (j >= (int)dims[1])) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcfile if config option specified */
      if ((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
          if ((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
      /* Create second printf source dataset, this time without using srcdcpl */
      if ((srcdset[3] = H5Dcreate2(srcfile, "src_dset_printf_1", H5T_NATIVE_INT, srcspace[2], H5P_DEFAULT,
                                   H5P_DEFAULT, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[3] */
      start[0] = 0;
      start[1] = 0;
      block[0] = 3;
      block[1] = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[3], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 3; i++)
          for (j = 0; j < 2; j++)
              erbuf[i][j + 5] = buf[i][j];
  
      /* Close srcdset[3] srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[3]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[3] = -1;
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 6)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 7)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 10)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if ((i >= (int)dims[0]) || (j >= (int)dims[1])) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (config & TEST_IO_DIFFERENT_FILE)
              if ((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
                  TEST_ERROR_SUPPRESSED
          if ((srcdset[1] = H5Dopen2(srcfile, "src_dset_unlim", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Extend srcdset[1] */
      dims[0] = 7;
      dims[1] = 3;
      if (H5Dset_extent(srcdset[1], dims) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to new area of srcdset[1] */
      start[0] = 0;
      start[1] = 0;
      block[0] = 4;
      block[1] = 3;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if ((filespace = H5Dget_space(srcdset[1])) < 0)
          TEST_ERROR_SUPPRESSED
      start[0] = 3;
      start[1] = 0;
      if (H5Sselect_hyperslab(filespace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[1], H5T_NATIVE_INT, memspace, filespace, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 4; i++)
          for (j = 0; j < 3; j++)
              erbuf[i + 6][j] = buf[i][j];
  
      /* Close srcdset[1] and srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[1]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[1] = -1;
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 7)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 10)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++) {
              if (j >= (int)dims[1]) {
                  if (rbuf[i][j] != 0)
                      TEST_ERROR_SUPPRESSED
              }
              else if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
          }
  
      /* Reopen srcfile if config option specified */
      if ((config & TEST_IO_CLOSE_SRC) && (config & TEST_IO_DIFFERENT_FILE))
          if ((srcfile = H5Fopen(srcfilename, H5F_ACC_RDWR, src_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
  
      /* Create third printf source dataset */
      if ((srcdset[4] = H5Dcreate2(srcfile, "src_dset_printf_2", H5T_NATIVE_INT, srcspace[2], H5P_DEFAULT,
                                   srcdcpl, H5P_DEFAULT)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Adjust write buffer */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              buf[i][j] += (int)mdims[0] * (int)mdims[1];
  
      /* Write to srcdset[4] */
      start[0] = 0;
      start[1] = 0;
      block[0] = 3;
      block[1] = 2;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, block, NULL) < 0)
          TEST_ERROR_SUPPRESSED
      if (H5Dwrite(srcdset[4], H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, buf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Update erbuf */
      for (i = 0; i < 3; i++)
          for (j = 0; j < 2; j++)
              erbuf[i][j + 8] = buf[i][j];
  
      /* Close srcdset[4] srcfile if config option specified */
      if (config & TEST_IO_CLOSE_SRC) {
          if (H5Dclose(srcdset[4]) < 0)
              TEST_ERROR_SUPPRESSED
          srcdset[4] = -1;
          if (config & TEST_IO_DIFFERENT_FILE) {
              if (H5Fclose(srcfile) < 0)
                  TEST_ERROR_SUPPRESSED
              srcfile = -1;
          }
      }
  
      /* Reopen virtual dataset and file if config option specified */
      if (config & TEST_IO_REOPEN_VIRT) {
          if (H5Dclose(vdset) < 0)
              TEST_ERROR_SUPPRESSED
          vdset = -1;
          if (H5Fclose(vfile) < 0)
              TEST_ERROR_SUPPRESSED
          vfile = -1;
          if ((vfile = H5Fopen(vfilename, H5F_ACC_RDWR, vds_fapl)) < 0)
              TEST_ERROR_SUPPRESSED
          if ((vdset = H5Dopen2(vfile, "v_dset", H5P_DEFAULT)) < 0)
              TEST_ERROR_SUPPRESSED
      }
  
      /* Get VDS space */
      if ((filespace = H5Dget_space(vdset)) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Get VDS space dimensions */
      if ((ndims = H5Sget_simple_extent_ndims(filespace)) < 0)
          TEST_ERROR_SUPPRESSED
      if (ndims != 2)
          TEST_ERROR_SUPPRESSED
      if (H5Sget_simple_extent_dims(filespace, dims, mdims) < 0)
          TEST_ERROR_SUPPRESSED
      if (dims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (dims[1] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[0] != 10)
          TEST_ERROR_SUPPRESSED
      if (mdims[1] != 10)
          TEST_ERROR_SUPPRESSED
  
      /* Close filespace */
      if (H5Sclose(filespace) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data through virtual dataset */
      /* Reset rbuf */
      HDmemset(rbuf[0], 0, sizeof(rbuf));
  
      /* Select hyperslab in memory space */
      start[0] = 0;
      start[1] = 0;
      if (H5Sselect_hyperslab(memspace, H5S_SELECT_SET, start, NULL, dims, NULL) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Read data */
      if (H5Dread(vdset, H5T_NATIVE_INT, memspace, H5S_ALL, H5P_DEFAULT, rbuf[0]) < 0)
          TEST_ERROR_SUPPRESSED
  
      /* Verify read data */
      for (i = 0; i < (int)mdims[0]; i++)
          for (j = 0; j < (int)mdims[1]; j++)
              if (rbuf[i][j] != erbuf[i][j])
                  TEST_ERROR_SUPPRESSED
  
      /* Close */
      if (!(config & TEST_IO_CLOSE_SRC)) {
          for (i = 0; i < 5; i++) {
              if (H5Dclose(srcdset[i]) < 0)
                  TEST_ERROR_SUPPRESSED
              srcdset[i] = -1;
          }
          if (H5Fclose(srcfile) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile = -1;
      }
      else if (!(config & TEST_IO_DIFFERENT_FILE)) {
          if (H5Fclose(srcfile) < 0)
              TEST_ERROR_SUPPRESSED
          srcfile = -1;
      }
      if (H5Dclose(vdset) < 0)
          TEST_ERROR_SUPPRESSED
      vdset = -1;
      if (H5Fclose(vfile) < 0)
          TEST_ERROR_SUPPRESSED
      vfile = -1;
      for (i = 0; i < (int)(sizeof(srcspace) / sizeof(srcspace[0])); i++) {
          if (H5Sclose(srcspace[i]) < 0)
              TEST_ERROR_SUPPRESSED
          srcspace[i] = -1;
      }
      for (i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++) {
          if (H5Sclose(vspace[i]) < 0)
              TEST_ERROR_SUPPRESSED
          vspace[i] = -1;
      }
      if (H5Pclose(dcpl) < 0)
          TEST_ERROR_SUPPRESSED
      dcpl = -1;
      if (H5Pclose(srcdcpl) < 0)
          TEST_ERROR_SUPPRESSED
      srcdcpl = -1;
      if (H5Sclose(memspace) < 0)
          TEST_ERROR_SUPPRESSED
      memspace = -1;
  
      PASSED_SUPPRESSED();
      return 0;
  
  error:
      H5E_BEGIN_TRY
      {
          for (i = 0; i < (int)(sizeof(srcdset) / sizeof(srcdset[0])); i++)
              H5Dclose(srcdset[i]);
          H5Dclose(vdset);
          H5Fclose(srcfile);
          H5Fclose(vfile);
          for (i = 0; i < (int)(sizeof(srcspace) / sizeof(srcspace[0])); i++)
              H5Sclose(srcspace[i]);
          for (i = 0; i < (int)(sizeof(vspace) / sizeof(vspace[0])); i++)
              H5Sclose(vspace[i]);
          H5Sclose(filespace);
          H5Sclose(memspace);
          H5Pclose(dcpl);
          H5Pclose(srcdcpl);
      }
      H5E_END_TRY;
  
      return 1;
  } /* end test_all() */
  
  /*-------------------------------------------------------------------------
   * Function:    test_dapl_values
   *
   * Purpose:     Ensure that H5Dget_access_plist returns correct values.
   *
   * Return:      Success:    0
   *              Failure:    1
   *-------------------------------------------------------------------------
   */
  static int
  test_dapl_values(hid_t fapl_id)
  {
      hid_t          fid      = -1;  /* file to write to                     */
      hid_t          dcpl_id  = -1;  /* dataset creation properties          */
      hid_t          dapl_id1 = -1;  /* dataset access properties            */
      hid_t          dapl_id2 = -1;  /* dataset access properties            */
      hid_t          vds_sid  = -1;  /* vds data space                       */
      hid_t          src_sid  = -1;  /* source data space                    */
      hid_t          did1     = -1;  /* dataset                              */
      hid_t          did2     = -1;  /* dataset                              */
      hsize_t        start;          /* hyperslab start                      */
      hsize_t        stride;         /* hyperslab count                      */
      hsize_t        count;          /* hyperslab count                      */
      hsize_t        block;          /* hyperslab count                      */
      hsize_t        dims;           /* dataset size                         */
      hsize_t        max_dims;       /* dataset max size                     */
      H5D_vds_view_t view;           /* view from dapl                       */
      hsize_t        gap_size;       /* gap size from dapl                   */
      char           filename[1024]; /* file names                           */
  
      TESTING_2("H5Dget_access_plist() returns dapl w/ correct values");
  
      /* Create the file */
      h5_fixname(FILENAME[5], fapl_id, filename, sizeof(filename));
      if ((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) < 0)
          FAIL_STACK_ERROR
  
      /* Create the dcpl and set up VDS mapping */
      if ((dcpl_id = H5Pcreate(H5P_DATASET_CREATE)) < 0)
          FAIL_STACK_ERROR
      /* source */
      dims = 42;
      if ((src_sid = H5Screate_simple(1, &dims, NULL)) < 0)
          FAIL_STACK_ERROR
      /* vds */
      dims     = 0;
      max_dims = H5S_UNLIMITED;
      if ((vds_sid = H5Screate_simple(1, &dims, &max_dims)) < 0)
          FAIL_STACK_ERROR
      start  = 0;
      stride = 42;
      count  = H5S_UNLIMITED;
      block  = 42;
      if (H5Sselect_hyperslab(vds_sid, H5S_SELECT_SET, &start, &stride, &count, &block) < 0)
          FAIL_STACK_ERROR
      /* map */
      if (H5Pset_virtual(dcpl_id, vds_sid, "f-%b.h5", "/dset1", src_sid) < 0)
          FAIL_STACK_ERROR
  
      /* Create the dapls and set values
       * There are two of them. The reason for this is that the only way
       * to set the printf gap is to use the default view and using the
       * default isn't the best way to test setting and getting the view.
       */
      /* dapl 1 */
      if ((dapl_id1 = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
          FAIL_STACK_ERROR
      if (H5Pset_virtual_view(dapl_id1, H5D_VDS_FIRST_MISSING) < 0)
          FAIL_STACK_ERROR
      /* dapl 2 */
      if ((dapl_id2 = H5Pcreate(H5P_DATASET_ACCESS)) < 0)
          FAIL_STACK_ERROR
      /* default but we set it explicitly to be sure */
      if (H5Pset_virtual_view(dapl_id2, H5D_VDS_LAST_AVAILABLE) < 0)
          FAIL_STACK_ERROR
      if (H5Pset_virtual_printf_gap(dapl_id2, 123) < 0)
          FAIL_STACK_ERROR
  
      /* Create the datasets */
      if ((did1 = H5Dcreate2(fid, "dset1", H5T_NATIVE_INT, vds_sid, H5P_DEFAULT, dcpl_id, dapl_id1)) < 0)
          FAIL_STACK_ERROR
      if ((did2 = H5Dcreate2(fid, "dset2", H5T_NATIVE_INT, vds_sid, H5P_DEFAULT, dcpl_id, dapl_id2)) < 0)
          FAIL_STACK_ERROR
  
      /* Close the dapls */
      if (H5Pclose(dapl_id1) < 0)
          FAIL_STACK_ERROR
      dapl_id1 = -1;
      if (H5Pclose(dapl_id2) < 0)
          FAIL_STACK_ERROR
      dapl_id2 = -1;
  
      /* Get a data access property lists from the dataset */
      if ((dapl_id1 = H5Dget_access_plist(did1)) < 0)
          FAIL_STACK_ERROR
      if ((dapl_id2 = H5Dget_access_plist(did2)) < 0)
          FAIL_STACK_ERROR
  
      /* Check the values from the dapls */
      /* dapl 1 */
      if (H5Pget_virtual_view(dapl_id1, &view) < 0)
          FAIL_STACK_ERROR
      if (H5D_VDS_FIRST_MISSING != view)
          TEST_ERROR
      /* dapl 2 */
      if (H5Pget_virtual_view(dapl_id2, &view) < 0)
          FAIL_STACK_ERROR
      if (H5D_VDS_LAST_AVAILABLE != view)
          TEST_ERROR
      if (H5Pget_virtual_printf_gap(dapl_id2, &gap_size) < 0)
          FAIL_STACK_ERROR
      if (gap_size != 123)
          TEST_ERROR
  
      /* Close everything */
      if (H5Sclose(vds_sid) < 0)
          FAIL_STACK_ERROR
      if (H5Sclose(src_sid) < 0)
          FAIL_STACK_ERROR
      if (H5Dclose(did1) < 0)
          FAIL_STACK_ERROR
      if (H5Dclose(did2) < 0)
          FAIL_STACK_ERROR
      if (H5Pclose(dapl_id1) < 0)
          FAIL_STACK_ERROR
      if (H5Pclose(dapl_id2) < 0)
          FAIL_STACK_ERROR
      if (H5Pclose(dcpl_id) < 0)
          FAIL_STACK_ERROR
      if (H5Fclose(fid) < 0)
          FAIL_STACK_ERROR
  
      PASSED();
      return 0;
  
  error:
      H5E_BEGIN_TRY
      {
          H5Dclose(did1);
          H5Dclose(did2);
          H5Pclose(dapl_id1);
          H5Pclose(dapl_id2);
          H5Pclose(dcpl_id);
          H5Sclose(vds_sid);
          H5Sclose(src_sid);
          H5Fclose(fid);
      }
      H5E_END_TRY;
      return 1;
  } /* end test_dapl_values() */
  
  /*-------------------------------------------------------------------------
   * Function:    main
   *
   * Purpose:     Tests datasets with virtual layout
   *
   * Note:
   *  Tests are modified to test with the low/high bounds combination
   *  set in fapl.
   *  Please see RFC for "H5Sencode/H5Sdecode Format Change".
   *
   * Return:      EXIT_SUCCESS/EXIT_FAILURE
   *-------------------------------------------------------------------------
   */
  int
  main(void)
  {
      char         filename[FILENAME_BUF_SIZE];
      hid_t        fapl;
      hid_t        vds_fapl = -1; /* File access property list */
      hid_t        src_fapl = -1; /* File access property list */
      int          test_api_config;
      unsigned     bit_config;
      H5F_libver_t low, high; /* Low and high bounds */
      int          nerrors = 0;
  
      /* Testing setup */
      h5_reset();
      fapl = h5_fileaccess();
  
      h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
  
      /* Create FAPLs for VDS and source files */
      if ((vds_fapl = H5Pcopy(fapl)) < 0)
          TEST_ERROR
      if ((src_fapl = H5Pcopy(fapl)) < 0)
          TEST_ERROR
  
      /* Loop through all the combinations of low/high version bounds */
      for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) {
          for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) {
              char        msg[128];    /* Message for file version bounds */
              const char *low_string;  /* The low bound string */
              const char *high_string; /* The high bound string */
  #ifndef VDS_TEST_VERBOSE
              int tmp_nerrors;
  #endif /* VDS_TEST_VERBOSE */
  
              /* Invalid combinations, just continue */
              if (high == H5F_LIBVER_EARLIEST || high < low)
                  continue;
  
              /* Test virtual dataset only for V110 and above */
              if (high < H5F_LIBVER_V110)
                  continue;
  
              /* Set the low/high version bounds */
              if (H5Pset_libver_bounds(vds_fapl, low, high) < 0)
                  TEST_ERROR
              if (H5Pset_libver_bounds(src_fapl, low, high) < 0)
                  TEST_ERROR
  
              /* Display testing info */
              low_string  = h5_get_version_string(low);
              high_string = h5_get_version_string(high);
              HDsnprintf(msg, sizeof(msg),
                         "Testing virtual dataset I/O with file version bounds: (%s, %s):", low_string,
                         high_string);
              HDputs(msg);
  
              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, vds_fapl, low);
  
              TESTING_2("Virtual dataset I/O")
  #ifdef VDS_TEST_VERBOSE
              HDputs("");
  #else  /* VDS_TEST_VERBOSE */
              tmp_nerrors = nerrors;
  #endif /* VDS_TEST_VERBOSE */
  
              for (bit_config = 0; bit_config < TEST_IO_NTESTS; bit_config++) {
                  /* Skip invalid configurations */
                  if ((bit_config & TEST_IO_FCLOSE_SEMI) && (bit_config & TEST_IO_FCLOSE_STRONG))
                      continue;
  
                  /* Print message */
                  PRINT_CONFIG(
                      "%s%s%s, %s file close degree",
                      bit_config & TEST_IO_CLOSE_SRC ? "closed source dataset, " : "",
                      bit_config & TEST_IO_DIFFERENT_FILE ? "different source file" : "same source file",
                      bit_config & TEST_IO_REOPEN_VIRT ? ", reopen virtual file" : "",
                      bit_config & TEST_IO_FCLOSE_SEMI
                          ? "H5F_CLOSE_SEMI"
                          : (bit_config & TEST_IO_FCLOSE_STRONG ? "H5F_CLOSE_STRONG" : "H5F_CLOSE_WEAK"));
  
                  /* Set file close degree */
                  if (bit_config & TEST_IO_FCLOSE_SEMI) {
                      if (H5Pset_fclose_degree(vds_fapl, H5F_CLOSE_SEMI) < 0)
                          TEST_ERROR
                  }
                  else if (bit_config & TEST_IO_FCLOSE_STRONG) {
                      if (H5Pset_fclose_degree(vds_fapl, H5F_CLOSE_STRONG) < 0)
                          TEST_ERROR
                  }
                  else {
                      if (H5Pset_fclose_degree(vds_fapl, H5F_CLOSE_WEAK) < 0)
                          TEST_ERROR
                  }
  
                  /* Run tests */
                  nerrors += test_basic_io(bit_config, vds_fapl, src_fapl);
                  nerrors += test_vds_prefix_first(bit_config, vds_fapl, src_fapl);
                  nerrors += test_unlim(bit_config, vds_fapl, src_fapl);
                  nerrors += test_printf(bit_config, vds_fapl, src_fapl);
                  nerrors += test_all(bit_config, vds_fapl, src_fapl);
              }
  
  #ifndef VDS_TEST_VERBOSE
              if (tmp_nerrors == nerrors)
                  PASSED();
  #endif /* VDS_TEST_VERBOSE */
  
              nerrors += test_dapl_values(vds_fapl);
  
              /* Verify symbol table messages are cached */
              nerrors += (h5_verify_cached_stabs(FILENAME, vds_fapl) < 0 ? 1 : 0);
  
          } /* end for high */
      }     /* end for low */
  
      if (H5Pclose(vds_fapl) < 0)
          TEST_ERROR
      if (H5Pclose(src_fapl) < 0)
          TEST_ERROR
  
      if (nerrors)
          goto error;
      HDprintf("All virtual dataset tests passed.\n");
      h5_cleanup(FILENAME, fapl);
  
      return EXIT_SUCCESS;
  
  error:
      nerrors = MAX(1, nerrors);
      HDprintf("***** %d VIRTUAL DATASET TEST%s FAILED! *****\n", nerrors, 1 == nerrors ? "" : "S");
      return EXIT_FAILURE;
  } /* end main() */
  