summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/unlink.c653
1 files changed, 647 insertions, 6 deletions
diff --git a/test/unlink.c b/test/unlink.c
index 72b64a13..b6939dc 100644
--- a/test/unlink.c
+++ b/test/unlink.c
@@ -18,6 +18,8 @@
*
* Purpose: Test H5Gunlink().
*/
+
+#include <time.h>
#include "h5test.h"
const char *FILENAME[] = {
@@ -25,14 +27,64 @@ const char *FILENAME[] = {
"new_move_a",
"new_move_b",
"lunlink",
+ "filespace",
NULL
};
#define THE_OBJECT "/foo"
-/* Macros for test_create_unlink() */
-#define GROUPNAME "Group"
+/* Macros for test_create_unlink() & test_filespace */
+#define GROUPNAME "group"
+#define GROUP2NAME "group2"
#define NGROUPS 1000
+#define DATASETNAME "dataset"
+#define DATASET2NAME "dataset2"
+#define ATTRNAME "attribute"
+#define TYPENAME "datatype"
+#define FILESPACE_NDIMS 3
+#define FILESPACE_DIM0 20
+#define FILESPACE_DIM1 20
+#define FILESPACE_DIM2 20
+#define FILESPACE_CHUNK0 10
+#define FILESPACE_CHUNK1 10
+#define FILESPACE_CHUNK2 10
+#define FILESPACE_DEFLATE_LEVEL 6
+#define FILESPACE_REWRITE 10
+#define FILESPACE_NATTR 100
+#define FILESPACE_ATTR_NDIMS 2
+#define FILESPACE_ATTR_DIM0 5
+#define FILESPACE_ATTR_DIM1 5
+#define FILESPACE_TOP_GROUPS 10
+#define FILESPACE_NESTED_GROUPS 50
+#define FILESPACE_NDATASETS 50
+
+
+/*-------------------------------------------------------------------------
+ * Function: verify_file_size
+ *
+ * Purpose: Verify that a file is a particular size.
+ *
+ * Return: Success: 1
+ * Failure: 0
+ *
+ * Programmer: Quincey Koziol
+ * Saturday, March 22, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static off_t
+get_file_size(const char *filename)
+{
+ h5_stat_t sb;
+
+ /* Get the file's statistics */
+ if (HDstat(filename, &sb)>=0)
+ return(sb.st_size);
+
+ return(0);
+} /* end get_file_size() */
/*-------------------------------------------------------------------------
@@ -453,11 +505,597 @@ check_new_move(void)
return 0;
error:
- return -1;
+ return 1;
}
/*-------------------------------------------------------------------------
+ * Function: test_filespace
+ *
+ * Purpose: Test proper reuse of space in the file when objects are unlinked
+ *
+ * Return: Success: 0
+ * Failure: number of errors
+ *
+ * Programmer: Quincey Koziol
+ * Saturday, March 22, 2003
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_filespace(void)
+{
+ hid_t fapl; /* File access property list */
+ hid_t fapl_nocache; /* File access property list with raw data cache turned off */
+ hid_t contig_dcpl; /* Dataset creation property list for contiguous dataset */
+ hid_t early_chunk_dcpl; /* Dataset creation property list for chunked dataset & early allocation */
+ hid_t late_chunk_dcpl; /* Dataset creation property list for chunked dataset & late allocation */
+ hid_t comp_dcpl; /* Dataset creation property list for compressed, chunked dataset */
+ hid_t compact_dcpl; /* Dataset creation property list for compact dataset */
+ hid_t file; /* File ID */
+ hid_t group, group2; /* Group IDs */
+ hid_t dataset, dataset2; /* Dataset IDs */
+ hid_t space; /* Dataspace ID */
+ hid_t type; /* Datatype ID */
+ hid_t attr_space; /* Dataspace ID for attributes */
+ hid_t attr; /* Attribute ID */
+ char filename[1024]; /* Name of file to create */
+ char objname[128]; /* Name of object to create */
+ hsize_t dims[FILESPACE_NDIMS]= {FILESPACE_DIM0, FILESPACE_DIM1, FILESPACE_DIM2}; /* Dataset dimensions */
+ hsize_t chunk_dims[FILESPACE_NDIMS]= {FILESPACE_CHUNK0, FILESPACE_CHUNK1, FILESPACE_CHUNK2}; /* Chunk dimensions */
+ hsize_t attr_dims[FILESPACE_ATTR_NDIMS]= {FILESPACE_ATTR_DIM0, FILESPACE_ATTR_DIM1}; /* Attribute dimensions */
+ int *data; /* Pointer to dataset buffer */
+ int *tmp_data; /* Temporary pointer to dataset buffer */
+ off_t empty_size; /* Size of an empty file */
+ off_t file_size; /* Size of each file created */
+ unsigned u,v,w; /* Local index variables */
+
+ /* Metadata cache parameters */
+ int mdc_nelmts;
+ size_t rdcc_nelmts;
+ size_t rdcc_nbytes;
+ double rdcc_w0;
+
+
+ puts("Testing file space gets reused");
+
+ /* Open file */
+ fapl = h5_fileaccess();
+ h5_fixname(FILENAME[4], fapl, filename, sizeof filename);
+
+/* Create FAPL with raw data cache disabled */
+ /* Create file access property list with raw data cache disabled */
+ if ((fapl_nocache=H5Pcopy(fapl))<0) TEST_ERROR;
+
+ /* Get the cache settings */
+ if(H5Pget_cache(fapl_nocache,&mdc_nelmts,&rdcc_nelmts,&rdcc_nbytes,&rdcc_w0)<0) TEST_ERROR;
+
+ /* Disable the raw data cache */
+ rdcc_nelmts=0;
+ rdcc_nbytes=0;
+ if(H5Pset_cache(fapl_nocache,mdc_nelmts,rdcc_nelmts,rdcc_nbytes,rdcc_w0)<0) TEST_ERROR;
+
+/* Create empty file for size comparisons later */
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of an empty file */
+ if((empty_size=get_file_size(filename))==0) TEST_ERROR;
+
+/* Create common objects for datasets */
+
+ /* Create dataset creation property list for contigous storage */
+ if ((contig_dcpl=H5Pcreate(H5P_DATASET_CREATE))<0) TEST_ERROR;
+
+ /* Make certain that space is allocated early */
+ if(H5Pset_alloc_time(contig_dcpl, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR;
+
+ /* Create dataset creation property list for chunked storage & early allocation */
+ if ((early_chunk_dcpl=H5Pcopy(contig_dcpl))<0) TEST_ERROR;
+
+ /* Set chunk dimensions */
+ if(H5Pset_chunk(early_chunk_dcpl, FILESPACE_NDIMS, chunk_dims) < 0) TEST_ERROR;
+
+ /* Create dataset creation property list for chunked storage & late allocation */
+ if ((late_chunk_dcpl=H5Pcreate(H5P_DATASET_CREATE))<0) TEST_ERROR;
+
+ /* Set chunk dimensions */
+ if(H5Pset_chunk(late_chunk_dcpl, FILESPACE_NDIMS, chunk_dims) < 0) TEST_ERROR;
+
+ /* Create dataset creation property list for compressed, chunked storage & early allocation */
+ if ((comp_dcpl=H5Pcopy(early_chunk_dcpl))<0) TEST_ERROR;
+
+ /* Make certain that space is allocated early */
+ if(H5Pset_deflate(comp_dcpl, FILESPACE_DEFLATE_LEVEL) < 0) TEST_ERROR;
+
+ /* Create dataset creation property list for compact storage */
+ if ((compact_dcpl=H5Pcreate(H5P_DATASET_CREATE))<0) TEST_ERROR;
+
+ /* Set to compact storage */
+ if(H5Pset_layout(compact_dcpl, H5D_COMPACT) < 0) TEST_ERROR;
+
+ /* Create dataspace for datasets */
+ if((space = H5Screate_simple(FILESPACE_NDIMS, dims, NULL))<0) TEST_ERROR;
+
+ /* Create buffer for writing dataset */
+ if((data = HDmalloc(sizeof(int)*FILESPACE_DIM0*FILESPACE_DIM1*FILESPACE_DIM2))==NULL) TEST_ERROR;
+
+/* Create single dataset (with contiguous storage & late allocation), remove it & verify file size */
+ TESTING(" contiguous dataset with late allocation");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create a single dataset to remove */
+ if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, H5P_DEFAULT))<0) TEST_ERROR;
+ if(H5Dclose (dataset)<0) TEST_ERROR;
+
+ /* Remove the dataset */
+ if(H5Gunlink (file, DATASETNAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create single dataset (with contiguous storage & early allocation), remove it & verify file size */
+ TESTING(" contiguous dataset with early allocation");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create a single dataset to remove */
+ if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, contig_dcpl))<0) TEST_ERROR;
+ if(H5Dclose (dataset)<0) TEST_ERROR;
+
+ /* Remove the dataset */
+ if(H5Gunlink (file, DATASETNAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create single dataset (with chunked storage & late allocation), remove it & verify file size */
+ TESTING(" chunked dataset with late allocation");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create a single dataset to remove */
+ if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, late_chunk_dcpl))<0) TEST_ERROR;
+ if(H5Dclose (dataset)<0) TEST_ERROR;
+
+ /* Remove the dataset */
+ if(H5Gunlink (file, DATASETNAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create single dataset (with chunked storage & early allocation), remove it & verify file size */
+ TESTING(" chunked dataset with early allocation");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create a single dataset to remove */
+ if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, early_chunk_dcpl))<0) TEST_ERROR;
+ if(H5Dclose (dataset)<0) TEST_ERROR;
+
+ /* Remove the dataset */
+ if(H5Gunlink (file, DATASETNAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create single dataset (with compressed storage & early allocation), remove it & verify file size */
+ TESTING(" compressed, chunked dataset");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create a single dataset to remove */
+ if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, comp_dcpl))<0) TEST_ERROR;
+ if(H5Dclose (dataset)<0) TEST_ERROR;
+
+ /* Remove the dataset */
+ if(H5Gunlink (file, DATASETNAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create single dataset (with compressed storage & early allocation), re-write it a bunch of
+ * times (which should re-allocate blocks many times) and remove it & verify
+ * file size.
+ */
+ TESTING(" re-writing compressed, chunked dataset");
+
+ /* Create file (using FAPL with disabled raw data cache) */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_nocache))<0) TEST_ERROR;
+
+ /* Create a single dataset to remove */
+ if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, comp_dcpl))<0) TEST_ERROR;
+
+ /* Alternate re-writing dataset with compressible & random data */
+ for(u=0; u<FILESPACE_REWRITE; u++) {
+ /* Set buffer to some compressible values */
+ for (v=0, tmp_data=data; v<(FILESPACE_DIM0*FILESPACE_DIM1*FILESPACE_DIM2); v++)
+ *tmp_data++ = v*u;
+
+ /* Write the buffer to the dataset */
+ if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data)<0) TEST_ERROR;
+
+ /* Set buffer to different random numbers each time */
+ for (v=0, tmp_data=data; v<(FILESPACE_DIM0*FILESPACE_DIM1*FILESPACE_DIM2); v++)
+ *tmp_data++ = HDrandom();
+
+ /* Write the buffer to the dataset */
+ if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data)<0) TEST_ERROR;
+ } /* end for */
+
+ /* Close dataset */
+ if(H5Dclose (dataset)<0) TEST_ERROR;
+
+ /* Remove the dataset */
+ if(H5Gunlink (file, DATASETNAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create single dataset (with compact storage), remove it & verify file size */
+ TESTING(" compact dataset");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create a single dataset to remove */
+ if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, compact_dcpl))<0) TEST_ERROR;
+ if(H5Dclose (dataset)<0) TEST_ERROR;
+
+ /* Remove the dataset */
+ if(H5Gunlink (file, DATASETNAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create two datasets (with contiguous storage), alternate adding attributes
+ * to each one (which creates many object header continuations),
+ * remove both & verify file size.
+ */
+ TESTING(" object header continuations");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create datasets to remove */
+ if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, contig_dcpl))<0) TEST_ERROR;
+ if((dataset2 = H5Dcreate (file, DATASET2NAME, H5T_NATIVE_INT, space, contig_dcpl))<0) TEST_ERROR;
+
+ /* Create a dataspace for the attributes */
+ if((attr_space = H5Screate_simple(FILESPACE_ATTR_NDIMS, attr_dims, NULL))<0) TEST_ERROR;
+
+ /* Alternate adding attributes to each one */
+ for(u=0; u<FILESPACE_NATTR; u++) {
+ /* Set the name of the attribute to create */
+ sprintf(objname,"%s %u",ATTRNAME,u);
+
+ /* Create an attribute on the first dataset */
+ if((attr = H5Acreate (dataset, objname, H5T_NATIVE_INT, attr_space, H5P_DEFAULT))<0) TEST_ERROR;
+
+ /* Don't worry about writing the attribute - it will have a fill value */
+
+ /* Close the attribute on the first dataset */
+ if(H5Aclose (attr)<0) TEST_ERROR;
+
+ /* Create an attribute on the second dataset */
+ if((attr = H5Acreate (dataset2, objname, H5T_NATIVE_INT, attr_space, H5P_DEFAULT))<0) TEST_ERROR;
+
+ /* Don't worry about writing the attribute - it will have a fill value */
+
+ /* Close the attribute on the second dataset */
+ if(H5Aclose (attr)<0) TEST_ERROR;
+
+ /* Flush the file (to fix the sizes of object header buffers, etc) */
+ if(H5Fflush(file,H5F_SCOPE_GLOBAL)<0) TEST_ERROR;
+ } /* end for */
+
+ /* Close the dataspace for the attributes */
+ if(H5Sclose (attr_space)<0) TEST_ERROR;
+
+ /* Close datasets */
+ if(H5Dclose (dataset)<0) TEST_ERROR;
+ if(H5Dclose (dataset2)<0) TEST_ERROR;
+
+ /* Remove the datasets */
+ if(H5Gunlink (file, DATASETNAME)<0) TEST_ERROR;
+ if(H5Gunlink (file, DATASET2NAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create single named datatype, remove it & verify file size */
+ TESTING(" named datatype");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create datatype to commit */
+ if((type = H5Tcopy (H5T_NATIVE_INT))<0) TEST_ERROR;
+
+ /* Create a single name datatype to remove */
+ if(H5Tcommit (file, TYPENAME, type)<0) TEST_ERROR;
+ if(H5Tclose (type)<0) TEST_ERROR;
+
+ /* Remove the named datatype */
+ if(H5Gunlink (file, TYPENAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create single group, remove it & verify file size */
+ TESTING(" single group");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create a single group to remove */
+ if((group = H5Gcreate (file, GROUPNAME, 0))<0) TEST_ERROR;
+ if(H5Gclose (group)<0) TEST_ERROR;
+
+ /* Remove the group */
+ if(H5Gunlink (file, GROUPNAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create many groups, remove them & verify file size */
+ TESTING(" multiple groups");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create a many groups to remove */
+ for(u=0; u<NGROUPS; u++) {
+ sprintf(objname,"%s %u",GROUPNAME,u);
+ if((group = H5Gcreate (file, objname, 0))<0) TEST_ERROR;
+ if(H5Gclose (group)<0) TEST_ERROR;
+ } /* end for */
+
+ /* Remove the all the groups */
+ for(u=0; u<NGROUPS; u++) {
+ sprintf(objname,"%s %u",GROUPNAME,u);
+ if(H5Gunlink (file, objname)<0) TEST_ERROR;
+ } /* end for */
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create simple group hiearchy, remove it & verify file size */
+ TESTING(" simple group hierarchy");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create a small group hierarchy to remove */
+ if((group = H5Gcreate (file, GROUPNAME, 0))<0) TEST_ERROR;
+ if((group2 = H5Gcreate (group, GROUP2NAME, 0))<0) TEST_ERROR;
+ if(H5Gclose (group2)<0) TEST_ERROR;
+ if(H5Gclose (group)<0) TEST_ERROR;
+
+ /* Remove the second group */
+ if(H5Gunlink (file, GROUPNAME "/" GROUP2NAME)<0) TEST_ERROR;
+
+ /* Remove the first group */
+ if(H5Gunlink (file, GROUPNAME)<0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+/* Create complex group hiearchy, remove it & verify file size */
+ TESTING(" complex group hierarchy");
+
+ /* Create file */
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
+
+ /* Create a complex group hierarchy to remove */
+ for(u=0; u<FILESPACE_TOP_GROUPS; u++) {
+ /* Create group */
+ sprintf(objname,"%s %u",GROUPNAME,u);
+ if((group = H5Gcreate (file, objname, 0))<0) TEST_ERROR;
+
+ /* Create nested groups inside top groups */
+ for(v=0; v<FILESPACE_NESTED_GROUPS; v++) {
+ /* Create group */
+ sprintf(objname,"%s %u",GROUP2NAME,v);
+ if((group2 = H5Gcreate (group, objname, 0))<0) TEST_ERROR;
+
+ /* Create datasets inside nested groups */
+ for(w=0; w<FILESPACE_NDATASETS; w++) {
+ /* Create & close a dataset */
+ sprintf(objname,"%s %u",DATASETNAME,w);
+ if((dataset = H5Dcreate (group2, objname, H5T_NATIVE_INT, space, H5P_DEFAULT))<0) TEST_ERROR;
+ if(H5Dclose (dataset)<0) TEST_ERROR;
+ } /* end for */
+
+ /* Close nested group */
+ if(H5Gclose (group2)<0) TEST_ERROR;
+ } /* end for */
+
+ /* Close top group */
+ if(H5Gclose (group)<0) TEST_ERROR;
+ } /* end for */
+
+ /* Remove complex group hierarchy */
+ for(u=0; u<FILESPACE_TOP_GROUPS; u++) {
+ /* Open group */
+ sprintf(objname,"%s %u",GROUPNAME,u);
+ if((group = H5Gopen (file, objname))<0) TEST_ERROR;
+
+ /* Open nested groups inside top groups */
+ for(v=0; v<FILESPACE_NESTED_GROUPS; v++) {
+ /* Create group */
+ sprintf(objname,"%s %u",GROUP2NAME,v);
+ if((group2 = H5Gopen (group, objname))<0) TEST_ERROR;
+
+ /* Remove datasets inside nested groups */
+ for(w=0; w<FILESPACE_NDATASETS; w++) {
+ /* Remove dataset */
+ sprintf(objname,"%s %u",DATASETNAME,w);
+ if(H5Gunlink (group2, objname)<0) TEST_ERROR;
+ } /* end for */
+
+ /* Close nested group */
+ if(H5Gclose (group2)<0) TEST_ERROR;
+
+ /* Remove nested group */
+ sprintf(objname,"%s %u",GROUP2NAME,v);
+ if(H5Gunlink (group, objname)<0) TEST_ERROR;
+ } /* end for */
+
+ /* Close top group */
+ if(H5Gclose (group)<0) TEST_ERROR;
+
+ /* Remove top group */
+ sprintf(objname,"%s %u",GROUPNAME,u);
+ if(H5Gunlink (file, objname)<0) TEST_ERROR;
+ } /* end for */
+
+ /* Close file */
+ if(H5Fclose(file)<0) TEST_ERROR;
+
+ /* Get the size of the file */
+ if((file_size=get_file_size(filename))==0) TEST_ERROR;
+
+ /* Verify the file is correct size */
+ if(file_size!=empty_size) TEST_ERROR;
+
+ PASSED();
+
+ /* Cleanup common objects */
+
+ /* Release dataset buffer */
+ HDfree(data);
+
+ /* Close property lists */
+ if(H5Pclose(fapl)<0) TEST_ERROR;
+ if(H5Pclose(fapl_nocache)<0) TEST_ERROR;
+ if(H5Pclose(contig_dcpl)<0) TEST_ERROR;
+ if(H5Pclose(early_chunk_dcpl)<0) TEST_ERROR;
+ if(H5Pclose(late_chunk_dcpl)<0) TEST_ERROR;
+ if(H5Pclose(comp_dcpl)<0) TEST_ERROR;
+ if(H5Pclose(compact_dcpl)<0) TEST_ERROR;
+
+ /* Close dataspace */
+ if(H5Sclose(space)<0) TEST_ERROR;
+
+ /* Indicate success */
+ /* Don't print final "PASSED", since we aren't on the correct line anymore */
+ return 0;
+
+error:
+ return 1;
+} /* end test_filespace() */
+
+
+/*-------------------------------------------------------------------------
* Function: test_create_unlink
*
* Purpose: Creates and then unlinks a large number of objects
@@ -563,12 +1201,14 @@ main(void)
size_t rdcc_nbytes;
double rdcc_w0;
+ /* Set the random # seed */
+ HDsrandom((unsigned long)time(NULL));
+
/* Open */
h5_reset();
fapl = h5_fileaccess();
h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
- if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0)
- goto error;
+ if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl))<0) TEST_ERROR;
/* Make copy of regular fapl, to turn down the elements in the metadata cache */
if((fapl2=H5Pcopy(fapl))<0)
@@ -590,6 +1230,7 @@ main(void)
nerrors += test_rename(file);
nerrors += test_new_move();
nerrors += check_new_move();
+ nerrors += test_filespace();
/* Test creating & unlinking lots of objects with default FAPL */
nerrors += test_create_unlink("create and unlink large number of objects",fapl);
@@ -597,7 +1238,7 @@ main(void)
nerrors += test_create_unlink("create and unlink large number of objects with small cache",fapl2);
/* Close */
- if (H5Fclose(file)<0) goto error;
+ if (H5Fclose(file)<0) TEST_ERROR;
if (nerrors) {
printf("***** %d FAILURE%s! *****\n", nerrors, 1==nerrors?"":"S");
exit(1);