diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/.distdep | 37 | ||||
-rw-r--r-- | test/Makefile.in | 15 | ||||
-rw-r--r-- | test/gheap.c | 398 |
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; +} |