2003-04-01 01:59:04 +08:00
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
2007-02-07 22:56:24 +08:00
|
|
|
|
* Copyright by The HDF Group. *
|
2003-04-01 01:59:04 +08:00
|
|
|
|
* Copyright by the Board of Trustees of the University of Illinois. *
|
|
|
|
|
* All rights reserved. *
|
|
|
|
|
* *
|
|
|
|
|
* This file is part of HDF5. The full HDF5 copyright notice, including *
|
|
|
|
|
* terms governing use, modification, and redistribution, is contained in *
|
|
|
|
|
* the files COPYING and Copyright.html. COPYING can be found at the root *
|
|
|
|
|
* of the source code distribution tree; Copyright.html can be found at the *
|
|
|
|
|
* root level of an installed copy of the electronic HDF5 document set and *
|
|
|
|
|
* is linked from the top-level documents page. It can also be found at *
|
2007-02-07 22:56:24 +08:00
|
|
|
|
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
|
|
|
|
|
* access to either file, you may request a copy from help@hdfgroup.org. *
|
2003-04-01 01:59:04 +08:00
|
|
|
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
|
|
1998-11-25 22:58:22 +08:00
|
|
|
|
/*
|
|
|
|
|
* Programmer: Robb Matzke <matzke@llnl.gov>
|
|
|
|
|
* Tuesday, November 24, 1998
|
|
|
|
|
*/
|
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
#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 */
|
1998-11-25 22:58:22 +08:00
|
|
|
|
|
|
|
|
|
const char *FILENAME[] = {
|
2006-10-02 18:24:03 +08:00
|
|
|
|
"stab",
|
1998-11-25 22:58:22 +08:00
|
|
|
|
NULL
|
|
|
|
|
};
|
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
#define NAME_BUF_SIZE 1024
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* Definitions for 'long' test */
|
|
|
|
|
#define LONG_NAME_LEN 40960
|
|
|
|
|
|
|
|
|
|
/* Definitions for 'large' test */
|
|
|
|
|
#define LARGE_NOBJS 5000
|
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
/* Definitions for 'lifecycle' test */
|
|
|
|
|
#define LIFECYCLE_TOP_GROUP "top"
|
|
|
|
|
#define LIFECYCLE_BOTTOM_GROUP "bottom %u"
|
2005-11-16 08:52:42 +08:00
|
|
|
|
#define LIFECYCLE_LOCAL_HEAP_SIZE_HINT 256
|
2005-11-15 10:55:39 +08:00
|
|
|
|
#define LIFECYCLE_MAX_COMPACT 4
|
|
|
|
|
#define LIFECYCLE_MIN_DENSE 3
|
2005-11-16 08:52:42 +08:00
|
|
|
|
#define LIFECYCLE_EST_NUM_ENTRIES 4
|
|
|
|
|
#define LIFECYCLE_EST_NAME_LEN 8
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* 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
|
|
|
|
|
|
2007-08-24 04:25:25 +08:00
|
|
|
|
/* Definitions for 'gcpl_on_root' test */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
#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
|
|
|
|
|
|
2007-08-24 04:25:25 +08:00
|
|
|
|
/* Definitions for 'old_api' test */
|
|
|
|
|
#define OLD_API_GROUP "/old_api"
|
|
|
|
|
|
1998-11-25 22:58:22 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: test_misc
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Test miscellaneous group stuff.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: 0
|
|
|
|
|
*
|
|
|
|
|
* Failure: number of errors
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Tuesday, November 24, 1998
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static int
|
2006-10-02 18:24:03 +08:00
|
|
|
|
test_misc(hid_t fapl, hbool_t new_format)
|
1998-11-25 22:58:22 +08:00
|
|
|
|
{
|
2006-10-02 18:24:03 +08:00
|
|
|
|
hid_t fid = (-1); /* File ID */
|
|
|
|
|
hid_t g1 = (-1), g2 = (-1), g3 = (-1);
|
|
|
|
|
char filename[NAME_BUF_SIZE];
|
2002-03-29 03:27:45 +08:00
|
|
|
|
char comment[64];
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(new_format)
|
|
|
|
|
TESTING("miscellaneous group tests (w/new group format)")
|
|
|
|
|
else
|
|
|
|
|
TESTING("miscellaneous group tests")
|
|
|
|
|
|
|
|
|
|
/* Create file */
|
|
|
|
|
h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
|
|
|
|
|
if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
1998-11-25 22:58:22 +08:00
|
|
|
|
|
2002-03-29 03:27:45 +08:00
|
|
|
|
/* Create initial groups for testing, then close */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((g1 = H5Gcreate2(fid, "test_1a", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
|
|
|
|
if((g2 = H5Gcreate2(g1, "sub_1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
|
|
|
|
if((g3 = H5Gcreate2(fid, "test_1b", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
[svn-r14229] Description:
Change H5O[gs]et_comment to H5O[gs]et_comment_by_name and re-add simpler
forms of H5O[gs]et_comment.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode
2007-11-02 02:24:08 +08:00
|
|
|
|
if(H5Oset_comment(g3, "hello world") < 0) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(g1) < 0) TEST_ERROR
|
|
|
|
|
if(H5Gclose(g2) < 0) TEST_ERROR
|
|
|
|
|
if(H5Gclose(g3) < 0) TEST_ERROR
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
1998-11-25 22:58:22 +08:00
|
|
|
|
/* Open all groups with absolute names to check for exsistence */
|
2007-08-28 23:02:54 +08:00
|
|
|
|
if((g1 = H5Gopen2(fid, "/test_1a", H5P_DEFAULT)) < 0) TEST_ERROR
|
|
|
|
|
if((g2 = H5Gopen2(fid, "/test_1a/sub_1", H5P_DEFAULT)) < 0) TEST_ERROR
|
|
|
|
|
if((g3 = H5Gopen2(fid, "/test_1b", H5P_DEFAULT)) < 0) TEST_ERROR
|
[svn-r14229] Description:
Change H5O[gs]et_comment to H5O[gs]et_comment_by_name and re-add simpler
forms of H5O[gs]et_comment.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode
2007-11-02 02:24:08 +08:00
|
|
|
|
if(H5Oget_comment_by_name(g3, "././.", comment, sizeof comment, H5P_DEFAULT) < 0) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(HDstrcmp(comment, "hello world")) {
|
2001-01-26 01:03:29 +08:00
|
|
|
|
H5_FAILED();
|
1998-11-25 22:58:22 +08:00
|
|
|
|
puts(" Read the wrong comment string from the group.");
|
|
|
|
|
printf(" got: \"%s\"\n ans: \"hello world\"\n", comment);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
TEST_ERROR
|
1998-11-25 22:58:22 +08:00
|
|
|
|
}
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(g1) < 0) TEST_ERROR
|
|
|
|
|
if(H5Gclose(g2) < 0) TEST_ERROR
|
|
|
|
|
if(H5Gclose(g3) < 0) TEST_ERROR
|
2002-03-29 03:27:45 +08:00
|
|
|
|
|
2004-07-20 08:47:37 +08:00
|
|
|
|
/* Check that creating groups with no-op names isn't allowed */
|
|
|
|
|
H5E_BEGIN_TRY {
|
2007-08-24 04:25:25 +08:00
|
|
|
|
g1 = H5Gcreate2(fid, "/", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
2004-07-20 08:47:37 +08:00
|
|
|
|
} H5E_END_TRY
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(g1 >= 0) TEST_ERROR
|
2004-07-20 08:47:37 +08:00
|
|
|
|
|
|
|
|
|
H5E_BEGIN_TRY {
|
2007-08-24 04:25:25 +08:00
|
|
|
|
g1 = H5Gcreate2(fid, "./././", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
|
2004-07-20 08:47:37 +08:00
|
|
|
|
} H5E_END_TRY
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(g1 >= 0) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Close file */
|
|
|
|
|
if(H5Fclose(fid) < 0) TEST_ERROR
|
2004-07-20 08:47:37 +08:00
|
|
|
|
|
1998-11-25 22:58:22 +08:00
|
|
|
|
PASSED();
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
H5Gclose(g1);
|
|
|
|
|
H5Gclose(g2);
|
|
|
|
|
H5Gclose(g3);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
H5Fclose(fid);
|
2002-03-29 03:27:45 +08:00
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Purpose: Creates a group with a very long name
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: 0
|
|
|
|
|
*
|
|
|
|
|
* Failure: number of errors
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke <matzke@llnl.gov> 2002-03-28
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static int
|
2006-10-02 18:24:03 +08:00
|
|
|
|
test_long(hid_t fapl, hbool_t new_format)
|
2002-03-29 03:27:45 +08:00
|
|
|
|
{
|
2006-10-02 18:24:03 +08:00
|
|
|
|
hid_t fid = (-1); /* File ID */
|
|
|
|
|
hid_t g1 = (-1), g2 = (-1);
|
|
|
|
|
char *name1 = NULL, *name2 = NULL;
|
|
|
|
|
char filename[NAME_BUF_SIZE];
|
|
|
|
|
size_t i;
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(new_format)
|
|
|
|
|
TESTING("long names (w/new group format)")
|
|
|
|
|
else
|
|
|
|
|
TESTING("long names")
|
|
|
|
|
|
|
|
|
|
/* Create file */
|
|
|
|
|
h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
|
|
|
|
|
if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
2002-03-29 03:27:45 +08:00
|
|
|
|
|
|
|
|
|
/* Group names */
|
2007-08-25 02:41:29 +08:00
|
|
|
|
name1 = (char *)HDmalloc((size_t)LONG_NAME_LEN);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
for(i = 0; i < LONG_NAME_LEN; i++)
|
2002-05-21 02:43:31 +08:00
|
|
|
|
name1[i] = (char)('A' + i%26);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
name1[LONG_NAME_LEN - 1] = '\0';
|
2007-08-25 02:41:29 +08:00
|
|
|
|
name2 = (char *)HDmalloc((size_t)((2 * LONG_NAME_LEN) + 2));
|
2002-03-29 03:27:45 +08:00
|
|
|
|
sprintf(name2, "%s/%s", name1, name1);
|
|
|
|
|
|
|
|
|
|
/* Create groups */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((g1 = H5Gcreate2(fid, name1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
|
|
|
|
if((g2 = H5Gcreate2(g1, name1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(g1) < 0) TEST_ERROR
|
|
|
|
|
if(H5Gclose(g2) < 0) TEST_ERROR
|
2002-03-29 03:27:45 +08:00
|
|
|
|
|
|
|
|
|
/* Open groups */
|
2007-08-28 23:02:54 +08:00
|
|
|
|
if((g1 = H5Gopen2(fid, name1, H5P_DEFAULT)) < 0) TEST_ERROR
|
|
|
|
|
if((g2 = H5Gopen2(fid, name2, H5P_DEFAULT)) < 0) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(g1) < 0) TEST_ERROR
|
|
|
|
|
if(H5Gclose(g2) < 0) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Close file */
|
|
|
|
|
if(H5Fclose(fid) < 0) TEST_ERROR
|
2005-08-14 04:53:35 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
/* Release name buffers */
|
|
|
|
|
HDfree(name2);
|
|
|
|
|
HDfree(name1);
|
|
|
|
|
|
2002-03-29 03:27:45 +08:00
|
|
|
|
PASSED();
|
|
|
|
|
return 0;
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
error:
|
2002-03-29 03:27:45 +08:00
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
H5Gclose(g1);
|
|
|
|
|
H5Gclose(g2);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
H5Fclose(fid);
|
2006-10-31 08:13:27 +08:00
|
|
|
|
HDfree(name2);
|
|
|
|
|
HDfree(name1);
|
1998-11-25 22:58:22 +08:00
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
return 1;
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end test_long() */
|
1998-11-25 22:58:22 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: test_large
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Creates a really large directory.
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: 0
|
|
|
|
|
*
|
|
|
|
|
* Failure: number of errors
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* robb@maya.nuance.com
|
|
|
|
|
* Aug 29 1997
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static int
|
2006-10-02 18:24:03 +08:00
|
|
|
|
test_large(hid_t fapl, hbool_t new_format)
|
1998-11-25 22:58:22 +08:00
|
|
|
|
{
|
2006-10-02 18:24:03 +08:00
|
|
|
|
hid_t fid = (-1); /* File ID */
|
|
|
|
|
hid_t cwg = (-1), dir = (-1); /* Group IDs */
|
|
|
|
|
char filename[NAME_BUF_SIZE];
|
|
|
|
|
char name[NAME_BUF_SIZE];
|
|
|
|
|
int i;
|
1998-11-25 22:58:22 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(new_format)
|
|
|
|
|
TESTING("large directories (w/new group format)")
|
|
|
|
|
else
|
|
|
|
|
TESTING("large directories")
|
|
|
|
|
|
|
|
|
|
/* Create file */
|
|
|
|
|
h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
|
|
|
|
|
if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
1998-11-25 22:58:22 +08:00
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Create a directory that has so many entries that the root
|
|
|
|
|
* of the B-tree ends up splitting.
|
|
|
|
|
*/
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((cwg = H5Gcreate2(fid, "/big", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(new_format)
|
|
|
|
|
if(H5G_has_stab_test(cwg) != FALSE) TEST_ERROR
|
|
|
|
|
for(i = 0; i < LARGE_NOBJS; i++) {
|
|
|
|
|
sprintf(name, "%05d%05d", (HDrandom() % 100000), i);
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((dir = H5Gcreate2(cwg, name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(dir) < 0) TEST_ERROR
|
1998-11-25 22:58:22 +08:00
|
|
|
|
}
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(new_format)
|
|
|
|
|
if(H5G_is_new_dense_test(cwg) != TRUE) TEST_ERROR
|
|
|
|
|
if(H5Gclose(cwg) < 0) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Close file */
|
|
|
|
|
if(H5Fclose(fid) < 0) TEST_ERROR
|
1998-11-25 22:58:22 +08:00
|
|
|
|
|
|
|
|
|
PASSED();
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
H5Gclose(dir);
|
|
|
|
|
H5Gclose(cwg);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
H5Fclose(fid);
|
1998-11-25 22:58:22 +08:00
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
return 1;
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end test_large() */
|
1998-11-25 22:58:22 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* 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
|
2007-08-24 04:25:25 +08:00
|
|
|
|
lifecycle(hid_t fapl2)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
{
|
|
|
|
|
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 */
|
2007-09-13 23:44:56 +08:00
|
|
|
|
H5O_info_t oinfo; /* Object info */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
char objname[NAME_BUF_SIZE]; /* Object name */
|
2006-06-27 22:45:06 +08:00
|
|
|
|
char filename[NAME_BUF_SIZE];
|
2006-11-08 04:19:41 +08:00
|
|
|
|
h5_stat_size_t empty_size; /* Size of an empty file */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
unsigned u; /* Local index variable */
|
2006-11-08 04:19:41 +08:00
|
|
|
|
h5_stat_size_t file_size; /* Size of each file created */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
TESTING("group lifecycle");
|
|
|
|
|
|
|
|
|
|
/* Create file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
h5_fixname(FILENAME[0], fapl2, filename, sizeof(filename));
|
|
|
|
|
if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Fclose(fid) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Get size of file as empty */
|
2006-10-12 11:55:06 +08:00
|
|
|
|
if((empty_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Re-open file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl2)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Set up group creation property list */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if((gcpl = H5Pcreate(H5P_GROUP_CREATE)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Query default group creation property settings */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
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
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Set GCPL parameters */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pset_local_heap_size_hint(gcpl, (size_t)LIFECYCLE_LOCAL_HEAP_SIZE_HINT) < 0) TEST_ERROR
|
|
|
|
|
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
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Create group for testing lifecycle */
|
2007-04-12 00:22:16 +08:00
|
|
|
|
if((gid = H5Gcreate2(fid, LIFECYCLE_TOP_GROUP, H5P_DEFAULT, gcpl, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
2005-11-16 08:52:42 +08:00
|
|
|
|
/* Query group creation property settings */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pget_local_heap_size_hint(gcpl, &lheap_size_hint) < 0) TEST_ERROR
|
|
|
|
|
if(lheap_size_hint != LIFECYCLE_LOCAL_HEAP_SIZE_HINT) TEST_ERROR
|
|
|
|
|
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
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Use internal testing routine to check that the group has no links or symbol table */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Create first "bottom" group */
|
|
|
|
|
sprintf(objname, LIFECYCLE_BOTTOM_GROUP, (unsigned)0);
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Check on bottom group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close bottom group */
|
|
|
|
|
if(H5Gclose(gid2) < 0) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_has_links_test(gid, &nmsgs) != TRUE) TEST_ERROR
|
|
|
|
|
if(nmsgs != 1) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* 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);
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Check on bottom group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close bottom group */
|
|
|
|
|
if(H5Gclose(gid2) < 0) TEST_ERROR
|
|
|
|
|
} /* end for */
|
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
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
|
|
|
|
|
if(H5G_is_new_dense_test(gid) != FALSE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
2005-11-16 08:52:42 +08:00
|
|
|
|
/* Check that the object header is only one chunk and the space has been allocated correctly */
|
[svn-r14225] Description:
Change H5Oget_info -> H5Oget_info_by_name and re-add H5Oget_info in a
simpler form for querying a particular object, to align with other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 21:13:40 +08:00
|
|
|
|
if(H5Oget_info(gid, &oinfo) < 0) TEST_ERROR
|
2007-09-13 23:44:56 +08:00
|
|
|
|
if(oinfo.hdr.space.total != 151) TEST_ERROR
|
|
|
|
|
if(oinfo.hdr.space.free != 0) TEST_ERROR
|
|
|
|
|
if(oinfo.hdr.nmesgs != 6) TEST_ERROR
|
|
|
|
|
if(oinfo.hdr.nchunks != 1) TEST_ERROR
|
2005-11-16 08:52:42 +08:00
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
/* Create one more "bottom" group, which should push top group into using a symbol table */
|
|
|
|
|
sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Check on bottom group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close bottom group */
|
|
|
|
|
if(H5Gclose(gid2) < 0) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_is_new_dense_test(gid) != TRUE) TEST_ERROR
|
2005-11-16 08:52:42 +08:00
|
|
|
|
|
|
|
|
|
/* Check that the object header is still one chunk and the space has been allocated correctly */
|
[svn-r14225] Description:
Change H5Oget_info -> H5Oget_info_by_name and re-add H5Oget_info in a
simpler form for querying a particular object, to align with other new API
routines.
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
2007-10-31 21:13:40 +08:00
|
|
|
|
if(H5Oget_info(gid, &oinfo) < 0) TEST_ERROR
|
2007-09-13 23:44:56 +08:00
|
|
|
|
if(oinfo.hdr.space.total != 151) TEST_ERROR
|
|
|
|
|
if(oinfo.hdr.space.free != 92) TEST_ERROR
|
|
|
|
|
if(oinfo.hdr.nmesgs != 3) TEST_ERROR
|
|
|
|
|
if(oinfo.hdr.nchunks != 1) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Unlink objects from top group */
|
|
|
|
|
while(u >= LIFECYCLE_MIN_DENSE) {
|
|
|
|
|
sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
|
|
|
|
|
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
u--;
|
|
|
|
|
} /* end while */
|
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_is_new_dense_test(gid) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Unlink one more object from the group, which should transform back to using links */
|
|
|
|
|
sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
u--;
|
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
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
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Unlink last two objects from top group */
|
|
|
|
|
sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
u--;
|
|
|
|
|
sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u);
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close top group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(gid) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Unlink top group */
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(fid, LIFECYCLE_TOP_GROUP, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close GCPL */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pclose(gcpl) < 0) TEST_ERROR
|
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
/* Close file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Fclose(fid) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Get size of file as empty */
|
2006-10-12 11:55:06 +08:00
|
|
|
|
if((file_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Verify that file is correct size */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(file_size != empty_size) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
2007-08-24 04:25:25 +08:00
|
|
|
|
long_compact(hid_t fapl2)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
{
|
|
|
|
|
hid_t fid = (-1); /* File ID */
|
|
|
|
|
hid_t gid = (-1); /* Group ID */
|
|
|
|
|
hid_t gid2 = (-1); /* Group ID */
|
|
|
|
|
char *objname; /* Object name */
|
2006-06-27 22:45:06 +08:00
|
|
|
|
char filename[NAME_BUF_SIZE];
|
2006-11-08 04:19:41 +08:00
|
|
|
|
h5_stat_size_t empty_size; /* Size of an empty file */
|
|
|
|
|
h5_stat_size_t file_size; /* Size of each file created */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
TESTING("long link names in compact groups");
|
|
|
|
|
|
|
|
|
|
/* Create file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
h5_fixname(FILENAME[0], fapl2, filename, sizeof(filename));
|
|
|
|
|
if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close file */
|
|
|
|
|
if(H5Fclose(fid) < 0) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Get size of file as empty */
|
2006-10-12 11:55:06 +08:00
|
|
|
|
if((empty_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Construct very long object name template */
|
2007-08-25 02:41:29 +08:00
|
|
|
|
if((objname = (char *)HDmalloc((size_t)(LONG_COMPACT_LENGTH + 1))) == NULL) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
HDmemset(objname, 'a', (size_t)LONG_COMPACT_LENGTH);
|
2005-11-15 10:55:39 +08:00
|
|
|
|
objname[LONG_COMPACT_LENGTH] = '\0';
|
|
|
|
|
|
|
|
|
|
/* Re-open file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl2)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Create top group */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((gid = H5Gcreate2(fid, "top", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* Use internal testing routine to check that the group has no links or dense storage */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Create first group with "long" name */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* 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 */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* (Should have dense storage to hold links, since name is too long for object header message) */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_new_dense_test(gid) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Create second group with "long" name */
|
|
|
|
|
objname[0] = 'b';
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Check on bottom group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close bottom group */
|
|
|
|
|
if(H5Gclose(gid2) < 0) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* (Should have dense storage to hold links, since name is too long for object header message) */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_new_dense_test(gid) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Unlink second object from top group */
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* (Should still be dense storage to hold links, since name is too long for object header message) */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_new_dense_test(gid) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Unlink first object from top group */
|
|
|
|
|
objname[0] = 'a';
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* (Should have deleted the dense storage now) */
|
|
|
|
|
if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Free object name */
|
|
|
|
|
HDfree(objname);
|
|
|
|
|
|
|
|
|
|
/* Close top group */
|
|
|
|
|
if(H5Gclose(gid) < 0) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Unlink top group */
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(fid, "top", H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close file */
|
|
|
|
|
if(H5Fclose(fid) < 0) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Get size of file as empty */
|
2006-10-12 11:55:06 +08:00
|
|
|
|
if((file_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Verify that file is correct size */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(file_size != empty_size) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
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
|
2007-08-24 04:25:25 +08:00
|
|
|
|
read_old(hid_t fapl2)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
{
|
|
|
|
|
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 */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
char filename[512] = ""; /* old test file name */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
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 */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
h5_fixname(FILENAME[0], fapl2, filename2, sizeof(filename2));
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* 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 */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((fid = H5Fopen(filename2, H5F_ACC_RDWR, fapl2)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Attempt to open "old" group */
|
2007-08-28 23:02:54 +08:00
|
|
|
|
if((gid = H5Gopen2(fid, "old", H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Check on old group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) == FALSE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
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);
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* 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);
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
} /* end for */
|
|
|
|
|
|
|
|
|
|
/* Check on old group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* (Should stay in old "symbol table" form, but have no links) */
|
|
|
|
|
if(H5G_is_empty_test(gid) == FALSE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_has_stab_test(gid) != TRUE) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Close old group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(gid) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close first file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Fclose(fid)<0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
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
|
2007-08-24 04:25:25 +08:00
|
|
|
|
no_compact(hid_t fapl2)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
{
|
|
|
|
|
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 */
|
2006-06-27 22:45:06 +08:00
|
|
|
|
char filename[NAME_BUF_SIZE];
|
2006-11-08 04:19:41 +08:00
|
|
|
|
h5_stat_size_t empty_size; /* Size of an empty file */
|
|
|
|
|
h5_stat_size_t file_size; /* Size of each file created */
|
2005-11-16 08:52:42 +08:00
|
|
|
|
unsigned est_num_entries; /* Estimated # of entries in group */
|
|
|
|
|
unsigned est_name_len; /* Estimated length of entry name */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
TESTING("group without compact form");
|
|
|
|
|
|
|
|
|
|
/* Create file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
h5_fixname(FILENAME[0], fapl2, filename, sizeof(filename));
|
|
|
|
|
if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl2)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Fclose(fid) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Get size of file as empty */
|
2006-10-12 11:55:06 +08:00
|
|
|
|
if((empty_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Re-open file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if((fid = H5Fopen(filename, H5F_ACC_RDWR, fapl2)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Set up group creation property list */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if((gcpl = H5Pcreate(H5P_GROUP_CREATE)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Set GCPL parameters */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pset_link_phase_change(gcpl, NO_COMPACT_MAX_COMPACT, NO_COMPACT_MIN_DENSE) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* Check information for default group creation */
|
|
|
|
|
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
|
2005-11-16 08:52:42 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* Create group for testing no compact form */
|
2007-04-12 00:22:16 +08:00
|
|
|
|
if((gid = H5Gcreate2(fid, NO_COMPACT_TOP_GROUP, H5P_DEFAULT, gcpl, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close GCPL */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pclose(gcpl) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* Use internal testing routine to check that the group has no links or dense storage */
|
|
|
|
|
if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Create first "bottom" group */
|
|
|
|
|
sprintf(objname, NO_COMPACT_BOTTOM_GROUP, (unsigned)0);
|
2007-08-24 04:25:25 +08:00
|
|
|
|
if((gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Check on bottom group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close bottom group */
|
|
|
|
|
if(H5Gclose(gid2) < 0) TEST_ERROR
|
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR
|
|
|
|
|
if(H5G_is_new_dense_test(gid) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Unlink object from top group */
|
|
|
|
|
sprintf(objname, NO_COMPACT_BOTTOM_GROUP, (unsigned)0);
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Check on top group's status */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close top group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(gid) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Unlink top group */
|
2007-08-30 04:44:19 +08:00
|
|
|
|
if(H5Ldelete(fid, NO_COMPACT_TOP_GROUP, H5P_DEFAULT) < 0) FAIL_STACK_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Fclose(fid) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Get size of file as empty */
|
2006-10-12 11:55:06 +08:00
|
|
|
|
if((file_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Verify that file is correct size */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(file_size != empty_size) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
2007-08-24 04:25:25 +08:00
|
|
|
|
gcpl_on_root(hid_t fapl2)
|
2005-11-15 10:55:39 +08:00
|
|
|
|
{
|
|
|
|
|
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 */
|
2006-08-02 23:59:05 +08:00
|
|
|
|
hid_t lcpl = (-1); /* Link creation property list ID */
|
2005-11-15 10:55:39 +08:00
|
|
|
|
unsigned max_compact; /* Maximum # of links to store in group compactly */
|
|
|
|
|
unsigned min_dense; /* Minimum # of links to store in group "densely" */
|
2006-06-27 22:45:06 +08:00
|
|
|
|
char filename[NAME_BUF_SIZE];
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
TESTING("setting root group creation properties");
|
|
|
|
|
|
|
|
|
|
/* Create file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
h5_fixname(FILENAME[0], fapl2, filename, sizeof(filename));
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Set up file creation property list */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if((fcpl = H5Pcreate(H5P_FILE_CREATE)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Set GCPL parameters */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pset_link_phase_change(fcpl, GCPL_ON_ROOT_MAX_COMPACT, GCPL_ON_ROOT_MIN_DENSE) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Query the group creation properties from the FCPL */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
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
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Create file with modified root group creation properties */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl2)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close FCPL */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pclose(fcpl) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Open the root group */
|
2007-08-28 23:02:54 +08:00
|
|
|
|
if((gid = H5Gopen2(fid, "/", H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Query the group creation properties */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
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
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close GCPL */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pclose(gcpl) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
2006-08-02 23:59:05 +08:00
|
|
|
|
/* Create a link creation property list, with intermediate group creation set */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if((lcpl = H5Pcreate(H5P_LINK_CREATE)) < 0) TEST_ERROR
|
2006-08-02 23:59:05 +08:00
|
|
|
|
if(H5Pset_create_intermediate_group(lcpl, TRUE) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Create a group and intermediate groups, to check if root group settings are inherited */
|
2007-04-12 00:22:16 +08:00
|
|
|
|
if((gid2 = H5Gcreate2(gid, GCPL_ON_ROOT_BOTTOM_GROUP, lcpl, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
2006-08-02 23:59:05 +08:00
|
|
|
|
/* Close LCPL */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pclose(lcpl) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Query the group creation properties */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
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
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close GCPL */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pclose(gcpl) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close bottom group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(gid2) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Open the middle group */
|
2007-08-28 23:02:54 +08:00
|
|
|
|
if((gid2 = H5Gopen2(fid, GCPL_ON_ROOT_MIDDLE_GROUP, H5P_DEFAULT)) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Query the group creation properties */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
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
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close GCPL */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Pclose(gcpl) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close bottom group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(gid2) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
/* Close root group */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Gclose(gid) < 0) TEST_ERROR
|
|
|
|
|
|
2005-11-15 10:55:39 +08:00
|
|
|
|
/* Close file */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(H5Fclose(fid) < 0) TEST_ERROR
|
2005-11-15 10:55:39 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PASSED();
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
error:
|
|
|
|
|
H5E_BEGIN_TRY {
|
2006-08-02 23:59:05 +08:00
|
|
|
|
H5Gclose(lcpl);
|
2005-11-15 10:55:39 +08:00
|
|
|
|
H5Gclose(gcpl);
|
|
|
|
|
H5Gclose(gid2);
|
|
|
|
|
H5Gclose(gid);
|
|
|
|
|
H5Gclose(fcpl);
|
|
|
|
|
H5Fclose(fid);
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
return 1;
|
|
|
|
|
} /* end gcpl_on_root() */
|
|
|
|
|
|
2007-08-24 04:25:25 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: old_api
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Test old API routines
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: 0
|
|
|
|
|
* Failure: -1
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Quincey Koziol
|
|
|
|
|
* Thursday, August 23, 2007
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
static int
|
2007-08-25 02:41:29 +08:00
|
|
|
|
old_api(hid_t fapl, const char *driver)
|
2007-08-24 04:25:25 +08:00
|
|
|
|
{
|
|
|
|
|
#ifndef H5_NO_DEPRECATED_SYMBOLS
|
|
|
|
|
hid_t fid = (-1); /* File ID */
|
|
|
|
|
hid_t gid = (-1); /* Group ID */
|
|
|
|
|
h5_stat_size_t small_file_size; /* Size of small group file */
|
|
|
|
|
h5_stat_size_t large_file_size; /* Size of large group file */
|
|
|
|
|
char filename[NAME_BUF_SIZE];
|
|
|
|
|
#endif /* H5_NO_DEPRECATED_SYMBOLS */
|
|
|
|
|
|
|
|
|
|
TESTING("old API routines");
|
|
|
|
|
|
|
|
|
|
#ifndef H5_NO_DEPRECATED_SYMBOLS
|
|
|
|
|
/* Create file */
|
|
|
|
|
h5_fixname(FILENAME[0], fapl, filename, sizeof(filename));
|
|
|
|
|
|
|
|
|
|
/* Create file */
|
|
|
|
|
if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
|
|
|
|
|
|
|
|
|
|
/* Create a group, with the old API routine and a "small" heap */
|
|
|
|
|
if((gid = H5Gcreate1(fid, OLD_API_GROUP, (size_t)0)) < 0) FAIL_STACK_ERROR
|
|
|
|
|
|
|
|
|
|
/* Close group */
|
|
|
|
|
if(H5Gclose(gid) < 0) FAIL_STACK_ERROR
|
|
|
|
|
|
|
|
|
|
/* Close file */
|
|
|
|
|
if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
|
|
|
|
|
|
2007-08-25 02:41:29 +08:00
|
|
|
|
/* Avoid size comparisons if we are using the core VFD */
|
|
|
|
|
if(HDstrcmp(driver, "core")) {
|
|
|
|
|
/* Get the size of the file with a "small" heap for group */
|
|
|
|
|
if((small_file_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
|
|
|
|
} /* end if */
|
|
|
|
|
|
2007-08-24 04:25:25 +08:00
|
|
|
|
|
|
|
|
|
/* Create file */
|
|
|
|
|
if((fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
|
|
|
|
|
|
|
|
|
|
/* Create a group, with the old API routine and a "large" heap */
|
|
|
|
|
if((gid = H5Gcreate1(fid, OLD_API_GROUP, (size_t)10000)) < 0) FAIL_STACK_ERROR
|
|
|
|
|
|
|
|
|
|
/* Close group */
|
|
|
|
|
if(H5Gclose(gid) < 0) FAIL_STACK_ERROR
|
|
|
|
|
|
2007-08-28 23:02:54 +08:00
|
|
|
|
/* Re-open group */
|
|
|
|
|
if((gid = H5Gopen1(fid, OLD_API_GROUP)) < 0) FAIL_STACK_ERROR
|
|
|
|
|
|
|
|
|
|
/* Close group */
|
|
|
|
|
if(H5Gclose(gid) < 0) FAIL_STACK_ERROR
|
|
|
|
|
|
2007-08-24 04:25:25 +08:00
|
|
|
|
/* Close file */
|
|
|
|
|
if(H5Fclose(fid) < 0) FAIL_STACK_ERROR
|
|
|
|
|
|
2007-08-25 02:41:29 +08:00
|
|
|
|
/* Avoid size comparisons if we are using the core VFD */
|
|
|
|
|
if(HDstrcmp(driver, "core")) {
|
|
|
|
|
/* Get the size of the file with a "large" heap for group */
|
|
|
|
|
if((large_file_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
2007-08-24 04:25:25 +08:00
|
|
|
|
|
2007-08-25 02:41:29 +08:00
|
|
|
|
/* Check that the file with a "large" group heap is actually bigger */
|
|
|
|
|
if(large_file_size <= small_file_size) TEST_ERROR
|
|
|
|
|
} /* end if */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
|
|
|
|
|
PASSED();
|
|
|
|
|
#else /* H5_NO_DEPRECATED_SYMBOLS */
|
|
|
|
|
/* Shut compiler up */
|
|
|
|
|
fapl = fapl;
|
2007-08-28 23:02:54 +08:00
|
|
|
|
driver = driver;
|
2007-08-24 04:25:25 +08:00
|
|
|
|
|
|
|
|
|
SKIPPED();
|
|
|
|
|
puts(" Deprecated API symbols not enabled");
|
|
|
|
|
#endif /* H5_NO_DEPRECATED_SYMBOLS */
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
#ifndef H5_NO_DEPRECATED_SYMBOLS
|
|
|
|
|
error:
|
|
|
|
|
H5E_BEGIN_TRY {
|
|
|
|
|
H5Gclose(gid);
|
|
|
|
|
H5Fclose(fid);
|
|
|
|
|
} H5E_END_TRY;
|
|
|
|
|
return 1;
|
|
|
|
|
#endif /* H5_NO_DEPRECATED_SYMBOLS */
|
|
|
|
|
} /* end old_api() */
|
|
|
|
|
|
1998-11-25 22:58:22 +08:00
|
|
|
|
|
|
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
|
* Function: main
|
|
|
|
|
*
|
|
|
|
|
* Purpose: Test groups
|
|
|
|
|
*
|
|
|
|
|
* Return: Success: zero
|
|
|
|
|
*
|
|
|
|
|
* Failure: non-zero
|
|
|
|
|
*
|
|
|
|
|
* Programmer: Robb Matzke
|
|
|
|
|
* Tuesday, November 24, 1998
|
|
|
|
|
*
|
|
|
|
|
* Modifications:
|
|
|
|
|
*
|
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
main(void)
|
|
|
|
|
{
|
2006-08-01 03:46:16 +08:00
|
|
|
|
const char *envval = NULL;
|
|
|
|
|
|
|
|
|
|
/* Don't run this test using the split file driver */
|
|
|
|
|
envval = HDgetenv("HDF5_DRIVER");
|
2006-10-02 18:24:03 +08:00
|
|
|
|
if(envval == NULL)
|
2006-08-01 03:46:16 +08:00
|
|
|
|
envval = "nomatch";
|
2007-06-16 03:11:59 +08:00
|
|
|
|
if(HDstrcmp(envval, "split") && HDstrcmp(envval, "multi") && HDstrcmp(envval, "family")) {
|
2006-10-02 18:24:03 +08:00
|
|
|
|
hid_t fapl, fapl2; /* File access property list IDs */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
hbool_t new_format; /* Whether to use the new format or not */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
int nerrors = 0;
|
|
|
|
|
|
2006-08-01 03:46:16 +08:00
|
|
|
|
/* Reset library */
|
|
|
|
|
h5_reset();
|
|
|
|
|
fapl = h5_fileaccess();
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
/* Copy the file access property list */
|
|
|
|
|
if((fapl2 = H5Pcopy(fapl)) < 0) TEST_ERROR
|
|
|
|
|
|
[svn-r14362] Description:
Switched from "H5P[gs]et_latest_format" to "H5P[gs]et_format_bounds".
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode
2008-01-03 21:55:39 +08:00
|
|
|
|
/* Set the "use the latest version of the format" bounds for creating objects in the file */
|
[svn-r14413] Description:
Change H5P[gs]et_format_bounds() => H5P[gs]et_libver_bounds() and also
enumerated values H5F_FORMAT_{EARLIEST, LATEST} => H5F_LIBVER_{EARLIEST, LATEST}
Tested on:
FreeBSD/32 6.2 (duty) in debug mode
FreeBSD/64 6.2 (liberty) w/C++ & FORTRAN, in debug mode
Linux/32 2.6 (kagiso) w/PGI compilers, w/C++ & FORTRAN, w/threadsafe,
in debug mode
Linux/64-amd64 2.6 (smirom) w/default API=1.6.x, w/C++ & FORTRAN,
in production mode
Linux/64-ia64 2.6 (cobalt) w/Intel compilers, w/C++ & FORTRAN,
in production mode
Solaris/32 2.10 (linew) w/deprecated symbols disabled, w/C++ & FORTRAN,
w/szip filter, in production mode
Mac OS X/32 10.4.10 (amazon) in debug mode
Linux/64-ia64 2.4 (tg-login3) w/parallel, w/FORTRAN, in production mode
2008-01-15 07:49:12 +08:00
|
|
|
|
if(H5Pset_libver_bounds(fapl2, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) < 0) TEST_ERROR
|
2006-10-02 18:24:03 +08:00
|
|
|
|
|
2007-08-24 04:25:25 +08:00
|
|
|
|
/* Loop over using new group format */
|
|
|
|
|
for(new_format = FALSE; new_format <= TRUE; new_format++) {
|
|
|
|
|
/* Perform basic tests, with old & new style groups */
|
|
|
|
|
nerrors += test_misc((new_format ? fapl2 : fapl), new_format);
|
|
|
|
|
nerrors += test_long((new_format ? fapl2 : fapl), new_format);
|
|
|
|
|
nerrors += test_large((new_format ? fapl2 : fapl), new_format);
|
|
|
|
|
} /* end for */
|
2006-10-02 18:24:03 +08:00
|
|
|
|
|
|
|
|
|
/* New format group specific tests (require new format features) */
|
2007-08-24 04:25:25 +08:00
|
|
|
|
nerrors += lifecycle(fapl2);
|
|
|
|
|
nerrors += long_compact(fapl2);
|
|
|
|
|
nerrors += read_old(fapl2);
|
|
|
|
|
nerrors += no_compact(fapl2);
|
|
|
|
|
nerrors += gcpl_on_root(fapl2);
|
|
|
|
|
|
|
|
|
|
/* Old group API specific tests */
|
2007-08-25 02:41:29 +08:00
|
|
|
|
nerrors += old_api(fapl, envval);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
|
|
|
|
|
/* Close 2nd FAPL */
|
|
|
|
|
H5Pclose(fapl2);
|
|
|
|
|
|
|
|
|
|
/* Check for test errors */
|
|
|
|
|
if(nerrors)
|
|
|
|
|
goto error;
|
1998-11-25 22:58:22 +08:00
|
|
|
|
|
2006-08-01 03:46:16 +08:00
|
|
|
|
/* Cleanup */
|
|
|
|
|
puts("All symbol table tests passed.");
|
|
|
|
|
h5_cleanup(FILENAME, fapl);
|
2006-10-02 18:24:03 +08:00
|
|
|
|
} /* end if */
|
2006-08-01 03:46:16 +08:00
|
|
|
|
else
|
|
|
|
|
puts("All symbol table tests skipped - Incompatible with current Virtual File Driver");
|
1998-11-25 22:58:22 +08:00
|
|
|
|
return 0;
|
|
|
|
|
|
2006-10-02 18:24:03 +08:00
|
|
|
|
error:
|
|
|
|
|
puts("*** TESTS FAILED ***");
|
|
|
|
|
return 1;
|
1998-11-25 22:58:22 +08:00
|
|
|
|
}
|
|
|
|
|
|