diff options
-rw-r--r-- | test/testhdf5.c | 23 | ||||
-rw-r--r-- | test/testhdf5.h | 2 | ||||
-rw-r--r-- | test/tfile.c | 6 | ||||
-rw-r--r-- | test/theap.c | 4 | ||||
-rw-r--r-- | test/tmeta.c | 2 | ||||
-rw-r--r-- | test/tohdr.c | 28 | ||||
-rw-r--r-- | test/tstab.c | 229 |
7 files changed, 248 insertions, 46 deletions
diff --git a/test/testhdf5.c b/test/testhdf5.c index bee3bfb..21dd790 100644 --- a/test/testhdf5.c +++ b/test/testhdf5.c @@ -250,28 +250,22 @@ int main(int argc, char *argv[]) { if (Test[Loop].SkipFlag) { - MESSAGE(2, print_func("Skipping -- %s \n", Test[Loop].Description); - ); + MESSAGE(2, ("Skipping -- %s \n", Test[Loop].Description)); } else { - MESSAGE(2, print_func("Testing -- %s (%s) \n", Test[Loop].Description, - Test[Loop].Name); - ); - MESSAGE(5, print_func("===============================================\n"); - ); + MESSAGE(2, ("Testing -- %s (%s) \n", Test[Loop].Description, + Test[Loop].Name)); + MESSAGE(5, ("===============================================\n")); Test[Loop].NumErrors = num_errs; (*Test[Loop].Call) (); Test[Loop].NumErrors = num_errs - Test[Loop].NumErrors; - MESSAGE(5, print_func("===============================================\n"); - ); - MESSAGE(5, print_func("There were %d errors detected.\n\n", (int) Test[Loop].NumErrors); - ); + MESSAGE(5, ("===============================================\n")); + MESSAGE(5, ("There were %d errors detected.\n\n", (int) Test[Loop].NumErrors)); } /* end else */ } /* end for */ - MESSAGE(2, print_func("\n\n"); - ) + MESSAGE(2, ("\n\n")) if (num_errs) print_func("!!! %d Error(s) were detected !!!\n\n", (int) num_errs); else @@ -296,8 +290,7 @@ int main(int argc, char *argv[]) if (CleanUp) { - MESSAGE(2, print_func("\nCleaning Up...\n\n"); - ); + MESSAGE(2, ("\nCleaning Up...\n\n")); #if !(defined DOS386 | defined WIN386) system("rm -f *.hdf *.tmp"); #else /* OLD_WAY */ diff --git a/test/testhdf5.h b/test/testhdf5.h index 2a9af68..fb67428 100644 --- a/test/testhdf5.h +++ b/test/testhdf5.h @@ -74,7 +74,7 @@ if(ret == FAIL) {print_func("*** UNEXPECTED RETURN from %s is %ld at line %4d in } while(0) /* Used to document process through a test */ -#define MESSAGE(v,a) {if (Verbosity>v) {a}} +#define MESSAGE(V,A) {if (Verbosity>(V)) print_func A;} /* definitions for command strings */ #define VERBOSITY_STR "Verbosity" diff --git a/test/tfile.c b/test/tfile.c index e83424e..7fd1a3d 100644 --- a/test/tfile.c +++ b/test/tfile.c @@ -68,7 +68,7 @@ static void test_file_create(void) herr_t ret; /* Generic return value */ /* Output message about test being performed */ - MESSAGE(5, print_func("Testing Low-Level File Creation I/O\n");); + MESSAGE(5, ("Testing Low-Level File Creation I/O\n")); /* Create first file */ fid1=H5Fcreate(FILE1,H5ACC_OVERWRITE,0,0); @@ -247,7 +247,7 @@ static void test_file_open(void) herr_t ret; /* Generic return value */ /* Output message about test being performed */ - MESSAGE(5, print_func("Testing Low-Level File Opening I/O\n");); + MESSAGE(5, ("Testing Low-Level File Opening I/O\n")); /* Open second file */ fid1=H5Fopen(FILE2,H5ACC_WRITE,0); @@ -296,7 +296,7 @@ static void test_file_open(void) void test_file(void) { /* Output message about test being performed */ - MESSAGE(5, print_func("Testing Low-Level File I/O\n");); + MESSAGE(5, ("Testing Low-Level File I/O\n")); test_file_create(); /* Test file creation (also creation templates) */ test_file_open(); /* Test file opening */ diff --git a/test/theap.c b/test/theap.c index 5237e4c..7f9b642 100644 --- a/test/theap.c +++ b/test/theap.c @@ -50,7 +50,7 @@ test_heap (void) const char *s; off_t obj[NOBJS]; - MESSAGE (5, print_func("Testing Heaps\n");); + MESSAGE (5, ("Testing Heaps\n")); /* Create the file */ fid = H5Fcreate ("theap.h5", H5ACC_OVERWRITE, 0, 0); @@ -78,7 +78,7 @@ test_heap (void) /* Read the objects back out */ for (i=0; i<NOBJS; i++) { s = H5H_peek (f, heap, obj[i]); - MESSAGE (8, print_func ("object is `%s'\n", s);); + MESSAGE (8, ("object is `%s'\n", s)); } /* Close the file */ diff --git a/test/tmeta.c b/test/tmeta.c index 567ab96..64f6b75 100644 --- a/test/tmeta.c +++ b/test/tmeta.c @@ -67,7 +67,7 @@ void test_metadata(void) uint8 *p; /* pointer into the buffer being en/de-coded */ /* Output message about test being performed */ - MESSAGE(5, print_func("Testing Metadata encode/decode code\n");); + MESSAGE(5, ("Testing Metadata encode/decode code\n")); /* Start by encoding the values above */ p=encode_buffer; diff --git a/test/tohdr.c b/test/tohdr.c index c1ecb0e..5e192e9 100644 --- a/test/tohdr.c +++ b/test/tohdr.c @@ -51,7 +51,7 @@ test_ohdr (void) hbool_t ent_mod; int i; - MESSAGE (5, print_func("Testing Object Headers\n");); + MESSAGE (5, ("Testing Object Headers\n")); /* create the file */ fid = H5Fcreate ("tohdr.h5", H5ACC_OVERWRITE, 0, 0); @@ -60,17 +60,17 @@ test_ohdr (void) CHECK (f, NULL, "H5Aatom_object"); /* the new object header */ - MESSAGE (8, print_func("Creating new object header...\n");); + MESSAGE (8, ("Creating new object header...\n")); oh = H5O_new (f, 1, 64); /* * Test creation of a new message. */ - MESSAGE (8, print_func("Creating new message...\n");); + MESSAGE (8, ("Creating new message...\n")); stab.btree = 11111111; stab.heap = 22222222; status = H5O_modify (f, oh, NULL, NULL, H5O_STAB, H5O_NEW_MESG, &stab); - CHECK (status, FAIL, "H5O_modify"); + VERIFY (status, 0, "H5O_modify"); H5AC_flush (f, NULL, 0, TRUE); ptr = H5O_read (f, oh, NULL, H5O_STAB, 0, &ro); @@ -82,11 +82,11 @@ test_ohdr (void) /* * Test modification of an existing message. */ - MESSAGE (8, print_func("Modifying message...\n");); + MESSAGE (8, ("Modifying message...\n")); stab.btree = 33333333; stab.heap = 44444444; status = H5O_modify (f, oh, NULL, NULL, H5O_STAB, 0, &stab); - CHECK (status, FAIL, "H5O_modify"); + VERIFY (status, 0, "H5O_modify"); H5AC_flush (f, NULL, 0, TRUE); ptr = H5O_read (f, oh, NULL, H5O_STAB, 0, &ro); @@ -99,13 +99,13 @@ test_ohdr (void) * Test creation of a second message of the same type with a symbol * table. */ - MESSAGE (8, print_func("Creating a duplicate message...\n");); + MESSAGE (8, ("Creating a duplicate message...\n")); ent.header = 0; ent.type = H5G_NOTHING_CACHED; stab.btree = 55555555; stab.heap = 66666666; status = H5O_modify (f, oh, &ent, &ent_mod, H5O_STAB, H5O_NEW_MESG, &stab); - CHECK (status, FAIL, "H5O_modify"); + VERIFY (status, 1, "H5O_modify"); VERIFY (ent_mod, TRUE, "H5O_modify"); VERIFY (ent.type, H5G_CACHED_STAB, "H5O_modify"); VERIFY (ent.cache.stab.heap, stab.heap, "H5O_modify"); @@ -121,11 +121,11 @@ test_ohdr (void) /* * Test modification of the second message with a symbol table. */ - MESSAGE (8, print_func("Modifying the duplicate message...\n");); + MESSAGE (8, ("Modifying the duplicate message...\n")); stab.btree = 77777777; stab.heap = 88888888; status = H5O_modify (f, oh, &ent, &ent_mod, H5O_STAB, 1, &stab); - CHECK (status, FAIL, "H5O_modify"); + VERIFY (status, 1, "H5O_modify"); VERIFY (ent_mod, TRUE, "H5O_modify"); VERIFY (ent.type, H5G_CACHED_STAB, "H5O_modify"); VERIFY (ent.cache.stab.heap, stab.heap, "H5O_modify"); @@ -142,12 +142,12 @@ test_ohdr (void) * Test creation of a bunch of messages one after another to see * what happens when the object header overflows in core. */ - MESSAGE (8, print_func("Overflowing header in core...\n");); + MESSAGE (8, ("Overflowing header in core...\n")); for (i=0; i<40; i++) { stab.btree = (i+1)*1000 + 1; stab.heap = (i+1)*1000 + 2; status = H5O_modify (f, oh, NULL, NULL, H5O_STAB, H5O_NEW_MESG, &stab); - CHECK (status, FAIL, "H5O_modify"); + VERIFY (status, 2+i, "H5O_modify"); } H5AC_flush (f, NULL, 0, TRUE); @@ -155,12 +155,12 @@ test_ohdr (void) * Test creation of a bunch of messages one after another to see * what happens when the object header overflows on disk. */ - MESSAGE (8, print_func("Overflowing header on disk...\n");); + MESSAGE (8, ("Overflowing header on disk...\n")); for (i=0; i<10; i++) { stab.btree = (i+1)*1000 + 10; stab.heap = (i+1)*1000 + 20; status = H5O_modify (f, oh, NULL, NULL, H5O_STAB, H5O_NEW_MESG, &stab); - CHECK (status, FAIL, "H5O_modify"); + VERIFY (status, 42+i, "H5O_modify"); H5AC_flush (f, NULL, 0, TRUE); } diff --git a/test/tstab.c b/test/tstab.c index 329b762..47beae7 100644 --- a/test/tstab.c +++ b/test/tstab.c @@ -24,22 +24,207 @@ /*------------------------------------------------------------------------- - * Function: test_stab + * Function: test_1 * - * Purpose: Test symbol tables + * Purpose: Tests the non-directory features of the HDF5 file. If the + * file has just one non-directory object, then that object + * should be the root object and there is no directory. * * Return: void * * Programmer: Robb Matzke - * matzke@viper.llnl.gov - * Aug 7 1997 + * robb@maya.nuance.com + * Aug 29 1997 * * Modifications: * *------------------------------------------------------------------------- */ -void -test_stab (void) +static void +test_1 (void) +{ + hatom_t fid; + hdf5_file_t *f; + H5G_entry_t ent, ent2, dir_ent; + herr_t status; + H5O_name_t name_mesg; + void *status_ptr; + + MESSAGE (2, ("........non-directory files\n")); + + /* + * Test 1A: Create an empty file and add a non-directory object + * to the file with the name `/'. The object should become the + * root object and should not have a name message. + */ + + /* create the file */ + fid = H5Fcreate ("tstab1.h5", H5ACC_OVERWRITE, 0, 0); + CHECK (fid, FAIL, "H5Fcreate"); + f = H5Aatom_object (fid); + CHECK (f, NULL, "H5Aatom_object"); + + /* create the object */ + ent.header = H5O_new (f, 0, 64); + CHECK_I (ent.header, "H5O_new"); + ent.type = H5G_NOTHING_CACHED; + + /* give the object a name */ + status = H5G_insert (f, f->root_sym, &dir_ent, "/", &ent); + CHECK_I (status, "H5G_insert"); + + /* is it really the root symbol? */ + VERIFY (dir_ent.header, 0, "H5G_insert"); + VERIFY (ent.header, f->root_sym->header, "H5G_insert"); + + /* look for a name message -- it shouldn't be present */ + status_ptr = H5O_read (f, ent.header, &ent, H5O_NAME, 0, &name_mesg); + VERIFY (status_ptr, NULL, "H5O_read [didn't fail but should have]"); + + + + /* + * Test 1B: Attempt to read the root object using the name `/'. + */ + + HDmemset (&dir_ent, 0, sizeof(H5G_entry_t)); + HDmemset (&ent2, 0, sizeof(H5G_entry_t)); + status = H5G_find (f, NULL, &dir_ent, "/", &ent2); + CHECK_I (status, "H5G_find"); + VERIFY (dir_ent.header, 0, "H5G_find"); + VERIFY (ent2.header, ent.header, "H5G_find"); + + + + /* + * Test 1C: Add a second object to the file to see if the first object + * gets moved into the new root directory along with the second object. + */ + + /* create the object */ + ent2.header = H5O_new (f, 0, 64); + CHECK_I (ent2.header, "H5O_new"); + ent2.type = H5G_NOTHING_CACHED; + + /* give the object a name */ + status = H5G_insert (f, f->root_sym, &dir_ent, "/second", &ent2); + CHECK_I (status, "H5G_insert"); + CHECK (dir_ent.header, 0, "H5G_insert"); + + /* try to read the first object */ + HDmemset (&ent2, 0, sizeof(H5G_entry_t)); + status = H5G_find (f, NULL, NULL, "/Root Object", &ent2); + CHECK_I (status, "H5G_find"); + VERIFY (ent2.header, ent.header, "H5G_find"); + + /* close the file */ + H5Fclose (fid); + + + + /* + * Test 1D: Create an empty file and add a non-directory object + * to the file with the name `/foo'. The object should become the + * root object and should have a name message with the value `foo'. + */ + + /* create the file */ + fid = H5Fcreate ("tstab1.h5", H5ACC_OVERWRITE, 0, 0); + CHECK (fid, FAIL, "H5Fcreate"); + f = H5Aatom_object (fid); + CHECK (f, NULL, "H5Aatom_object"); + + /* create the object */ + ent.header = H5O_new (f, 0, 64); + CHECK_I (ent.header, "H5O_new"); + ent.type = H5G_NOTHING_CACHED; + + /* give the object a name */ + status = H5G_insert (f, f->root_sym, &dir_ent, "/foo", &ent); + CHECK_I (status, "H5G_insert"); + + /* is it really the root symbol? */ + VERIFY (dir_ent.header, 0, "H5G_insert"); + VERIFY (ent.header, f->root_sym->header, "H5G_insert"); + + /* does it have the correct name message? */ + status_ptr = H5O_read (f, ent.header, &ent, H5O_NAME, 0, &name_mesg); + CHECK_PTR (status_ptr, "H5O_read"); + CHECK_PTR (name_mesg.s, "H5O_read"); + VERIFY (strcmp(name_mesg.s, "foo"), 0, "H5O_read"); + + + + /* + * Test 1E: Try to read the root object with the name `/' and `/foo' + */ + + HDmemset (&dir_ent, 0, sizeof(H5G_entry_t)); + HDmemset (&ent2, 0, sizeof(H5G_entry_t)); + status = H5G_find (f, NULL, &dir_ent, "/", &ent2); + CHECK_I (status, "H5G_find"); + VERIFY (dir_ent.header, 0, "H5G_find"); + VERIFY (ent2.header, ent.header, "H5G_find"); + + HDmemset (&dir_ent, 0, sizeof(H5G_entry_t)); + HDmemset (&ent2, 0, sizeof(H5G_entry_t)); + status = H5G_find (f, NULL, &dir_ent, "/foo", &ent2); + CHECK_I (status, "H5G_find"); + VERIFY (dir_ent.header, 0, "H5G_find"); + VERIFY (ent2.header, ent.header, "H5G_find"); + + + + /* + * Test 1F: Create another object. This should create a root directory + * and move the previous root object into that directory. + */ + + /* create the object */ + ent2.header = H5O_new (f, 0, 64); + CHECK_I (ent2.header, "H5O_new"); + ent2.type = H5G_NOTHING_CACHED; + + /* give the object a name */ + status = H5G_insert (f, f->root_sym, &dir_ent, "/second", &ent2); + CHECK_I (status, "H5G_insert"); + CHECK (dir_ent.header, 0, "H5G_insert"); + + /* try to read the first object */ + HDmemset (&ent2, 0, sizeof(H5G_entry_t)); + status = H5G_find (f, NULL, NULL, "/foo", &ent2); + CHECK_I (status, "H5G_find"); + VERIFY (ent2.header, ent.header, "H5G_find"); + +#if 0 /* H5O_remove() is not implemented yet */ + /* the first object should not have a name message */ + status_ptr = H5O_read (f, ent.header, &ent, H5O_NAME, 0, &name_mesg); + VERIFY (status_ptr, NULL, "H5O_read [didn't fail but should have]"); +#endif + + /* close the file */ + H5Fclose (fid); + +} + + +/*------------------------------------------------------------------------- + * Function: test_2 + * + * Purpose: Creates a really large directory. + * + * Return: void + * + * Programmer: Robb Matzke + * robb@maya.nuance.com + * Aug 29 1997 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static void +test_2 (void) { hatom_t fid; hdf5_file_t *f; @@ -50,10 +235,10 @@ test_stab (void) herr_t status; int nsyms = 5000; - MESSAGE (5, print_func("Testing Symbol Tables\n");); + MESSAGE (2, ("........large directories\n")); /* create the file */ - fid = H5Fcreate ("tstab.h5", H5ACC_OVERWRITE, 0, 0); + fid = H5Fcreate ("tstab2.h5", H5ACC_OVERWRITE, 0, 0); CHECK (fid, FAIL, "H5Fcreate"); f = H5Aatom_object (fid); CHECK (f, NULL, "H5Aatom_object"); @@ -66,12 +251,12 @@ test_stab (void) CHECK_I (status, "H5G_new"); addr = H5G_stab_new (f, &sub, 0); CHECK_I (addr, "H5G_stab_new"); - MESSAGE (8, print_func ("Address %lu\n", (unsigned long)addr);); + MESSAGE (8, ("Address %lu\n", (unsigned long)addr)); for (i=0; i<nsyms; i++) { sprintf (name, "%05d%05d", rand()%100000, i); - MESSAGE (8, print_func ("%s\n", name);); + MESSAGE (8, ("%s\n", name)); #if 1 status = H5G_insert (f, &cwd, NULL, name, &sub); CHECK_I (status, "H5G_insert"); @@ -86,4 +271,28 @@ test_stab (void) /* close the file */ H5Fclose (fid); +} + + + +/*------------------------------------------------------------------------- + * Function: test_stab + * + * Purpose: Test symbol tables + * + * Return: void + * + * Programmer: Robb Matzke + * matzke@viper.llnl.gov + * Aug 7 1997 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +void +test_stab (void) +{ + test_1(); + test_2(); } |