diff options
Diffstat (limited to 'test/gheap.c')
-rw-r--r-- | test/gheap.c | 398 |
1 files changed, 398 insertions, 0 deletions
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; +} |