summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/.distdep37
-rw-r--r--test/Makefile.in15
-rw-r--r--test/gheap.c398
3 files changed, 440 insertions, 10 deletions
diff --git a/test/.distdep b/test/.distdep
index 03ec460..895c967 100644
--- a/test/.distdep
+++ b/test/.distdep
@@ -66,9 +66,12 @@ tohdr.o: \
../src/H5Bpublic.h \
../src/H5Oprivate.h \
../src/H5Opublic.h \
+ ../src/H5HGprivate.h \
+ ../src/H5HGpublic.h \
../src/H5Tprivate.h \
../src/H5Tpublic.h \
- ../src/H5Sprivate.h
+ ../src/H5Sprivate.h \
+ ../src/H5Spublic.h
tstab.o: \
tstab.c \
testhdf5.h \
@@ -92,9 +95,12 @@ tstab.o: \
../src/H5Bpublic.h \
../src/H5Oprivate.h \
../src/H5Opublic.h \
+ ../src/H5HGprivate.h \
+ ../src/H5HGpublic.h \
../src/H5Tprivate.h \
../src/H5Tpublic.h \
- ../src/H5Sprivate.h
+ ../src/H5Sprivate.h \
+ ../src/H5Spublic.h
th5s.o: \
th5s.c \
testhdf5.h \
@@ -114,10 +120,10 @@ th5s.o: \
../src/H5Gpublic.h \
../src/H5Oprivate.h \
../src/H5Opublic.h \
+ ../src/H5HGprivate.h \
+ ../src/H5HGpublic.h \
../src/H5Tprivate.h \
- ../src/H5Tpublic.h \
- ../src/H5Pprivate.h \
- ../src/H5Ppublic.h
+ ../src/H5Tpublic.h
dtypes.o: \
dtypes.c \
../src/hdf5.h \
@@ -169,8 +175,11 @@ istore.o: \
../src/H5MMpublic.h \
../src/H5Oprivate.h \
../src/H5Opublic.h \
+ ../src/H5HGprivate.h \
+ ../src/H5HGpublic.h \
../src/H5Tprivate.h \
- ../src/H5Tpublic.h
+ ../src/H5Tpublic.h \
+ ../src/H5Sprivate.h
dsets.o: \
dsets.c \
../src/hdf5.h \
@@ -262,3 +271,19 @@ iopipe.o: \
../src/H5Ppublic.h \
../src/H5Spublic.h \
../src/H5Tpublic.h
+gheap.o: \
+ gheap.c \
+ ../src/H5private.h \
+ ../src/H5public.h \
+ ../src/H5config.h \
+ ../src/H5Eprivate.h \
+ ../src/H5Epublic.h \
+ ../src/H5Ipublic.h \
+ ../src/H5Fprivate.h \
+ ../src/H5Fpublic.h \
+ ../src/H5Gprivate.h \
+ ../src/H5Gpublic.h \
+ ../src/H5Bprivate.h \
+ ../src/H5Bpublic.h \
+ ../src/H5HGprivate.h \
+ ../src/H5HGpublic.h
diff --git a/test/Makefile.in b/test/Makefile.in
index f4d9009..7017e9d 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -11,9 +11,9 @@ CPPFLAGS=-I. -I../src @CPPFLAGS@
# These are our main targets. They should be listed in the order to be
# executed, generally most specific tests to least specific tests.
-PROGS=testhdf5 hyperslab istore dtypes dsets cmpd_dset extend external \
+PROGS=testhdf5 gheap hyperslab istore dtypes dsets cmpd_dset extend external \
iopipe
-TESTS=testhdf5 hyperslab istore dtypes dsets cmpd_dset extend external
+TESTS=testhdf5 gheap hyperslab istore dtypes dsets cmpd_dset extend external
TIMINGS=iopipe
# Temporary files
@@ -21,7 +21,8 @@ MOSTLYCLEAN=cmpd_dset.h5 dataset.h5 extend.h5 istore.h5 tfile1.h5 tfile2.h5 \
tfile3.h5 th5s1.h5 theap.h5 tohdr.h5 tstab1.h5 tstab2.h5 \
extern_1.h5 extern_2.h5 extern_3.h5 extern_1.raw extern_1b.raw \
extern_2.raw extern_2b.raw extern_3.raw extern_3b.raw \
- extern_4.raw extern_4b.raw iopipe.raw iopipe.h5
+ extern_4.raw extern_4b.raw iopipe.raw iopipe.h5 gheap0.h5 \
+ gheap1.h5 gheap2.h5 gheap3.h5 gheap4.h5
# Source and object files for programs... The PROG_SRC list contains all the
# source files and is used for things like dependencies, archiving, etc. The
@@ -29,12 +30,15 @@ MOSTLYCLEAN=cmpd_dset.h5 dataset.h5 extend.h5 istore.h5 tfile1.h5 tfile2.h5 \
# overlap with other tests.
PROG_SRC=testhdf5.c tfile.c theap.c tmeta.c tohdr.c tstab.c th5s.c dtypes.c \
hyperslab.c istore.c dsets.c cmpd_dset.c extend.c external.c \
- iopipe.c
+ iopipe.c gheap.c
PROG_OBJ=$(PROG_SRC:.c=.o)
TESTHDF5_SRC=testhdf5.c tfile.c theap.c tmeta.c tohdr.c tstab.c th5s.c
TESTHDF5_OBJ=$(TESTHDF5_SRC:.c=.o)
+GHEAP_SRC=gheap.c
+GHEAP_OBJ=$(GHEAP_SRC:.c=.o)
+
DSETS_SRC=dsets.c
DSETS_OBJ=$(DSETS_SRC:.c=.o)
@@ -79,6 +83,9 @@ timings _timings: $(TIMINGS)
testhdf5: $(TESTHDF5_OBJ) ../src/libhdf5.a
$(CC) $(CFLAGS) -o $@ $(TESTHDF5_OBJ) ../src/libhdf5.a $(LIBS)
+gheap: $(GHEAP_OBJ) ../src/libhdf5.a
+ $(CC) $(CFLAGS) -o $@ $(GHEAP_OBJ) ../src/libhdf5.a $(LIBS)
+
dsets: $(DSETS_OBJ) ../src/libhdf5.a
$(CC) $(CFLAGS) -o $@ $(DSETS_OBJ) ../src/libhdf5.a $(LIBS)
diff --git a/test/gheap.c b/test/gheap.c
new file mode 100644
index 0000000..4183a84
--- /dev/null
+++ b/test/gheap.c
@@ -0,0 +1,398 @@
+/*
+ * Copyright (C) 1998 NCSA
+ * All rights reserved.
+ *
+ * Programmer: Robb Matzke <matzke@llnl.gov>
+ * Tuesday, March 31, 1998
+ *
+ * Purpose: Tests the global heap. The global heap is the set of all
+ * collections but the collections are not related to one
+ * another by anything that appears in the file format.
+ */
+#include <H5private.h>
+#include <H5Eprivate.h>
+#include <H5Fprivate.h>
+#include <H5Gprivate.h>
+#include <H5HGprivate.h>
+#include <H5Pprivate.h>
+
+#ifndef HAVE_FUNCTION
+# undef __FUNCTION__
+# define __FUNCTION__ ""
+#endif
+
+#define FAILED(S) { \
+ puts ("*FAILED*"); \
+ printf (" Failed at %s:%d in %s()%s%s\n", \
+ __FILE__, __LINE__, __FUNCTION__, \
+ (S)&&*(S)?": ":"", (S)?(S):""); \
+ H5Eprint (stdout); \
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: emit_diagnostics
+ *
+ * Purpose: If debugging is turned on then this function will cause the
+ * library to emit it's diagnostic messages now instead of when
+ * we're trying to make the output look nice.
+ *
+ * Return: void
+ *
+ * Programmer: Robb Matzke
+ * Tuesday, March 31, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static void
+emit_diagnostics (void)
+{
+ H5F_t *f = H5F_open ("gheap0.h5", H5F_ACC_CREAT|H5F_ACC_RDWR|H5F_ACC_TRUNC,
+ NULL, NULL);
+ H5G_t *g = H5G_create (f->shared->root_grp, "emit", 0);
+ H5G_close (g);
+ H5F_close (f);
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_1
+ *
+ * Purpose: Writes a sequence of objects to the global heap where each
+ * object is larger than the one before.
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Robb Matzke
+ * Tuesday, March 31, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_1 (void)
+{
+ H5F_t *f;
+ H5HG_t obj[1024];
+ uint8 out[1024];
+ uint8 in[1024];
+ int i;
+ size_t size;
+ herr_t status;
+ int retval = 0;
+
+ printf ("%-70s", "...monotonically increasing lengths");
+ fflush (stdout);
+
+ /* Open a clean file */
+ H5Eclear ();
+ f = H5F_open ("gheap1.h5", H5F_ACC_CREAT|H5F_ACC_RDWR|H5F_ACC_TRUNC,
+ NULL, NULL);
+ if (!f) {
+ FAILED ("unable to create file");
+ return -1;
+ }
+
+ /*
+ * Write the objects, monotonically increasing in length. Since this is
+ * a clean file, the addresses allocated for the collections should also
+ * be monotonically increasing.
+ */
+ for (i=0; i<1024; i++) {
+ size = i+1;
+ memset (out, 'A'+i%26, size);
+ H5Eclear ();
+ status = H5HG_insert (f, size, out, obj+i);
+ if (status<0) {
+ FAILED ("unable to insert object into global heap");
+ --retval;
+ } else if (i && H5F_addr_gt (&(obj[i-1].addr), &(obj[i].addr))) {
+ FAILED ("collection addresses are not monotonically increasing");
+ --retval;
+ }
+ }
+
+ /*
+ * Now try to read each object back.
+ */
+ for (i=0; i<1024; i++) {
+ size = i+1;
+ memset (out, 'A'+i%26, size);
+ H5Eclear ();
+ if (NULL==H5HG_read (f, obj+i, in)) {
+ FAILED ("unable to read object");
+ --retval;
+ } else if (memcmp (in, out, size)) {
+ FAILED ("value read doesn't match value written");
+ --retval;
+ }
+ }
+
+ H5F_close (f);
+ puts (" PASSED");
+ return retval;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_2
+ *
+ * Purpose: Writes a sequence of objects to the global heap where each
+ * object is smaller than the one before.
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Robb Matzke
+ * Tuesday, March 31, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_2 (void)
+{
+ H5F_t *f;
+ H5HG_t obj[1024];
+ uint8 out[1024];
+ uint8 in[1024];
+ int i;
+ size_t size;
+ herr_t status;
+ int retval = 0;
+
+ printf ("%-70s", "...monotonically decreasing lengths");
+ fflush (stdout);
+
+ /* Open a clean file */
+ H5Eclear ();
+ f = H5F_open ("gheap2.h5", H5F_ACC_CREAT|H5F_ACC_RDWR|H5F_ACC_TRUNC,
+ NULL, NULL);
+ if (!f) {
+ FAILED ("unable to create file");
+ return -1;
+ }
+
+ /*
+ * Write the objects, monotonically decreasing in length.
+ */
+ for (i=0; i<1024; i++) {
+ size = 1024-i;
+ memset (out, 'A'+i%26, size);
+ H5Eclear ();
+ status = H5HG_insert (f, size, out, obj+i);
+ if (status<0) {
+ FAILED ("unable to insert object into global heap");
+ --retval;
+ }
+ }
+
+ /*
+ * Now try to read each object back.
+ */
+ for (i=0; i<1024; i++) {
+ size = 1024-i;
+ memset (out, 'A'+i%26, size);
+ H5Eclear ();
+ if (NULL==H5HG_read (f, obj+i, in)) {
+ FAILED ("unable to read object");
+ --retval;
+ } else if (memcmp (in, out, size)) {
+ FAILED ("value read doesn't match value written");
+ --retval;
+ }
+ }
+
+ H5F_close (f);
+ puts (" PASSED");
+ return retval;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_3
+ *
+ * Purpose: Creates a few global heap objects and then removes them all.
+ * The collection should also be removed.
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Robb Matzke
+ * Tuesday, March 31, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_3 (void)
+{
+ H5F_t *f;
+ H5HG_t obj[1024];
+ uint8 out[1024];
+ int i;
+ size_t size;
+ herr_t status;
+ int retval = 0;
+
+ printf ("%-70s", "...complete object removal");
+ fflush (stdout);
+
+ /* Open a clean file */
+ H5Eclear ();
+ f = H5F_open ("gheap3.h5", H5F_ACC_CREAT|H5F_ACC_RDWR|H5F_ACC_TRUNC,
+ NULL, NULL);
+ if (!f) {
+ FAILED ("unable to create file");
+ return -1;
+ }
+
+ /* Create some stuff */
+ for (i=0; i<1024; i++) {
+ size = i%30+100;
+ memset (out, 'A'+i%26, size);
+ H5Eclear ();
+ status = H5HG_insert (f, size, out, obj+i);
+ if (status<0) {
+ FAILED ("unable to insert object into global heap");
+ --retval;
+ }
+ }
+
+ /* Remove everything */
+ for (i=0; i<1024; i++) {
+ status = H5HG_remove (f, obj+i);
+ if (status<0) {
+ FAILED ("unable to remove object");
+ --retval;
+ }
+ }
+
+ H5F_close (f);
+ puts (" PASSED");
+ return retval;
+}
+
+
+/*-------------------------------------------------------------------------
+ * Function: test_4
+ *
+ * Purpose: Tests the H5HG_remove() feature by writing lots of objects
+ * and occassionally removing some. When we're done they're all
+ * removed.
+ *
+ * Return: Success: 0
+ *
+ * Failure: -1
+ *
+ * Programmer: Robb Matzke
+ * Tuesday, March 31, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+static int
+test_4 (void)
+{
+ H5F_t *f;
+ H5HG_t obj[1024];
+ uint8 out[1024];
+ int i;
+ size_t size;
+ herr_t status;
+ int retval = 0;
+
+ printf ("%-70s", "...partial object removal");
+ fflush (stdout);
+
+ /* Open a clean file */
+ H5Eclear ();
+ f = H5F_open ("gheap4.h5", H5F_ACC_CREAT|H5F_ACC_RDWR|H5F_ACC_TRUNC,
+ NULL, NULL);
+ if (!f) {
+ FAILED ("unable to create file");
+ return -1;
+ }
+
+
+ for (i=0; i<1024; i++) {
+ /* Insert */
+ size = i%30+100;
+ memset (out, 'A'+i%26, size);
+ H5Eclear ();
+ status = H5HG_insert (f, size, out, obj+i);
+ if (status<0) {
+ FAILED ("unable to insert object into global heap");
+ --retval;
+ }
+
+ /*
+ * Remove every third one beginning with the second, but after the
+ * next one has already been inserted. That is, insert A, B, C;
+ * remove B, insert D, E, F; remove E; etc.
+ */
+ if (1==i%3) {
+ H5Eclear ();
+ status = H5HG_remove (f, obj+i-1);
+ if (status<0) {
+ FAILED ("unable to remove object");
+ --retval;
+ }
+ memset (obj+i-1, 0, sizeof *obj);
+ }
+ }
+
+ H5F_close (f);
+ puts (" PASSED");
+ return retval;
+}
+
+
+
+/*-------------------------------------------------------------------------
+ * Function: main
+ *
+ * Purpose: Tests global heap.
+ *
+ * Return: Success: zero
+ *
+ * Failure: non-zero
+ *
+ * Programmer: Robb Matzke
+ * Tuesday, March 31, 1998
+ *
+ * Modifications:
+ *
+ *-------------------------------------------------------------------------
+ */
+int
+main (void)
+{
+ int nfailed=0;
+
+ emit_diagnostics ();
+
+
+ nfailed += test_1()<0 ? 1 : 0;
+ nfailed += test_2()<0 ? 1 : 0;
+ nfailed += test_3()<0 ? 1 : 0;
+ nfailed += test_4()<0 ? 1 : 0;
+
+ if (nfailed) {
+ printf ("*** %d global heap test%s failed ***\n",
+ nfailed, 1==nfailed?"":"s");
+ } else {
+ printf ("All global heap tests passed.\n");
+ }
+ return nfailed?-1:0;
+}