summaryrefslogtreecommitdiffstats
path: root/test/stab.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/stab.c')
-rw-r--r--test/stab.c732
1 files changed, 724 insertions, 8 deletions
diff --git a/test/stab.c b/test/stab.c
index 947825c..33c0fce 100644
--- a/test/stab.c
+++ b/test/stab.c
@@ -16,13 +16,14 @@
* Programmer: Robb Matzke <matzke@llnl.gov>
* Tuesday, November 24, 1998
*/
-#include "h5test.h"
-/*
- * This file needs to access private datatypes from the H5G package.
- */
-#define H5G_PACKAGE
-#include "H5Gpkg.h"
+#define H5G_PACKAGE /*suppress error about including H5Gpkg */
+
+/* Define this macro to indicate that the testing APIs should be available */
+#define H5G_TESTING
+
+#include "h5test.h"
+#include "H5Gpkg.h" /* Groups */
const char *FILENAME[] = {
"stab1",
@@ -30,6 +31,40 @@ const char *FILENAME[] = {
NULL
};
+#define NAME_BUF_SIZE 1024
+
+/* Definitions for 'lifecycle' test */
+#define LIFECYCLE_TOP_GROUP "top"
+#define LIFECYCLE_BOTTOM_GROUP "bottom %u"
+#define LIFECYCLE_MAX_COMPACT 4
+#define LIFECYCLE_MIN_DENSE 3
+#define LIFECYCLE_EST_NUM_ENTRIES 3
+#define LIFECYCLE_EST_NAME_LEN 10
+
+/* Definitions for 'long_compact' test */
+#define LONG_COMPACT_LENGTH ((64 * 1024) + 1024)
+
+/* Definitions for 'read_old' test */
+#define READ_OLD_NGROUPS 100
+#define READ_OLD_BUFSIZE 1024
+
+/* The group_old.h5 is generated from gen_old_fill.c in HDF5 'test' directory
+ * for version 1.6. To get this data file, simply compile gen_old_group.c with
+ * the HDF5 library in that branch and run it. */
+#define FILE_OLD_GROUPS "group_old.h5"
+
+/* Definitions for 'no_compact' test */
+#define NO_COMPACT_TOP_GROUP "top"
+#define NO_COMPACT_BOTTOM_GROUP "bottom %u"
+#define NO_COMPACT_MAX_COMPACT 0
+#define NO_COMPACT_MIN_DENSE 0
+
+/* Definitions for 'no_compact' test */
+#define GCPL_ON_ROOT_MIDDLE_GROUP "/middle"
+#define GCPL_ON_ROOT_BOTTOM_GROUP "/middle/bottom"
+#define GCPL_ON_ROOT_MAX_COMPACT 4
+#define GCPL_ON_ROOT_MIN_DENSE 2
+
/*-------------------------------------------------------------------------
* Function: test_misc
@@ -127,11 +162,11 @@ test_long(hid_t file)
TESTING("long names");
/* Group names */
- name1 = malloc(namesize);
+ name1 = HDmalloc(namesize);
for (i=0; i<namesize; i++)
name1[i] = (char)('A' + i%26);
name1[namesize-1] = '\0';
- name2 = malloc(2*namesize + 2);
+ name2 = HDmalloc(2*namesize + 2);
sprintf(name2, "%s/%s", name1, name1);
/* Create groups */
@@ -146,6 +181,10 @@ test_long(hid_t file)
H5Gclose(g1);
H5Gclose(g2);
+ /* Release name buffers */
+ HDfree(name2);
+ HDfree(name1);
+
PASSED();
return 0;
@@ -153,6 +192,10 @@ test_long(hid_t file)
H5E_BEGIN_TRY {
H5Gclose(g1);
H5Gclose(g2);
+ if(name2)
+ free(name2);
+ if(name1)
+ free(name1);
} H5E_END_TRY;
return 1;
}
@@ -214,6 +257,674 @@ test_large(hid_t file)
/*-------------------------------------------------------------------------
+ * Function: lifecycle
+ *
+ * Purpose: Test that adding links to a group follow proper "lifecycle"
+ * of empty->compact->symbol table->compact->empty. (As group
+ * is created, links are added, then links removed)
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ * Monday, October 17, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+lifecycle(hid_t fapl)
+{
+ hid_t fid = (-1); /* File ID */
+ hid_t gid = (-1); /* Group ID */
+ hid_t gid2 = (-1); /* Datatype ID */
+ hid_t gcpl = (-1); /* Group creation property list ID */
+ size_t lheap_size_hint; /* Local heap size hint */
+ unsigned max_compact; /* Maximum # of links to store in group compactly */
+ unsigned min_dense; /* Minimum # of links to store in group "densely" */
+ unsigned est_num_entries; /* Estimated # of entries in group */
+ unsigned est_name_len; /* Estimated length of entry name */
+ unsigned nmsgs; /* Number of messages in group's header */
+ char objname[NAME_BUF_SIZE]; /* Object name */
+ char filename[NAME_BUF_SIZE];
+ off_t empty_size; /* Size of an empty file */
+ unsigned u; /* Local index variable */
+ off_t file_size; /* Size of each file created */
+
+ TESTING("group lifecycle");
+
+ /* Create file */
+ h5_fixname(FILENAME[1], fapl, filename, sizeof(filename));
+ if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(fid) < 0) TEST_ERROR;
+
+ /* Get size of file as empty */
+ if((empty_size = h5_get_file_size(filename)) == 0) TEST_ERROR;
+
+ /* Re-open file */
+ if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR;
+
+ /* Set up group creation property list */
+ if((gcpl = H5Pcreate(H5P_GROUP_CREATE)) < 0) TEST_ERROR;
+
+ /* Query default group creation property settings */
+ if(H5Pget_local_heap_size_hint(gcpl, &lheap_size_hint) < 0) TEST_ERROR;
+ if(lheap_size_hint != H5G_CRT_GINFO_LHEAP_SIZE_HINT) TEST_ERROR;
+ if(H5Pget_link_phase_change(gcpl, &max_compact, &min_dense) < 0) TEST_ERROR;
+ if(max_compact != H5G_CRT_GINFO_MAX_COMPACT) TEST_ERROR;
+ if(min_dense != H5G_CRT_GINFO_MIN_DENSE) TEST_ERROR;
+ if(H5Pget_est_link_info(gcpl, &est_num_entries, &est_name_len) < 0) TEST_ERROR;
+ if(est_num_entries != H5G_CRT_GINFO_EST_NUM_ENTRIES) TEST_ERROR;
+ if(est_name_len != H5G_CRT_GINFO_EST_NAME_LEN) TEST_ERROR;
+
+ /* Set GCPL parameters */
+ if(H5Pset_link_phase_change(gcpl, LIFECYCLE_MAX_COMPACT, LIFECYCLE_MIN_DENSE) < 0) TEST_ERROR;
+ if(H5Pset_est_link_info(gcpl, LIFECYCLE_EST_NUM_ENTRIES, LIFECYCLE_EST_NAME_LEN) < 0) TEST_ERROR;
+
+ /* Create group for testing lifecycle */
+ if((gid = H5Gcreate_expand(fid, LIFECYCLE_TOP_GROUP, gcpl, H5P_DEFAULT)) < 0) TEST_ERROR
+
+ /* Query default group creation property settings */
+ if(H5Pget_link_phase_change(gcpl, &max_compact, &min_dense) < 0) TEST_ERROR;
+ if(max_compact != LIFECYCLE_MAX_COMPACT) TEST_ERROR;
+ if(min_dense != LIFECYCLE_MIN_DENSE) TEST_ERROR;
+ if(H5Pget_est_link_info(gcpl, &est_num_entries, &est_name_len) < 0) TEST_ERROR;
+ if(est_num_entries != LIFECYCLE_EST_NUM_ENTRIES) TEST_ERROR;
+ if(est_name_len != LIFECYCLE_EST_NAME_LEN) TEST_ERROR;
+
+ /* Use internal testing routine to check that the group has no links or symbol table */
+ if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR;
+
+ /* Create first "bottom" group */
+ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, (unsigned)0);
+ if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
+
+ /* Check on bottom group's status */
+ if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR;
+
+ /* Close bottom group */
+ if(H5Gclose(gid2) < 0) TEST_ERROR
+
+ /* Check on top group's status */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR;
+ if(H5G_has_links_test(gid, &nmsgs) != TRUE) TEST_ERROR;
+ if(nmsgs != 1) TEST_ERROR;
+
+ /* Create several more bottom groups, to push the top group almost to a symbol table */
+ /* (Start counting at '1', since we've already created one bottom group */
+ for(u = 1; u < LIFECYCLE_MAX_COMPACT; u++) {
+ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
+ if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
+
+ /* Check on bottom group's status */
+ if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR;
+
+ /* Close bottom group */
+ if(H5Gclose(gid2) < 0) TEST_ERROR
+ } /* end for */
+
+ /* Check on top group's status */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR;
+ if(H5G_has_links_test(gid, &nmsgs) != TRUE) TEST_ERROR;
+ if(nmsgs != LIFECYCLE_MAX_COMPACT) TEST_ERROR;
+
+ /* Create one more "bottom" group, which should push top group into using a symbol table */
+ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
+ if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
+
+ /* Check on bottom group's status */
+ if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR;
+
+ /* Close bottom group */
+ if(H5Gclose(gid2) < 0) TEST_ERROR
+
+ /* Check on top group's status */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR;
+ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR;
+ if(H5G_has_stab_test(gid) != TRUE) TEST_ERROR;
+
+ /* Unlink objects from top group */
+ while(u >= LIFECYCLE_MIN_DENSE) {
+ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
+
+ if(H5Gunlink(gid, objname) < 0) TEST_ERROR
+
+ u--;
+ } /* end while */
+
+ /* Check on top group's status */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR;
+ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR;
+ if(H5G_has_stab_test(gid) != TRUE) TEST_ERROR;
+
+ /* Unlink one more object from the group, which should transform back to using links */
+ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
+ if(H5Gunlink(gid, objname) < 0) TEST_ERROR
+ u--;
+
+ /* Check on top group's status */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR;
+ if(H5G_has_links_test(gid, &nmsgs) != TRUE) TEST_ERROR;
+ if(nmsgs != (LIFECYCLE_MIN_DENSE - 1)) TEST_ERROR;
+
+ /* Unlink last two objects from top group */
+ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
+ if(H5Gunlink(gid, objname) < 0) TEST_ERROR
+ u--;
+ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
+ if(H5Gunlink(gid, objname) < 0) TEST_ERROR
+
+ /* Check on top group's status */
+ if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR;
+
+ /* Close top group */
+ if(H5Gclose(gid) < 0) TEST_ERROR;
+
+ /* Unlink top group */
+ if(H5Gunlink(fid, LIFECYCLE_TOP_GROUP) < 0) TEST_ERROR
+
+ /* Close GCPL */
+ if(H5Pclose(gcpl) < 0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(fid) < 0) TEST_ERROR;
+
+ /* Get size of file as empty */
+ if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR;
+
+ /* Verify that file is correct size */
+ if(file_size != empty_size) TEST_ERROR;
+
+
+ PASSED();
+ return 0;
+
+error:
+ H5E_BEGIN_TRY {
+ H5Gclose(gcpl);
+ H5Gclose(gid2);
+ H5Gclose(gid);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ return 1;
+} /* end lifecycle() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: long_compact
+ *
+ * Purpose: Test that long links are correctly _not_ put into compact
+ * form.
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ * Tuesday, October 18, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+long_compact(hid_t fapl)
+{
+ hid_t fid = (-1); /* File ID */
+ hid_t gid = (-1); /* Group ID */
+ hid_t gid2 = (-1); /* Group ID */
+ char *objname; /* Object name */
+ char filename[NAME_BUF_SIZE];
+ off_t empty_size; /* Size of an empty file */
+ off_t file_size; /* Size of each file created */
+
+ TESTING("long link names in compact groups");
+
+ /* Create file */
+ h5_fixname(FILENAME[1], fapl, filename, sizeof(filename));
+ if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
+
+ /* Close file */
+ if(H5Fclose(fid) < 0) TEST_ERROR
+
+ /* Get size of file as empty */
+ if((empty_size = h5_get_file_size(filename)) == 0) TEST_ERROR
+
+ /* Construct very long object name template */
+ if((objname = HDmalloc(LONG_COMPACT_LENGTH+1)) == NULL) TEST_ERROR
+ HDmemset(objname, 'a', LONG_COMPACT_LENGTH);
+ objname[LONG_COMPACT_LENGTH] = '\0';
+
+ /* Re-open file */
+ if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR
+
+ /* Create top group */
+ if((gid = H5Gcreate(fid, "top", (size_t)0)) < 0) TEST_ERROR
+
+ /* Use internal testing routine to check that the group has no links or symbol table */
+ if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR
+
+ /* Create first group with "long" name */
+ if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
+
+ /* Check on bottom group's status */
+ if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR
+
+ /* Close bottom group */
+ if(H5Gclose(gid2) < 0) TEST_ERROR
+
+ /* Check on top group's status */
+ /* (Should have symbol table to hold links, since name is too long for object header message) */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
+ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
+ if(H5G_has_stab_test(gid) != TRUE) TEST_ERROR
+
+ /* Create second group with "long" name */
+ objname[0] = 'b';
+ if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
+
+ /* Check on bottom group's status */
+ if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR;
+
+ /* Close bottom group */
+ if(H5Gclose(gid2) < 0) TEST_ERROR
+
+ /* Check on top group's status */
+ /* (Should have symbol table to hold links, since name is too long for object header message) */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
+ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
+ if(H5G_has_stab_test(gid) != TRUE) TEST_ERROR
+
+ /* Unlink second object from top group */
+ if(H5Gunlink(gid, objname) < 0) TEST_ERROR
+
+ /* Check on top group's status */
+ /* (Should still be symbol table to hold links, since name is too long for object header message) */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
+ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
+ if(H5G_has_stab_test(gid) != TRUE) TEST_ERROR
+
+ /* Unlink first object from top group */
+ objname[0] = 'a';
+ if(H5Gunlink(gid, objname) < 0) TEST_ERROR
+
+ /* Check on top group's status */
+ /* (Should have deleted the symbol table now) */
+ if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR;
+
+ /* Free object name */
+ HDfree(objname);
+
+ /* Close top group */
+ if(H5Gclose(gid) < 0) TEST_ERROR
+
+ /* Unlink top group */
+ if(H5Gunlink(fid, "top") < 0) TEST_ERROR
+
+ /* Close file */
+ if(H5Fclose(fid) < 0) TEST_ERROR
+
+ /* Get size of file as empty */
+ if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR;
+
+ /* Verify that file is correct size */
+ if(file_size != empty_size) TEST_ERROR;
+
+ PASSED();
+ return 0;
+
+error:
+ H5E_BEGIN_TRY {
+ H5Gclose(gid2);
+ H5Gclose(gid);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ return 1;
+} /* end long_compact() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: read_old
+ *
+ * Purpose: Test reading a file with "old style" (symbol table) groups
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ * Monday, October 24, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+read_old(hid_t fapl)
+{
+ int fd_old = (-1), fd_new = (-1); /* File descriptors for copying data */
+ hid_t fid = (-1); /* File ID */
+ hid_t gid = (-1); /* Group ID */
+ hid_t gid2 = (-1); /* Group ID */
+ char buf[READ_OLD_BUFSIZE]; /* Buffer for copying data */
+ ssize_t nread; /* Number of bytes read in */
+ char objname[NAME_BUF_SIZE]; /* Object name */
+ unsigned u; /* Local index variable */
+ char *srcdir = HDgetenv("srcdir"); /* where the src code is located */
+ char filename[512]=""; /* old test file name */
+ char filename2[NAME_BUF_SIZE]; /* copy of old test file */
+
+ TESTING("reading old groups");
+
+ /* Generate correct name for test file by prepending the source path */
+ if(srcdir && ((HDstrlen(srcdir) + HDstrlen(FILE_OLD_GROUPS) + 1) < sizeof(filename))) {
+ HDstrcpy(filename, srcdir);
+ HDstrcat(filename, "/");
+ }
+ HDstrcat(filename, FILE_OLD_GROUPS);
+
+ /* Create filename */
+ h5_fixname(FILENAME[1], fapl, filename2, sizeof(filename2));
+
+ /* Copy old file into temporary file */
+ if((fd_old = HDopen(filename, O_RDONLY, 0666)) < 0) TEST_ERROR
+ if((fd_new = HDopen(filename2, O_RDWR|O_CREAT|O_TRUNC, 0666)) < 0) TEST_ERROR
+
+ /* Copy data */
+ while((nread = HDread(fd_old, buf, (size_t)READ_OLD_BUFSIZE)) > 0)
+ HDwrite(fd_new, buf, (size_t)nread);
+
+ /* Close files */
+ if(HDclose(fd_old) < 0) TEST_ERROR
+ if(HDclose(fd_new) < 0) TEST_ERROR
+
+
+ /* Open copied file */
+ if((fid = H5Fopen(filename2, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR
+
+ /* Attempt to open "old" group */
+ if((gid = H5Gopen(fid, "old")) < 0) TEST_ERROR
+
+ /* Check on old group's status */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
+ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
+ if(H5G_has_stab_test(gid) != TRUE) TEST_ERROR
+
+ /* Create a bunch of objects in the group */
+ for(u = 0; u < READ_OLD_NGROUPS; u++) {
+ sprintf(objname, "Group %u", u);
+ if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
+
+ /* Check on bottom group's status */
+ if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR
+
+ /* Close bottom group */
+ if(H5Gclose(gid2) < 0) TEST_ERROR
+ } /* end for */
+
+ /* Check on old group's status */
+ /* (Should stay in old "symbol table" form) */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
+ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
+ if(H5G_has_stab_test(gid) != TRUE) TEST_ERROR
+
+ /* Delete new objects from old group */
+ for(u = 0; u < READ_OLD_NGROUPS; u++) {
+ sprintf(objname, "Group %u", u);
+ if(H5Gunlink(gid, objname) < 0) TEST_ERROR
+ } /* end for */
+
+ /* Check on old group's status */
+ /* (Should stay in old "symbol table" form) */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
+ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
+ if(H5G_has_stab_test(gid) != TRUE) TEST_ERROR
+
+ /* Close old group */
+ if(H5Gclose(gid) < 0) TEST_ERROR;
+
+ /* Close first file */
+ if(H5Fclose(fid)<0) TEST_ERROR;
+
+ PASSED();
+ return 0;
+
+error:
+ H5E_BEGIN_TRY {
+ H5Gclose(gid);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ return 1;
+} /* end read_old() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: no_compact
+ *
+ * Purpose: Test that its possible to create groups that don't use the
+ * compact form directly (and don't use link messages).
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ * Tuesday, October 25, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+no_compact(hid_t fapl)
+{
+ hid_t fid = (-1); /* File ID */
+ hid_t gid = (-1); /* Group ID */
+ hid_t gid2 = (-1); /* Datatype ID */
+ hid_t gcpl = (-1); /* Group creation property list ID */
+ char objname[NAME_BUF_SIZE]; /* Object name */
+ char filename[NAME_BUF_SIZE];
+ off_t empty_size; /* Size of an empty file */
+ off_t file_size; /* Size of each file created */
+
+ TESTING("group without compact form");
+
+ /* Create file */
+ h5_fixname(FILENAME[1], fapl, filename, sizeof(filename));
+ if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(fid) < 0) TEST_ERROR;
+
+ /* Get size of file as empty */
+ if((empty_size = h5_get_file_size(filename)) == 0) TEST_ERROR;
+
+ /* Re-open file */
+ if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR;
+
+ /* Set up group creation property list */
+ if((gcpl = H5Pcreate(H5P_GROUP_CREATE)) < 0) TEST_ERROR;
+
+ /* Set GCPL parameters */
+ if(H5Pset_link_phase_change(gcpl, NO_COMPACT_MAX_COMPACT, NO_COMPACT_MIN_DENSE) < 0) TEST_ERROR;
+
+ /* Create group for testing lifecycle */
+ if((gid = H5Gcreate_expand(fid, NO_COMPACT_TOP_GROUP, gcpl, H5P_DEFAULT)) < 0) TEST_ERROR
+
+ /* Close GCPL */
+ if(H5Pclose(gcpl) < 0) TEST_ERROR;
+
+ /* Use internal testing routine to check that the group has no links or symbol table */
+ if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR;
+
+ /* Create first "bottom" group */
+ sprintf(objname, NO_COMPACT_BOTTOM_GROUP, (unsigned)0);
+ if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
+
+ /* Check on bottom group's status */
+ if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR;
+
+ /* Close bottom group */
+ if(H5Gclose(gid2) < 0) TEST_ERROR
+
+ /* Check on top group's status */
+ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR;
+ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR;
+ if(H5G_has_stab_test(gid) != TRUE) TEST_ERROR;
+
+ /* Unlink object from top group */
+ sprintf(objname, NO_COMPACT_BOTTOM_GROUP, (unsigned)0);
+ if(H5Gunlink(gid, objname) < 0) TEST_ERROR
+
+ /* Check on top group's status */
+ if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR;
+
+ /* Close top group */
+ if(H5Gclose(gid) < 0) TEST_ERROR;
+
+ /* Unlink top group */
+ if(H5Gunlink(fid, NO_COMPACT_TOP_GROUP) < 0) TEST_ERROR
+
+ /* Close file */
+ if(H5Fclose(fid) < 0) TEST_ERROR;
+
+ /* Get size of file as empty */
+ if((file_size = h5_get_file_size(filename)) == 0) TEST_ERROR;
+
+ /* Verify that file is correct size */
+ if(file_size != empty_size) TEST_ERROR;
+
+
+ PASSED();
+ return 0;
+
+error:
+ H5E_BEGIN_TRY {
+ H5Gclose(gcpl);
+ H5Gclose(gid2);
+ H5Gclose(gid);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ return 1;
+} /* end no_compact() */
+
+
+/*-------------------------------------------------------------------------
+ * Function: gcpl_on_root
+ *
+ * Purpose: Test setting group creation properties for root group.
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Quincey Koziol
+ * Tuesday, October 25, 2005
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+gcpl_on_root(hid_t fapl)
+{
+ hid_t fid = (-1); /* File ID */
+ hid_t gid = (-1); /* Group ID */
+ hid_t gid2 = (-1); /* Datatype ID */
+ hid_t fcpl = (-1); /* File creation property list ID */
+ hid_t gcpl = (-1); /* Group creation property list ID */
+ unsigned max_compact; /* Maximum # of links to store in group compactly */
+ unsigned min_dense; /* Minimum # of links to store in group "densely" */
+ char filename[NAME_BUF_SIZE];
+
+ TESTING("setting root group creation properties");
+
+ /* Create file */
+ h5_fixname(FILENAME[1], fapl, filename, sizeof(filename));
+
+ /* Set up file creation property list */
+ if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) TEST_ERROR;
+
+ /* Set GCPL parameters */
+ if(H5Pset_link_phase_change(fcpl, GCPL_ON_ROOT_MAX_COMPACT, GCPL_ON_ROOT_MIN_DENSE) < 0) TEST_ERROR;
+
+ /* Query the group creation properties from the FCPL */
+ if(H5Pget_link_phase_change(fcpl, &max_compact, &min_dense) < 0) TEST_ERROR;
+ if(max_compact != GCPL_ON_ROOT_MAX_COMPACT) TEST_ERROR;
+ if(min_dense != GCPL_ON_ROOT_MIN_DENSE) TEST_ERROR;
+
+ /* Create file with modified root group creation properties */
+ if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl)) < 0) TEST_ERROR;
+
+ /* Close FCPL */
+ if(H5Pclose(fcpl) < 0) TEST_ERROR;
+
+ /* Open the root group */
+ if((gid = H5Gopen(fid, "/")) < 0) TEST_ERROR;
+
+ /* Query the group creation properties */
+ if((gcpl = H5Gget_create_plist(gid)) < 0) TEST_ERROR;
+ if(H5Pget_link_phase_change(gcpl, &max_compact, &min_dense) < 0) TEST_ERROR;
+ if(max_compact != GCPL_ON_ROOT_MAX_COMPACT) TEST_ERROR;
+ if(min_dense != GCPL_ON_ROOT_MIN_DENSE) TEST_ERROR;
+
+ /* Close GCPL */
+ if(H5Pclose(gcpl) < 0) TEST_ERROR;
+
+ /* Create a group creation property list, with intermediate group creation set */
+ if((gcpl = H5Pcreate(H5P_GROUP_CREATE)) < 0) TEST_ERROR;
+ if(H5Pset_create_intermediate_group(gcpl, TRUE) < 0) TEST_ERROR
+
+ /* Create a group and intermediate groups, to check if root group settings are inherited */
+ if((gid2 = H5Gcreate_expand(gid, GCPL_ON_ROOT_BOTTOM_GROUP, gcpl, H5P_DEFAULT)) < 0) TEST_ERROR
+
+ /* Close GCPL */
+ if(H5Pclose(gcpl) < 0) TEST_ERROR;
+
+ /* Query the group creation properties */
+ if((gcpl = H5Gget_create_plist(gid2)) < 0) TEST_ERROR;
+ if(H5Pget_link_phase_change(gcpl, &max_compact, &min_dense) < 0) TEST_ERROR;
+ if(max_compact != H5G_CRT_GINFO_MAX_COMPACT) TEST_ERROR;
+ if(min_dense != H5G_CRT_GINFO_MIN_DENSE) TEST_ERROR;
+
+ /* Close GCPL */
+ if(H5Pclose(gcpl) < 0) TEST_ERROR;
+
+ /* Close bottom group */
+ if(H5Gclose(gid2) < 0) TEST_ERROR;
+
+ /* Open the middle group */
+ if((gid2 = H5Gopen(fid, GCPL_ON_ROOT_MIDDLE_GROUP)) < 0) TEST_ERROR;
+
+ /* Query the group creation properties */
+ if((gcpl = H5Gget_create_plist(gid2)) < 0) TEST_ERROR;
+ if(H5Pget_link_phase_change(gcpl, &max_compact, &min_dense) < 0) TEST_ERROR;
+ if(max_compact != GCPL_ON_ROOT_MAX_COMPACT) TEST_ERROR;
+ if(min_dense != GCPL_ON_ROOT_MIN_DENSE) TEST_ERROR;
+
+ /* Close GCPL */
+ if(H5Pclose(gcpl) < 0) TEST_ERROR;
+
+ /* Close bottom group */
+ if(H5Gclose(gid2) < 0) TEST_ERROR;
+
+ /* Close root group */
+ if(H5Gclose(gid) < 0) TEST_ERROR;
+
+ /* Close file */
+ if(H5Fclose(fid) < 0) TEST_ERROR;
+
+
+ PASSED();
+ return 0;
+
+error:
+ H5E_BEGIN_TRY {
+ H5Gclose(gcpl);
+ H5Gclose(gid2);
+ H5Gclose(gid);
+ H5Gclose(fcpl);
+ H5Fclose(fid);
+ } H5E_END_TRY;
+ return 1;
+} /* end gcpl_on_root() */
+
+
+/*-------------------------------------------------------------------------
* Function: main
*
* Purpose: Test groups
@@ -258,6 +969,11 @@ main(void)
nerrors += test_misc(file);
nerrors += test_long(file);
nerrors += test_large(file);
+ nerrors += lifecycle(fapl);
+ nerrors += long_compact(fapl);
+ nerrors += read_old(fapl);
+ nerrors += no_compact(fapl);
+ nerrors += gcpl_on_root(fapl);
if (nerrors) goto error;
/* Cleanup */