mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-12-21 07:51:46 +08:00
9d2070890b
Change H5[D|G|T]<foo>_expand() "temporary" API routines to H5[D|G|T]<foo>2() "versioned" routines. Also added H5[D|G|T](create|commit)_anon() routines to continue to allow "anonymous" objects to be created in a file. Tested on: Mac OS X/32 10.4.9 (amazon) FreeBSD/32 6.2 (duty) FreeBSD/64 6.2 (liberty) Linux/32 2.6 (chicago) Linux/64 2.6 (chicago2)
2527 lines
81 KiB
C
2527 lines
81 KiB
C
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||
* Copyright by The HDF Group. *
|
||
* 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 *
|
||
* 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. *
|
||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
||
/*
|
||
* Programmer: Robb Matzke <matzke@llnl.gov>
|
||
* Friday, September 25, 1998
|
||
*
|
||
* Purpose: Test H5Gunlink().
|
||
*/
|
||
|
||
#define H5G_PACKAGE /*suppress error about including H5Gpkg */
|
||
|
||
/* Define this macro to indicate that the testing APIs should be available */
|
||
#define H5G_TESTING
|
||
|
||
#include <time.h>
|
||
#include "h5test.h"
|
||
#include "H5Gpkg.h" /* Groups */
|
||
|
||
const char *FILENAME[] = {
|
||
"unlink",
|
||
"new_move_a",
|
||
"new_move_b",
|
||
"lunlink",
|
||
"filespace",
|
||
"slashes",
|
||
"resurrect_set",
|
||
"resurrect_type",
|
||
"resurrect_group",
|
||
"unlink_chunked",
|
||
"full_group",
|
||
NULL
|
||
};
|
||
|
||
#define THE_OBJECT "/foo"
|
||
|
||
/* Macros for test_create_unlink() & test_filespace */
|
||
#define GROUPNAME "group"
|
||
#define GROUP2NAME "group2"
|
||
#define UNLINK_NGROUPS 1000
|
||
#define DATASETNAME "dataset"
|
||
#define DATASET2NAME "dataset2"
|
||
#define ATTRNAME "attribute"
|
||
#define TYPENAME "datatype"
|
||
#define TYPE2NAME "datatype2"
|
||
#define FILESPACE_NDIMS 3
|
||
#define FILESPACE_DIM0 20
|
||
#define FILESPACE_DIM1 20
|
||
#define FILESPACE_DIM2 20
|
||
#define FILESPACE_CHUNK0 10
|
||
#define FILESPACE_CHUNK1 10
|
||
#define FILESPACE_CHUNK2 10
|
||
#define FILESPACE_DEFLATE_LEVEL 6
|
||
#define FILESPACE_REWRITE 10
|
||
#define FILESPACE_NATTR 100
|
||
#define FILESPACE_ATTR_NDIMS 2
|
||
#define FILESPACE_ATTR_DIM0 5
|
||
#define FILESPACE_ATTR_DIM1 5
|
||
#define FILESPACE_TOP_GROUPS 10
|
||
#define FILESPACE_NESTED_GROUPS 50
|
||
#define FILESPACE_NDATASETS 50
|
||
#define SLASHES_GROUP_NAME "Group///"
|
||
#define SLASHES_HARDLINK_NAME "Hard///"
|
||
#define SLASHES_SOFTLINK_NAME "Soft///"
|
||
#define SLASHES_SOFTLINK2_NAME "Soft2///"
|
||
#define SLASHES_ROOTLINK_NAME "Root///"
|
||
#define FULL_GROUP_NUM_KEEP 2
|
||
#define FULL_GROUP_NUM_DELETE_COMPACT 2
|
||
#define FULL_GROUP_NUM_DELETE_DENSE 16
|
||
#define FULL_GROUP_EST_NUM_ENTRIES 8
|
||
#define FULL_GROUP_EST_ENTRY_LEN 9
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_one
|
||
*
|
||
* Purpose: Creates a group that has just one entry and then unlinks that
|
||
* entry.
|
||
*
|
||
* Return: Success: 0
|
||
*
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Robb Matzke
|
||
* Friday, September 25, 1998
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_one(hid_t file)
|
||
{
|
||
hid_t work=-1, grp=-1;
|
||
herr_t status;
|
||
|
||
/* Create a test group */
|
||
if((work=H5Gcreate(file, "/test_one", (size_t)0)) < 0) goto error;
|
||
|
||
/* Delete by absolute name */
|
||
TESTING("unlink by absolute name");
|
||
if((grp=H5Gcreate(work, "foo", (size_t)0)) < 0) TEST_ERROR
|
||
if(H5Gclose(grp) < 0) TEST_ERROR
|
||
if(H5Gunlink(file, "/test_one/foo") < 0) TEST_ERROR
|
||
PASSED();
|
||
|
||
/* Delete by local name */
|
||
TESTING("unlink by local name");
|
||
if((grp=H5Gcreate(work, "foo", (size_t)0)) < 0) TEST_ERROR
|
||
if(H5Gclose(grp) < 0) TEST_ERROR
|
||
if(H5Gunlink(work, "foo") < 0) TEST_ERROR
|
||
PASSED();
|
||
|
||
/* Delete directly - should fail */
|
||
TESTING("unlink without a name");
|
||
if((grp=H5Gcreate(work, "foo", (size_t)0)) < 0) TEST_ERROR
|
||
H5E_BEGIN_TRY {
|
||
status = H5Gunlink(grp, ".");
|
||
} H5E_END_TRY;
|
||
if(status>=0)
|
||
FAIL_PUTS_ERROR(" Unlinking object w/o a name should have failed.")
|
||
if(H5Gclose(grp) < 0) TEST_ERROR
|
||
PASSED();
|
||
|
||
/* Cleanup */
|
||
if(H5Gclose(work) < 0) goto error;
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Gclose(work);
|
||
H5Gclose(grp);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_many
|
||
*
|
||
* Purpose: Tests many unlinks in a single directory.
|
||
*
|
||
* Return: Success: 0
|
||
*
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Robb Matzke
|
||
* Friday, September 25, 1998
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_many(hid_t file)
|
||
{
|
||
hid_t work=-1, grp=-1;
|
||
int i;
|
||
const int how_many=500;
|
||
char name[32];
|
||
|
||
/* Create a test group */
|
||
if((work=H5Gcreate(file, "/test_many", (size_t)0)) < 0) goto error;
|
||
if((grp = H5Gcreate(work, "/test_many_foo", (size_t)0)) < 0) goto error;
|
||
if(H5Gclose(grp) < 0) goto error;
|
||
|
||
/* Create a bunch of names and unlink them in order */
|
||
TESTING("forward unlink");
|
||
for (i=0; i<how_many; i++) {
|
||
sprintf(name, "obj_%05d", i);
|
||
if (H5Glink(work, H5L_TYPE_HARD, "/test_many_foo", name) < 0) TEST_ERROR
|
||
}
|
||
for (i=0; i<how_many; i++) {
|
||
sprintf(name, "obj_%05d", i);
|
||
if (H5Gunlink(work, name) < 0) TEST_ERROR
|
||
}
|
||
PASSED();
|
||
|
||
/* Create a bunch of names and unlink them in reverse order */
|
||
TESTING("backward unlink");
|
||
for (i=0; i<how_many; i++) {
|
||
sprintf(name, "obj_%05d", i);
|
||
if (H5Glink(work, H5L_TYPE_HARD, "/test_many_foo", name) < 0) TEST_ERROR
|
||
}
|
||
for (i=how_many-1; i>=0; --i) {
|
||
sprintf(name, "obj_%05d", i);
|
||
if (H5Gunlink(work, name) < 0) TEST_ERROR
|
||
}
|
||
PASSED();
|
||
|
||
/* Create a bunch of names and unlink them from both directions */
|
||
TESTING("inward unlink");
|
||
for (i=0; i<how_many; i++) {
|
||
sprintf(name, "obj_%05d", i);
|
||
if (H5Glink(work, H5L_TYPE_HARD, "/test_many_foo", name) < 0) TEST_ERROR
|
||
}
|
||
for (i=0; i<how_many; i++) {
|
||
if (i%2) {
|
||
sprintf(name, "obj_%05d", how_many-(1+i/2));
|
||
} else {
|
||
sprintf(name, "obj_%05d", i/2);
|
||
}
|
||
if (H5Gunlink(work, name) < 0) TEST_ERROR
|
||
}
|
||
PASSED();
|
||
|
||
/* Create a bunch of names and unlink them from the midle */
|
||
TESTING("outward unlink");
|
||
for (i=0; i<how_many; i++) {
|
||
sprintf(name, "obj_%05d", i);
|
||
if (H5Glink(work, H5L_TYPE_HARD, "/test_many_foo", name) < 0) TEST_ERROR
|
||
}
|
||
for (i=how_many-1; i>=0; --i) {
|
||
if (i%2) {
|
||
sprintf(name, "obj_%05d", how_many-(1+i/2));
|
||
} else {
|
||
sprintf(name, "obj_%05d", i/2);
|
||
}
|
||
if (H5Gunlink(work, name) < 0) TEST_ERROR
|
||
}
|
||
PASSED();
|
||
|
||
|
||
/* Cleanup */
|
||
if (H5Gclose(work) < 0) goto error;
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Gclose(work);
|
||
H5Gclose(grp);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_symlink
|
||
*
|
||
* Purpose: Tests removal of symbolic links.
|
||
*
|
||
* Return: Success: 0
|
||
*
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Robb Matzke
|
||
* Friday, September 25, 1998
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_symlink(hid_t file)
|
||
{
|
||
hid_t work=-1;
|
||
|
||
TESTING("symlink removal");
|
||
|
||
/* Create a test group and symlink */
|
||
if ((work=H5Gcreate(file, "/test_symlink", (size_t)0)) < 0) TEST_ERROR
|
||
if (H5Glink(work, H5L_TYPE_SOFT, "link_value", "link") < 0) TEST_ERROR
|
||
if (H5Gunlink(work, "link") < 0) TEST_ERROR
|
||
|
||
/* Cleanup */
|
||
if (H5Gclose(work) < 0) TEST_ERROR
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Gclose(work);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_rename
|
||
*
|
||
* Purpose: Tests H5Gmove()
|
||
*
|
||
* Return: Success: 0
|
||
*
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Robb Matzke
|
||
* Friday, September 25, 1998
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_rename(hid_t file)
|
||
{
|
||
hid_t work=-1, foo=-1, inner=-1;
|
||
|
||
/* Create a test group and rename something */
|
||
TESTING("object renaming");
|
||
if ((work=H5Gcreate(file, "/test_rename", (size_t)0)) < 0) TEST_ERROR
|
||
if ((foo=H5Gcreate(work, "foo", (size_t)0)) < 0) TEST_ERROR
|
||
if (H5Gmove(work, "foo", "bar") < 0) TEST_ERROR
|
||
if ((inner=H5Gcreate(foo, "inner", (size_t)0)) < 0) TEST_ERROR
|
||
if (H5Gclose(inner) < 0) TEST_ERROR
|
||
if (H5Gclose(foo) < 0) TEST_ERROR
|
||
if ((inner=H5Gopen(work, "bar/inner")) < 0) TEST_ERROR
|
||
if (H5Gclose(inner) < 0) TEST_ERROR
|
||
PASSED();
|
||
|
||
/* Try renaming a symlink */
|
||
TESTING("symlink renaming");
|
||
if (H5Glink(work, H5L_TYPE_SOFT, "link_value", "link_one") < 0) TEST_ERROR
|
||
if (H5Gmove(work, "link_one", "link_two") < 0) TEST_ERROR
|
||
PASSED();
|
||
|
||
/* Cleanup */
|
||
if (H5Gclose(work) < 0) goto error;
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Gclose(work);
|
||
H5Gclose(foo);
|
||
H5Gclose(inner);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_new_move
|
||
*
|
||
* Purpose: Tests H5Gmove2()
|
||
*
|
||
* Return: Success: 0
|
||
*
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Raymond Lu
|
||
* Thursday, April 25, 2002
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_new_move(hid_t fapl)
|
||
{
|
||
hid_t file_a, file_b=(-1);
|
||
hid_t grp_1=(-1), grp_2=(-1), grp_move=(-1), moved_grp=(-1);
|
||
char filename[1024];
|
||
|
||
TESTING("new move");
|
||
|
||
/* Create a second file */
|
||
h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
|
||
if((file_a = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
h5_fixname(FILENAME[2], fapl, filename, sizeof filename);
|
||
if((file_b = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create groups in first file */
|
||
if((grp_1 = H5Gcreate(file_a, "group1", (size_t)0)) < 0) TEST_ERROR
|
||
if((grp_2 = H5Gcreate(file_a, "group2", (size_t)0)) < 0) TEST_ERROR
|
||
if((grp_move = H5Gcreate(grp_1, "group_move", (size_t)0)) < 0) TEST_ERROR
|
||
|
||
/* Create hard and soft links. */
|
||
if(H5Glink2(grp_1, "group_move", H5L_TYPE_HARD, H5G_SAME_LOC, "hard") < 0) TEST_ERROR
|
||
if(H5Glink2(grp_1, "/group1/group_move", H5L_TYPE_SOFT, grp_2, "soft") < 0) TEST_ERROR
|
||
|
||
/* Move a group within the file. Both of source and destination use
|
||
* H5G_SAME_LOC. Should fail. */
|
||
H5E_BEGIN_TRY {
|
||
if(H5Gmove2(H5G_SAME_LOC, "group_move", H5G_SAME_LOC, "group_new_name") !=FAIL) TEST_ERROR
|
||
} H5E_END_TRY;
|
||
|
||
/* Move a group across files. Should fail. */
|
||
H5E_BEGIN_TRY {
|
||
if(H5Gmove2(grp_1, "group_move", file_b, "group_new_name")!=FAIL) TEST_ERROR
|
||
} H5E_END_TRY;
|
||
|
||
/* Move a group across groups in the same file. */
|
||
if(H5Gmove2(grp_1, "group_move", grp_2, "group_new_name") < 0) TEST_ERROR
|
||
|
||
/* Open the group just moved to the new location. */
|
||
if((moved_grp = H5Gopen(grp_2, "group_new_name")) < 0) TEST_ERROR
|
||
|
||
if(H5Gclose(grp_1) < 0) TEST_ERROR
|
||
if(H5Gclose(grp_2) < 0) TEST_ERROR
|
||
if(H5Gclose(grp_move) < 0) TEST_ERROR
|
||
if(H5Gclose(moved_grp) < 0) TEST_ERROR
|
||
if(H5Fclose(file_a) < 0) TEST_ERROR
|
||
if(H5Fclose(file_b) < 0) TEST_ERROR
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Gclose(grp_1);
|
||
H5Gclose(grp_2);
|
||
H5Gclose(grp_move);
|
||
H5Gclose(moved_grp);
|
||
H5Fclose(file_a);
|
||
H5Fclose(file_b);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: check_new_move
|
||
*
|
||
* Purpose: Checks result of H5Gmove2()
|
||
*
|
||
* Return: Success: 0
|
||
*
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Raymond Lu
|
||
* Thursday, April 25, 2002
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
check_new_move(hid_t fapl)
|
||
{
|
||
hid_t file;
|
||
H5G_stat_t sb_hard1, sb_hard2;
|
||
char filename[1024];
|
||
char linkval[1024];
|
||
|
||
TESTING("check new move function");
|
||
|
||
/* Open file */
|
||
h5_fixname(FILENAME[1], fapl, filename, sizeof filename);
|
||
if((file=H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Get hard link info */
|
||
if(H5Gget_objinfo(file, "/group2/group_new_name", TRUE, &sb_hard1) < 0) TEST_ERROR
|
||
if(H5Gget_objinfo(file, "/group1/hard", TRUE, &sb_hard2) < 0) TEST_ERROR
|
||
|
||
/* Check hard links */
|
||
if(H5G_GROUP!=sb_hard1.type || H5G_GROUP!=sb_hard2.type)
|
||
FAIL_PUTS_ERROR(" Unexpected object type, should have been a group")
|
||
if(HDmemcmp(&sb_hard1.objno, &sb_hard2.objno, sizeof(sb_hard1.objno)))
|
||
FAIL_PUTS_ERROR(" Hard link test failed. Link seems not to point to the expected file location.")
|
||
|
||
/* Check soft links */
|
||
if(H5Gget_linkval(file, "group2/soft", sizeof linkval, linkval) < 0) TEST_ERROR
|
||
if(HDstrcmp(linkval, "/group1/group_move"))
|
||
FAIL_PUTS_ERROR(" Soft link test failed. Wrong link value")
|
||
|
||
/* Cleanup */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
return 1;
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_filespace
|
||
*
|
||
* Purpose: Test proper reuse of space in the file when objects are unlinked
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Saturday, March 22, 2003
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_filespace(hid_t fapl)
|
||
{
|
||
hid_t fapl_nocache; /* File access property list with raw data cache turned off */
|
||
hid_t contig_dcpl; /* Dataset creation property list for contiguous dataset */
|
||
hid_t early_chunk_dcpl; /* Dataset creation property list for chunked dataset & early allocation */
|
||
hid_t late_chunk_dcpl; /* Dataset creation property list for chunked dataset & late allocation */
|
||
hid_t comp_dcpl; /* Dataset creation property list for compressed, chunked dataset */
|
||
hid_t compact_dcpl; /* Dataset creation property list for compact dataset */
|
||
hid_t file; /* File ID */
|
||
hid_t group, group2; /* Group IDs */
|
||
hid_t dataset, dataset2; /* Dataset IDs */
|
||
hid_t space; /* Dataspace ID */
|
||
hid_t type; /* Datatype ID */
|
||
hid_t attr_space; /* Dataspace ID for attributes */
|
||
hid_t attr; /* Attribute ID */
|
||
char filename[1024]; /* Name of file to create */
|
||
char objname[128]; /* Name of object to create */
|
||
hsize_t dims[FILESPACE_NDIMS]= {FILESPACE_DIM0, FILESPACE_DIM1, FILESPACE_DIM2}; /* Dataset dimensions */
|
||
hsize_t chunk_dims[FILESPACE_NDIMS]= {FILESPACE_CHUNK0, FILESPACE_CHUNK1, FILESPACE_CHUNK2}; /* Chunk dimensions */
|
||
hsize_t attr_dims[FILESPACE_ATTR_NDIMS]= {FILESPACE_ATTR_DIM0, FILESPACE_ATTR_DIM1}; /* Attribute dimensions */
|
||
int *data = NULL; /* Pointer to dataset buffer */
|
||
int *tmp_data; /* Temporary pointer to dataset buffer */
|
||
h5_stat_size_t empty_size; /* Size of an empty file */
|
||
h5_stat_size_t file_size; /* Size of each file created */
|
||
herr_t status; /* Function status return value */
|
||
unsigned u,v,w; /* Local index variables */
|
||
|
||
/* Metadata cache parameters */
|
||
int mdc_nelmts;
|
||
size_t rdcc_nelmts;
|
||
size_t rdcc_nbytes;
|
||
double rdcc_w0;
|
||
const char *envval = NULL;
|
||
int ExpressMode;
|
||
|
||
/* Don't run some tests for some drivers */
|
||
envval = HDgetenv("HDF5_DRIVER");
|
||
if(envval == NULL)
|
||
envval = "nomatch";
|
||
|
||
/* See if some tests can be skipped */
|
||
ExpressMode = GetTestExpress();
|
||
|
||
puts("Testing file space gets reused:");
|
||
|
||
/* Open file */
|
||
h5_fixname(FILENAME[4], fapl, filename, sizeof filename);
|
||
|
||
/* Create FAPL with raw data cache disabled */
|
||
/* Create file access property list with raw data cache disabled */
|
||
if ((fapl_nocache=H5Pcopy(fapl)) < 0) TEST_ERROR
|
||
|
||
/* Get the cache settings */
|
||
if(H5Pget_cache(fapl_nocache,&mdc_nelmts,&rdcc_nelmts,&rdcc_nbytes,&rdcc_w0) < 0) TEST_ERROR
|
||
|
||
/* Disable the raw data cache */
|
||
rdcc_nelmts=0;
|
||
rdcc_nbytes=0;
|
||
if(H5Pset_cache(fapl_nocache,mdc_nelmts,rdcc_nelmts,rdcc_nbytes,rdcc_w0) < 0) TEST_ERROR
|
||
|
||
/* Create empty file for size comparisons later */
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of an empty file */
|
||
if((empty_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Create common objects for datasets */
|
||
|
||
/* Create dataset creation property list for contigous storage */
|
||
if ((contig_dcpl=H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
|
||
|
||
/* Make certain that space is allocated early */
|
||
if(H5Pset_alloc_time(contig_dcpl, H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
|
||
|
||
/* Create dataset creation property list for chunked storage & early allocation */
|
||
if ((early_chunk_dcpl=H5Pcopy(contig_dcpl)) < 0) TEST_ERROR
|
||
|
||
/* Set chunk dimensions */
|
||
if(H5Pset_chunk(early_chunk_dcpl, FILESPACE_NDIMS, chunk_dims) < 0) TEST_ERROR
|
||
|
||
/* Create dataset creation property list for chunked storage & late allocation */
|
||
if ((late_chunk_dcpl=H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
|
||
|
||
/* Set chunk dimensions */
|
||
if(H5Pset_chunk(late_chunk_dcpl, FILESPACE_NDIMS, chunk_dims) < 0) TEST_ERROR
|
||
|
||
/* Create dataset creation property list for compressed, chunked storage & early allocation */
|
||
if ((comp_dcpl=H5Pcopy(early_chunk_dcpl)) < 0) TEST_ERROR
|
||
|
||
/* Enable compression & set level */
|
||
if(H5Pset_deflate(comp_dcpl, FILESPACE_DEFLATE_LEVEL) < 0) TEST_ERROR
|
||
|
||
/* Create dataset creation property list for compact storage */
|
||
if ((compact_dcpl=H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
|
||
|
||
/* Set to compact storage */
|
||
if(H5Pset_layout(compact_dcpl, H5D_COMPACT) < 0) TEST_ERROR
|
||
|
||
/* Create dataspace for datasets */
|
||
if((space = H5Screate_simple(FILESPACE_NDIMS, dims, NULL)) < 0) TEST_ERROR
|
||
|
||
/* Create buffer for writing dataset */
|
||
if((data = HDmalloc(sizeof(int)*FILESPACE_DIM0*FILESPACE_DIM1*FILESPACE_DIM2))==NULL) TEST_ERROR
|
||
|
||
/* Create single dataset (with contiguous storage & late allocation), remove it & verify file size */
|
||
TESTING(" contiguous dataset with late allocation");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a single dataset to remove */
|
||
if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, H5P_DEFAULT)) < 0) TEST_ERROR
|
||
if(H5Dclose (dataset) < 0) TEST_ERROR
|
||
|
||
/* Remove the dataset */
|
||
if(H5Gunlink (file, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create single dataset (with contiguous storage & early allocation), remove it & verify file size */
|
||
TESTING(" contiguous dataset with early allocation");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a single dataset to remove */
|
||
if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, contig_dcpl)) < 0) TEST_ERROR
|
||
if(H5Dclose (dataset) < 0) TEST_ERROR
|
||
|
||
/* Remove the dataset */
|
||
if(H5Gunlink (file, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create single dataset (with chunked storage & late allocation), remove it & verify file size */
|
||
TESTING(" chunked dataset with late allocation");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a single dataset to remove */
|
||
if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, late_chunk_dcpl)) < 0) TEST_ERROR
|
||
if(H5Dclose (dataset) < 0) TEST_ERROR
|
||
|
||
/* Remove the dataset */
|
||
if(H5Gunlink (file, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create single dataset (with chunked storage & early allocation), remove it & verify file size */
|
||
TESTING(" chunked dataset with early allocation");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a single dataset to remove */
|
||
if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, early_chunk_dcpl)) < 0) TEST_ERROR
|
||
if(H5Dclose (dataset) < 0) TEST_ERROR
|
||
|
||
/* Remove the dataset */
|
||
if(H5Gunlink (file, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create single dataset (with compressed storage & early allocation), remove it & verify file size */
|
||
TESTING(" compressed, chunked dataset");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a single dataset to remove */
|
||
if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, comp_dcpl)) < 0) TEST_ERROR
|
||
if(H5Dclose (dataset) < 0) TEST_ERROR
|
||
|
||
/* Remove the dataset */
|
||
if(H5Gunlink (file, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create single dataset (with compressed storage & early allocation), re-write it a bunch of
|
||
* times (which should re-allocate blocks many times) and remove it & verify
|
||
* file size.
|
||
*/
|
||
TESTING(" re-writing compressed, chunked dataset");
|
||
|
||
/* Create file (using FAPL with disabled raw data cache) */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_nocache)) < 0) TEST_ERROR
|
||
|
||
/* Create a single dataset to remove */
|
||
if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, comp_dcpl)) < 0) TEST_ERROR
|
||
|
||
/* Alternate re-writing dataset with compressible & random data */
|
||
for(u=0; u<FILESPACE_REWRITE; u++) {
|
||
/* Set buffer to some compressible values */
|
||
for (v=0, tmp_data=data; v<(FILESPACE_DIM0*FILESPACE_DIM1*FILESPACE_DIM2); v++)
|
||
*tmp_data++ = v*u;
|
||
|
||
/* Write the buffer to the dataset */
|
||
if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0) TEST_ERROR
|
||
|
||
/* Set buffer to different random numbers each time */
|
||
for (v=0, tmp_data=data; v<(FILESPACE_DIM0*FILESPACE_DIM1*FILESPACE_DIM2); v++)
|
||
*tmp_data++ = (int)HDrandom();
|
||
|
||
/* Write the buffer to the dataset */
|
||
if (H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close dataset */
|
||
if(H5Dclose (dataset) < 0) TEST_ERROR
|
||
|
||
/* Remove the dataset */
|
||
if(H5Gunlink (file, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create single dataset (with compact storage), remove it & verify file size */
|
||
TESTING(" compact dataset");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a single dataset to remove */
|
||
if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, compact_dcpl)) < 0) TEST_ERROR
|
||
if(H5Dclose (dataset) < 0) TEST_ERROR
|
||
|
||
/* Remove the dataset */
|
||
if(H5Gunlink (file, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create two datasets (with contiguous storage), alternate adding attributes
|
||
* to each one (which creates many object header continuations),
|
||
* remove both & verify file size.
|
||
*/
|
||
TESTING(" object header continuations");
|
||
|
||
/* Create file */
|
||
if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create datasets to remove */
|
||
if((dataset = H5Dcreate(file, DATASETNAME, H5T_NATIVE_INT, space, contig_dcpl)) < 0) TEST_ERROR
|
||
if((dataset2 = H5Dcreate(file, DATASET2NAME, H5T_NATIVE_INT, space, contig_dcpl)) < 0) TEST_ERROR
|
||
|
||
/* Create a dataspace for the attributes */
|
||
if((attr_space = H5Screate_simple(FILESPACE_ATTR_NDIMS, attr_dims, NULL)) < 0) TEST_ERROR
|
||
|
||
/* Alternate adding attributes to each one */
|
||
for(u = 0; u < FILESPACE_NATTR; u++) {
|
||
/* Set the name of the attribute to create */
|
||
sprintf(objname,"%s %u",ATTRNAME,u);
|
||
|
||
/* Create an attribute on the first dataset */
|
||
if((attr = H5Acreate(dataset, objname, H5T_NATIVE_INT, attr_space, H5P_DEFAULT)) < 0) TEST_ERROR
|
||
|
||
/* Don't worry about writing the attribute - it will have a fill value */
|
||
|
||
/* Close the attribute on the first dataset */
|
||
if(H5Aclose(attr) < 0) TEST_ERROR
|
||
|
||
/* Create an attribute on the second dataset */
|
||
if((attr = H5Acreate(dataset2, objname, H5T_NATIVE_INT, attr_space, H5P_DEFAULT)) < 0) TEST_ERROR
|
||
|
||
/* Don't worry about writing the attribute - it will have a fill value */
|
||
|
||
/* Close the attribute on the second dataset */
|
||
if(H5Aclose(attr) < 0) TEST_ERROR
|
||
|
||
/* Flush the file (to fix the sizes of object header buffers, etc) */
|
||
if(H5Fflush(file,H5F_SCOPE_GLOBAL) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close the dataspace for the attributes */
|
||
if(H5Sclose(attr_space) < 0) TEST_ERROR
|
||
|
||
/* Close datasets */
|
||
if(H5Dclose(dataset) < 0) TEST_ERROR
|
||
if(H5Dclose(dataset2) < 0) TEST_ERROR
|
||
|
||
/* Remove the datasets */
|
||
if(H5Gunlink(file, DATASETNAME) < 0) TEST_ERROR
|
||
if(H5Gunlink(file, DATASET2NAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size = h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create single named datatype, remove it & verify file size */
|
||
TESTING(" named datatype");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create datatype to commit */
|
||
if((type = H5Tcopy (H5T_NATIVE_INT)) < 0) TEST_ERROR
|
||
|
||
/* Create a single named datatype to remove */
|
||
if(H5Tcommit (file, TYPENAME, type) < 0) TEST_ERROR
|
||
if(H5Tclose (type) < 0) TEST_ERROR
|
||
|
||
/* Remove the named datatype */
|
||
if(H5Gunlink (file, TYPENAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create single group, remove it & verify file size */
|
||
TESTING(" single group");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a single group to remove */
|
||
if((group = H5Gcreate (file, GROUPNAME, (size_t)0)) < 0) TEST_ERROR
|
||
if(H5Gclose (group) < 0) TEST_ERROR
|
||
|
||
/* Remove the group */
|
||
if(H5Gunlink (file, GROUPNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create many groups, remove them & verify file size */
|
||
TESTING(" multiple groups");
|
||
|
||
/* Create file */
|
||
if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a many groups to remove */
|
||
for(u = 0; u < UNLINK_NGROUPS; u++) {
|
||
sprintf(objname, "%s %u", GROUPNAME, u);
|
||
if((group = H5Gcreate(file, objname, (size_t)0)) < 0) TEST_ERROR
|
||
if(H5Gclose (group) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Remove the all the groups */
|
||
/* (Remove them in reverse order just to make file size calculation easier -QAK) */
|
||
for(u = UNLINK_NGROUPS; u > 0; u--) {
|
||
sprintf(objname, "%s %u", GROUPNAME, (u - 1));
|
||
if(H5Gunlink(file, objname) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size != empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create simple group hiearchy, remove it & verify file size */
|
||
TESTING(" simple group hierarchy");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a small group hierarchy to remove */
|
||
if((group = H5Gcreate(file, GROUPNAME, (size_t)0)) < 0) TEST_ERROR
|
||
if((group2 = H5Gcreate (group, GROUP2NAME, (size_t)0)) < 0) TEST_ERROR
|
||
if(H5Gclose (group2) < 0) TEST_ERROR
|
||
if(H5Gclose (group) < 0) TEST_ERROR
|
||
|
||
/* Remove the second group */
|
||
if(H5Gunlink (file, GROUPNAME "/" GROUP2NAME) < 0) TEST_ERROR
|
||
|
||
/* Remove the first group */
|
||
if(H5Gunlink (file, GROUPNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create complex group hiearchy, remove it & verify file size */
|
||
TESTING(" complex group hierarchy");
|
||
|
||
if (ExpressMode > 1 && !HDstrcmp(envval, "direct")) {
|
||
/* This test case with Direct driver has a poor performance on
|
||
* NCSA copper, though it works. Skip it for now and worry
|
||
* about the performance later.
|
||
*/
|
||
SKIPPED();
|
||
} else {
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a complex group hierarchy to remove */
|
||
for(u=0; u<FILESPACE_TOP_GROUPS; u++) {
|
||
/* Create group */
|
||
sprintf(objname,"%s %u",GROUPNAME,u);
|
||
if((group = H5Gcreate (file, objname, (size_t)0)) < 0) TEST_ERROR
|
||
|
||
/* Create nested groups inside top groups */
|
||
for(v=0; v<FILESPACE_NESTED_GROUPS; v++) {
|
||
/* Create group */
|
||
sprintf(objname,"%s %u",GROUP2NAME,v);
|
||
if((group2 = H5Gcreate (group, objname, (size_t)0)) < 0) TEST_ERROR
|
||
|
||
/* Create datasets inside nested groups */
|
||
for(w=0; w<FILESPACE_NDATASETS; w++) {
|
||
/* Create & close a dataset */
|
||
sprintf(objname,"%s %u",DATASETNAME,w);
|
||
if((dataset = H5Dcreate (group2, objname, H5T_NATIVE_INT, space, H5P_DEFAULT)) < 0) TEST_ERROR
|
||
if(H5Dclose (dataset) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close nested group */
|
||
if(H5Gclose (group2) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close top group */
|
||
if(H5Gclose (group) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Remove complex group hierarchy */
|
||
/* (Remove them in reverse order just to make file size calculation easier -QAK) */
|
||
for(u=FILESPACE_TOP_GROUPS; u>0; u--) {
|
||
/* Open group */
|
||
sprintf(objname,"%s %u",GROUPNAME,(u-1));
|
||
if((group = H5Gopen (file, objname)) < 0) TEST_ERROR
|
||
|
||
/* Open nested groups inside top groups */
|
||
for(v=0; v<FILESPACE_NESTED_GROUPS; v++) {
|
||
/* Create group */
|
||
sprintf(objname,"%s %u",GROUP2NAME,v);
|
||
if((group2 = H5Gopen (group, objname)) < 0) TEST_ERROR
|
||
|
||
/* Remove datasets inside nested groups */
|
||
for(w=0; w<FILESPACE_NDATASETS; w++) {
|
||
/* Remove dataset */
|
||
sprintf(objname,"%s %u",DATASETNAME,w);
|
||
if(H5Gunlink (group2, objname) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close nested group */
|
||
if(H5Gclose (group2) < 0) TEST_ERROR
|
||
|
||
/* Remove nested group */
|
||
sprintf(objname,"%s %u",GROUP2NAME,v);
|
||
if(H5Gunlink (group, objname) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close top group */
|
||
if(H5Gclose (group) < 0) TEST_ERROR
|
||
|
||
/* Remove top group */
|
||
sprintf(objname,"%s %u",GROUPNAME,(u-1));
|
||
if(H5Gunlink (file, objname) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
}
|
||
|
||
/* Create dataset and duplicate dataset, remove original & verify file size */
|
||
TESTING(" duplicate dataset");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a single dataset to remove */
|
||
if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, H5P_DEFAULT)) < 0) TEST_ERROR
|
||
if(H5Dclose (dataset) < 0) TEST_ERROR
|
||
|
||
/* Create another dataset with same name */
|
||
H5E_BEGIN_TRY {
|
||
dataset=H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, H5P_DEFAULT);
|
||
} H5E_END_TRY;
|
||
if (dataset>=0) {
|
||
H5Dclose(dataset);
|
||
TEST_ERROR
|
||
} /* end if */
|
||
|
||
/* Remove the dataset */
|
||
if(H5Gunlink (file, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create group and duplicate group, remove original & verify file size */
|
||
TESTING(" duplicate group");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a single group to remove */
|
||
if((group = H5Gcreate (file, GROUPNAME, (size_t)0)) < 0) TEST_ERROR
|
||
if(H5Gclose (group) < 0) TEST_ERROR
|
||
|
||
/* Create another group with same name */
|
||
H5E_BEGIN_TRY {
|
||
group = H5Gcreate (file, GROUPNAME, (size_t)0);
|
||
} H5E_END_TRY;
|
||
if (group>=0) {
|
||
H5Gclose(group);
|
||
TEST_ERROR
|
||
} /* end if */
|
||
|
||
/* Remove the group */
|
||
if(H5Gunlink (file, GROUPNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create named datatype and duplicate named datatype, remove original & verify file size */
|
||
TESTING(" duplicate named datatype");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create datatype to commit */
|
||
if((type = H5Tcopy (H5T_NATIVE_INT)) < 0) TEST_ERROR
|
||
|
||
/* Create a single named datatype to remove */
|
||
if(H5Tcommit (file, TYPENAME, type) < 0) TEST_ERROR
|
||
if(H5Tclose (type) < 0) TEST_ERROR
|
||
|
||
/* Create datatype to commit */
|
||
if((type = H5Tcopy (H5T_NATIVE_INT)) < 0) TEST_ERROR
|
||
|
||
/* Create another named datatype with same name */
|
||
H5E_BEGIN_TRY {
|
||
status = H5Tcommit (file, TYPENAME, type);
|
||
} H5E_END_TRY;
|
||
if (status>=0) TEST_ERROR
|
||
if(H5Tclose (type) < 0) TEST_ERROR
|
||
|
||
/* Remove the named datatype */
|
||
if(H5Gunlink (file, TYPENAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Create named datatype and duplicate named datatype, remove original & verify file size */
|
||
TESTING(" duplicate attribute");
|
||
|
||
/* Create file */
|
||
if ((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create datasets to remove */
|
||
if((dataset = H5Dcreate (file, DATASETNAME, H5T_NATIVE_INT, space, contig_dcpl)) < 0) TEST_ERROR
|
||
|
||
/* Create a dataspace for the attributes */
|
||
if((attr_space = H5Screate_simple(FILESPACE_ATTR_NDIMS, attr_dims, NULL)) < 0) TEST_ERROR
|
||
|
||
/* Create an attribute on the dataset */
|
||
if((attr = H5Acreate (dataset, ATTRNAME, H5T_NATIVE_INT, attr_space, H5P_DEFAULT)) < 0) TEST_ERROR
|
||
|
||
/* Don't worry about writing the attribute - it will have a fill value */
|
||
|
||
/* Close the attribute on the dataset */
|
||
if(H5Aclose (attr) < 0) TEST_ERROR
|
||
|
||
/* Create another attribute with same name */
|
||
H5E_BEGIN_TRY {
|
||
attr = H5Acreate (dataset, ATTRNAME, H5T_NATIVE_INT, attr_space, H5P_DEFAULT);
|
||
} H5E_END_TRY;
|
||
if (attr>=0) {
|
||
H5Aclose(attr);
|
||
TEST_ERROR
|
||
} /* end if */
|
||
|
||
/* Close the dataspace for the attributes */
|
||
if(H5Sclose (attr_space) < 0) TEST_ERROR
|
||
|
||
/* Close dataset */
|
||
if(H5Dclose (dataset) < 0) TEST_ERROR
|
||
|
||
/* Remove the dataset */
|
||
if(H5Gunlink (file, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size=h5_get_file_size(filename))<0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size!=empty_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
|
||
/* Cleanup common objects */
|
||
|
||
/* Release dataset buffer */
|
||
HDfree(data);
|
||
|
||
/* Close property lists */
|
||
if(H5Pclose(fapl_nocache) < 0) TEST_ERROR
|
||
if(H5Pclose(contig_dcpl) < 0) TEST_ERROR
|
||
if(H5Pclose(early_chunk_dcpl) < 0) TEST_ERROR
|
||
if(H5Pclose(late_chunk_dcpl) < 0) TEST_ERROR
|
||
if(H5Pclose(comp_dcpl) < 0) TEST_ERROR
|
||
if(H5Pclose(compact_dcpl) < 0) TEST_ERROR
|
||
|
||
/* Close dataspace */
|
||
if(H5Sclose(space) < 0) TEST_ERROR
|
||
|
||
/* Indicate success */
|
||
/* Don't print final "PASSED", since we aren't on the correct line anymore */
|
||
return 0;
|
||
|
||
error:
|
||
/* Release dataset buffer */
|
||
if(data)
|
||
HDfree(data);
|
||
|
||
return 1;
|
||
} /* end test_filespace() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_create_unlink
|
||
*
|
||
* Purpose: Creates and then unlinks a large number of objects
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Friday, April 11, 2003
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int test_create_unlink(const char *msg, hid_t fapl)
|
||
{
|
||
hid_t file, group;
|
||
unsigned u;
|
||
char groupname[1024];
|
||
char filename[1024];
|
||
|
||
TESTING(msg);
|
||
|
||
/* Create file */
|
||
h5_fixname(FILENAME[3], fapl, filename, sizeof filename);
|
||
if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0)
|
||
FAIL_PUTS_ERROR(" Creating file failed")
|
||
|
||
/* Create a many groups to remove */
|
||
for(u=0; u<UNLINK_NGROUPS; u++) {
|
||
sprintf(groupname,"%s %u",GROUPNAME,u);
|
||
if((group = H5Gcreate (file, groupname, (size_t)0)) < 0) {
|
||
H5_FAILED();
|
||
printf("group %s creation failed\n", groupname);
|
||
goto error;
|
||
} /* end if */
|
||
if(H5Gclose (group) < 0) {
|
||
H5_FAILED();
|
||
printf("closing group %s failed\n", groupname);
|
||
goto error;
|
||
} /* end if */
|
||
} /* end for */
|
||
|
||
/* Remove the all the groups */
|
||
for(u=0; u<UNLINK_NGROUPS; u++) {
|
||
sprintf(groupname,"%s %u",GROUPNAME,u);
|
||
if(H5Gunlink(file, groupname) < 0) {
|
||
H5_FAILED();
|
||
printf("Unlinking group %s failed\n", groupname);
|
||
goto error;
|
||
} /* end if */
|
||
} /* end for */
|
||
|
||
/* Close file */
|
||
if(H5Fclose(file) < 0)
|
||
FAIL_PUTS_ERROR("Closing file failed")
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
return 1;
|
||
} /* end test_create_unlink() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_link_slashes
|
||
*
|
||
* Purpose: Tests creating links with various multiple & trailing slashes
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Saturday, August 16, 2003
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_link_slashes(hid_t fapl)
|
||
{
|
||
hid_t fid; /* File ID */
|
||
hid_t gid,gid2; /* Group ID */
|
||
char filename[1024];
|
||
|
||
TESTING("creating links with multiple slashes");
|
||
|
||
/* Create file */
|
||
h5_fixname(FILENAME[5], fapl, filename, sizeof filename);
|
||
|
||
/* Create a file */
|
||
if((fid=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR
|
||
|
||
/* Create a group in the root group */
|
||
if((gid = H5Gcreate(fid, SLASHES_GROUP_NAME, (size_t)0)) < 0) TEST_ERROR
|
||
|
||
/* Create a nested group in the root group */
|
||
if((gid2 = H5Gcreate(gid, SLASHES_GROUP_NAME, (size_t)0)) < 0) TEST_ERROR
|
||
|
||
/* Close the nested group */
|
||
if(H5Gclose(gid2) < 0) TEST_ERROR
|
||
|
||
/* Create a hard link to the nested group */
|
||
if(H5Glink2(gid, SLASHES_GROUP_NAME, H5L_TYPE_HARD, H5G_SAME_LOC, SLASHES_HARDLINK_NAME) < 0) TEST_ERROR
|
||
|
||
/* Create a soft link with a relative path to the nested group */
|
||
if(H5Glink2(gid, SLASHES_GROUP_NAME, H5L_TYPE_SOFT, H5G_SAME_LOC, SLASHES_SOFTLINK_NAME) < 0) TEST_ERROR
|
||
|
||
/* Create a soft link with the full path to the nested group */
|
||
if(H5Glink2(gid, "////"SLASHES_GROUP_NAME""SLASHES_GROUP_NAME, H5L_TYPE_SOFT, H5G_SAME_LOC, SLASHES_SOFTLINK2_NAME) < 0) TEST_ERROR
|
||
|
||
/* Create a soft link to the root group */
|
||
if(H5Glink2(gid, "////", H5L_TYPE_SOFT, H5G_SAME_LOC, SLASHES_ROOTLINK_NAME) < 0) TEST_ERROR
|
||
|
||
/* Close the group */
|
||
if(H5Gclose(gid) < 0) TEST_ERROR
|
||
|
||
/* Create a hard link to the existing group */
|
||
if(H5Glink2(fid, SLASHES_GROUP_NAME, H5L_TYPE_HARD, H5G_SAME_LOC, SLASHES_HARDLINK_NAME) < 0) TEST_ERROR
|
||
|
||
/* Close the file */
|
||
if(H5Fclose(fid) < 0) TEST_ERROR
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
return 1;
|
||
} /* end test_link_slashes() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_unlink_slashes
|
||
*
|
||
* Purpose: Tests deleting links with various multiple & trailing slashes
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Saturday, August 16, 2003
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_unlink_slashes(hid_t fapl)
|
||
{
|
||
hid_t fid; /* File ID */
|
||
hid_t gid; /* Group ID */
|
||
char filename[1024];
|
||
|
||
TESTING("deleting links with multiple slashes");
|
||
|
||
/* Create file */
|
||
h5_fixname(FILENAME[5], fapl, filename, sizeof filename);
|
||
|
||
/* Open the file */
|
||
if((fid=H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) TEST_ERROR
|
||
|
||
/* Open the top level group */
|
||
if((gid = H5Gopen(fid, SLASHES_GROUP_NAME)) < 0) TEST_ERROR
|
||
|
||
/* Delete the root link */
|
||
if(H5Gunlink(gid,SLASHES_ROOTLINK_NAME) < 0) TEST_ERROR
|
||
|
||
/* Delete the soft link with the full path */
|
||
if(H5Gunlink(gid,SLASHES_SOFTLINK2_NAME) < 0) TEST_ERROR
|
||
|
||
/* Delete the soft link with the relative path */
|
||
if(H5Gunlink(gid,SLASHES_SOFTLINK_NAME) < 0) TEST_ERROR
|
||
|
||
/* Delete the hard link */
|
||
if(H5Gunlink(gid,SLASHES_HARDLINK_NAME) < 0) TEST_ERROR
|
||
|
||
/* Delete the group itself */
|
||
if(H5Gunlink(gid,SLASHES_GROUP_NAME) < 0) TEST_ERROR
|
||
|
||
/* Close the group */
|
||
if(H5Gclose(gid) < 0) TEST_ERROR
|
||
|
||
/* Delete the hard link */
|
||
if(H5Gunlink(fid,SLASHES_HARDLINK_NAME) < 0) TEST_ERROR
|
||
|
||
/* Delete the group itself */
|
||
if(H5Gunlink(fid,SLASHES_GROUP_NAME) < 0) TEST_ERROR
|
||
|
||
/* Close the file */
|
||
if(H5Fclose(fid) < 0) TEST_ERROR
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
return 1;
|
||
} /* end test_unlink_slashes() */
|
||
|
||
/*
|
||
* Helper routine for test_unlink_rightleaf()
|
||
*/
|
||
static int delete_node (hid_t pid, hid_t id)
|
||
{
|
||
char name[256]; /* Name of object to close */
|
||
|
||
/* Get the name of the object to delete */
|
||
if(H5Iget_name(id, name, sizeof(name)) < 0) return (-1);
|
||
|
||
/* Close the object */
|
||
if(H5Gclose (id) < 0) return(-1);
|
||
|
||
/* Unlink the object */
|
||
if(H5Gunlink (pid, name) < 0) return(-1);
|
||
|
||
/* If this object is the right-most child, try opening the previous object */
|
||
if(HDstrcmp(name,"/Zone81")==0) {
|
||
hid_t gid;
|
||
|
||
if((gid = H5Gopen (pid, "/Zone80")) < 0) return(-1);
|
||
if(H5Gclose(gid) < 0) return(-1);
|
||
} /* end if */
|
||
|
||
/* Indicate success */
|
||
return(0);
|
||
}
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_unlink_rightleaf
|
||
*
|
||
* Purpose: Tests deleting objects in a way that triggers deletion of the
|
||
* right child in the leaf of a non-leaf B-tree node
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Monday, January 19, 2004
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_unlink_rightleaf(hid_t fid)
|
||
{
|
||
hid_t rootid, /* Group ID for root group */
|
||
*gids; /* Array of IDs for groups created */
|
||
int n, /* Local index variable */
|
||
ngroups = 150; /* Number of groups to create */
|
||
char name[256]; /* Name of object to create */
|
||
|
||
TESTING("deleting right-most child in non-leaf B-tree node");
|
||
|
||
/* Allocate space for the group IDs */
|
||
gids = (hid_t *) HDmalloc (ngroups * sizeof(hid_t));
|
||
if(gids==NULL) TEST_ERROR
|
||
|
||
if((rootid = H5Gopen (fid, "/")) < 0) TEST_ERROR
|
||
|
||
/* Create all the groups */
|
||
for (n = 0; n < ngroups; n++) {
|
||
sprintf(name, "Zone%d", n + 1);
|
||
if((gids[n] = H5Gcreate (rootid, name, (size_t)0)) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Unlink & re-create each group */
|
||
for (n = 0; n < ngroups; n++) {
|
||
if(delete_node (rootid, gids[n]) < 0) TEST_ERROR
|
||
sprintf(name, "Zone%d", n + 1);
|
||
if((gids[n] = H5Gcreate (rootid, name, (size_t)0)) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close all the groups */
|
||
for (n = 0; n < ngroups; n++)
|
||
if(H5Gclose(gids[n]) < 0) TEST_ERROR
|
||
|
||
/* Close root group ID */
|
||
if(H5Gclose(rootid) < 0) TEST_ERROR
|
||
|
||
/* Free memory */
|
||
HDfree(gids);
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
return 1;
|
||
} /* end test_unlink_rightleaf() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_unlink_rightnode
|
||
*
|
||
* Purpose: Tests deleting objects in a way that triggers deletion of the
|
||
* entire right child leaf of a non-leaf B-tree node
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Monday, January 19, 2004
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_unlink_rightnode(hid_t fid)
|
||
{
|
||
hid_t rootid, /* Group ID for root group */
|
||
*gids; /* Array of IDs for groups created */
|
||
int n, /* Local index variable */
|
||
ngroups = 150; /* Number of groups to create */
|
||
char name[256]; /* Name of object to create */
|
||
|
||
TESTING("deleting right-most child in non-leaf B-tree node");
|
||
|
||
/* Allocate space for the group IDs */
|
||
gids = (hid_t *) HDmalloc (ngroups * sizeof(hid_t));
|
||
if(gids==NULL) TEST_ERROR
|
||
|
||
if((rootid = H5Gopen (fid, "/")) < 0) TEST_ERROR
|
||
|
||
/* Create all the groups */
|
||
for (n = 0; n < ngroups; n++) {
|
||
sprintf(name, "ZoneB%d", n + 1);
|
||
if((gids[n] = H5Gcreate (rootid, name, (size_t)0)) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close all the groups */
|
||
for (n = 0; n < ngroups; n++)
|
||
if(H5Gclose(gids[n]) < 0) TEST_ERROR
|
||
|
||
/* Unlink specific objects to trigger deletion of right leaf in non-leaf node */
|
||
if(H5Gunlink(fid,"/ZoneB77") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneB78") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneB79") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneB8") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneB80") < 0) TEST_ERROR
|
||
|
||
/* Close root group ID */
|
||
if(H5Gclose(rootid) < 0) TEST_ERROR
|
||
|
||
/* Free memory */
|
||
HDfree(gids);
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
return 1;
|
||
} /* end test_unlink_rightnode() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_unlink_middlenode
|
||
*
|
||
* Purpose: Tests deleting objects in a way that triggers deletion of all
|
||
* the leafs of a "middle" non-leaf B-tree node
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Monday, January 19, 2004
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_unlink_middlenode(hid_t fid)
|
||
{
|
||
hid_t rootid, /* Group ID for root group */
|
||
*gids; /* Array of IDs for groups created */
|
||
int n, /* Local index variable */
|
||
ngroups = 250; /* Number of groups to create */
|
||
char name[256]; /* Name of object to create */
|
||
|
||
TESTING("deleting right-most child in non-leaf B-tree node");
|
||
|
||
/* Allocate space for the group IDs */
|
||
gids = (hid_t *) HDmalloc (ngroups * sizeof(hid_t));
|
||
if(gids==NULL) TEST_ERROR
|
||
|
||
if((rootid = H5Gopen (fid, "/")) < 0) TEST_ERROR
|
||
|
||
/* Create all the groups */
|
||
for (n = 0; n < ngroups; n++) {
|
||
sprintf(name, "ZoneC%d", n + 1);
|
||
if((gids[n] = H5Gcreate (rootid, name, (size_t)0)) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close all the groups */
|
||
for (n = 0; n < ngroups; n++)
|
||
if(H5Gclose(gids[n]) < 0) TEST_ERROR
|
||
|
||
/* Unlink specific objects to trigger deletion of all leafs in "interior" non-leaf node */
|
||
if(H5Gunlink(fid,"/ZoneC11") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC110") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC111") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC112") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC113") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC114") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC115") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC116") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC117") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC118") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC119") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC12") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC120") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC121") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC122") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC123") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC124") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC125") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC126") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC127") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC128") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC129") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC13") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC130") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC131") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC132") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC133") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC134") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC135") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC136") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC137") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC138") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC139") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC14") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC140") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC141") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC142") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC143") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC144") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC145") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC146") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC147") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC148") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC149") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC15") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC150") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC151") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC152") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC153") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC154") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC155") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC156") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC157") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC158") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC159") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC16") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC160") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC161") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC162") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC163") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC164") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC165") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC166") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC167") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC168") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC169") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC17") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC170") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC171") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC172") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC173") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC174") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC175") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC176") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC177") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC178") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC179") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC18") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC180") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC19") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC2") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC20") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC21") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC22") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC23") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC24") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC25") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC26") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC27") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC28") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC29") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC3") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC30") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC31") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC32") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC33") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC34") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC35") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC36") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC37") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC38") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC39") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC4") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC40") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC41") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC42") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC43") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC44") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC45") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC46") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC47") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC48") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC49") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC5") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC50") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC51") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC52") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC53") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC54") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC55") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC56") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC57") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC58") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC59") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC6") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC60") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC61") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC62") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC63") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC64") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC65") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC66") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC67") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC68") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC69") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC7") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC70") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC71") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC72") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC73") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC74") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC75") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC76") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC77") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC78") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC79") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC8") < 0) TEST_ERROR
|
||
if(H5Gunlink(fid,"/ZoneC80") < 0) TEST_ERROR
|
||
|
||
/* Close root group ID */
|
||
if(H5Gclose(rootid) < 0) TEST_ERROR
|
||
|
||
/* Free memory */
|
||
HDfree(gids);
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
return 1;
|
||
} /* end test_unlink_middlenode() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_resurrect_dataset
|
||
*
|
||
* Purpose: Tests deleting a dataset while its still open and then
|
||
* "resurrecting" it by creating a link to it again.
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Wednesday, July 14, 2004
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_resurrect_dataset(hid_t fapl)
|
||
{
|
||
hid_t f=-1, s=-1, d=-1;
|
||
char filename[1024];
|
||
|
||
TESTING("resurrecting dataset after deletion");
|
||
|
||
/* Create file */
|
||
h5_fixname(FILENAME[6], fapl, filename, sizeof filename);
|
||
|
||
/* Create the file */
|
||
if((f = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a dataset in the file */
|
||
if((s = H5Screate(H5S_SCALAR)) < 0) TEST_ERROR
|
||
if((d = H5Dcreate(f, DATASETNAME, H5T_NATIVE_INT, s, H5P_DEFAULT)) < 0) TEST_ERROR
|
||
if(H5Sclose(s) < 0) TEST_ERROR
|
||
|
||
/* Unlink the dataset while it's open (will mark it for deletion when closed) */
|
||
if(H5Gunlink(f, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Check that dataset name is NULL */
|
||
if(H5Iget_name(d, NULL, (size_t)0) != 0) TEST_ERROR
|
||
|
||
/* Re-link the dataset to the group hierarchy (shouldn't get deleted now) */
|
||
if(H5Glink2(d, ".", H5L_TYPE_HARD, f, DATASET2NAME) < 0) TEST_ERROR
|
||
|
||
/* Close things */
|
||
if(H5Dclose(d) < 0) TEST_ERROR
|
||
if(H5Fclose(f) < 0) TEST_ERROR
|
||
|
||
/* Re-open the file */
|
||
if((f=H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Attempt to open the dataset under the new name */
|
||
if((d=H5Dopen(f,DATASET2NAME)) < 0) TEST_ERROR
|
||
|
||
/* Close things */
|
||
if(H5Dclose(d) < 0) TEST_ERROR
|
||
if(H5Fclose(f) < 0) TEST_ERROR
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Sclose(s);
|
||
H5Dclose(d);
|
||
H5Fclose(f);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
} /* end test_resurrect_dataset() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_resurrect_datatype
|
||
*
|
||
* Purpose: Tests deleting a datatype while it's still open and then
|
||
* "resurrecting" it by creating a link to it again.
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: James Laird
|
||
* Wednesday, July 28, 2004
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_resurrect_datatype(hid_t fapl)
|
||
{
|
||
hid_t file=-1, type=-1;
|
||
char filename[1024];
|
||
|
||
TESTING("resurrecting datatype after deletion");
|
||
|
||
/* Create file */
|
||
h5_fixname(FILENAME[7], fapl, filename, sizeof filename);
|
||
|
||
/* Create the file */
|
||
if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a named datatype in the file */
|
||
if((type = H5Tcopy (H5T_NATIVE_INT)) < 0) TEST_ERROR
|
||
if(H5Tcommit (file, TYPENAME, type) < 0) TEST_ERROR
|
||
|
||
/* Unlink the datatype while it's open (will mark it for deletion when closed) */
|
||
if(H5Gunlink(file, TYPENAME) < 0) TEST_ERROR
|
||
|
||
/* Check that datatype name is NULL */
|
||
if(H5Iget_name(type, NULL, (size_t)0) != 0) TEST_ERROR
|
||
|
||
/* Re-link the datatype to the group hierarchy (shouldn't get deleted now) */
|
||
if(H5Glink2(type, ".", H5L_TYPE_HARD, file, TYPE2NAME) < 0) TEST_ERROR
|
||
|
||
/* Close things */
|
||
if(H5Tclose(type) < 0) TEST_ERROR
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Re-open the file */
|
||
if((file=H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Attempt to open the datatype under the new name */
|
||
if((type=H5Topen(file,TYPE2NAME)) < 0) TEST_ERROR
|
||
|
||
/* Close things */
|
||
if(H5Tclose(type) < 0) TEST_ERROR
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Tclose(type);
|
||
H5Fclose(file);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
} /* end test_resurrect_datatype() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_resurrect_group
|
||
*
|
||
* Purpose: Tests deleting a group while it's still open and then
|
||
* "resurrecting" it by creating a link to it again.
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: James Laird
|
||
* Wednesday, July 28, 2004
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_resurrect_group(hid_t fapl)
|
||
{
|
||
hid_t file=-1, group=-1;
|
||
char filename[1024];
|
||
|
||
TESTING("resurrecting group after deletion");
|
||
|
||
/* Create file */
|
||
h5_fixname(FILENAME[8], fapl, filename, sizeof filename);
|
||
|
||
/* Create the file */
|
||
if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create a group in the file */
|
||
if((group = H5Gcreate (file, GROUPNAME, (size_t)0)) < 0) TEST_ERROR
|
||
|
||
/* Unlink the group while it's open (will mark it for deletion when closed) */
|
||
if(H5Gunlink(file, GROUPNAME) < 0) TEST_ERROR
|
||
|
||
/* Check that group's name is NULL */
|
||
if(H5Iget_name(group, NULL, (size_t)0) != 0) TEST_ERROR
|
||
|
||
/* Re-link the group into the group hierarchy (shouldn't get deleted now) */
|
||
if(H5Glink2(group, ".", H5L_TYPE_HARD, file, GROUP2NAME) < 0) TEST_ERROR
|
||
|
||
/* Close things */
|
||
if(H5Gclose(group) < 0) TEST_ERROR
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
/* Re-open the file */
|
||
if((file=H5Fopen(filename, H5F_ACC_RDONLY, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Attempt to open the datatype under the new name */
|
||
if((group=H5Gopen(file,GROUP2NAME)) < 0) TEST_ERROR
|
||
|
||
/* Close things */
|
||
if(H5Gclose(group) < 0) TEST_ERROR
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Gclose(group);
|
||
H5Fclose(file);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
} /* end test_resurrect_group() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_unlink_chunked_dataset
|
||
*
|
||
* Purpose: Tests deleting a chunked dataset
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Monday, September 27, 2004
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_unlink_chunked_dataset(hid_t fapl)
|
||
{
|
||
hid_t file_id=-1;
|
||
hid_t dset_id=-1;
|
||
hid_t space_id=-1;
|
||
hid_t dcpl_id=-1;
|
||
hsize_t dims[FILESPACE_NDIMS]={FILESPACE_DIM0,FILESPACE_DIM1,FILESPACE_DIM2};
|
||
hsize_t max_dims[FILESPACE_NDIMS]={H5S_UNLIMITED,H5S_UNLIMITED,H5S_UNLIMITED};
|
||
hsize_t chunk_dims[FILESPACE_NDIMS]={FILESPACE_CHUNK0,FILESPACE_CHUNK1,FILESPACE_CHUNK2};
|
||
char filename[1024];
|
||
|
||
TESTING("unlinking chunked dataset");
|
||
|
||
/* Create file */
|
||
h5_fixname(FILENAME[9], fapl, filename, sizeof filename);
|
||
|
||
/* Create the file */
|
||
if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create the dataspace */
|
||
if((space_id=H5Screate_simple(FILESPACE_NDIMS,dims,max_dims)) < 0) TEST_ERROR
|
||
|
||
/* Create the dataset creation filter */
|
||
if((dcpl_id=H5Pcreate(H5P_DATASET_CREATE)) < 0) TEST_ERROR
|
||
|
||
/* Set to chunked storage */
|
||
if(H5Pset_chunk(dcpl_id,FILESPACE_NDIMS,chunk_dims) < 0) TEST_ERROR
|
||
|
||
/* Set to early space allocation */
|
||
if(H5Pset_alloc_time(dcpl_id,H5D_ALLOC_TIME_EARLY) < 0) TEST_ERROR
|
||
|
||
/* Create the dataset */
|
||
if((dset_id = H5Dcreate(file_id,DATASETNAME,H5T_NATIVE_INT,space_id,dcpl_id)) < 0) TEST_ERROR
|
||
|
||
/* Close the dataspace */
|
||
if(H5Sclose(space_id) < 0) TEST_ERROR
|
||
|
||
/* Close the dataset creation property list */
|
||
if(H5Pclose(dcpl_id) < 0) TEST_ERROR
|
||
|
||
/* Close the dataset */
|
||
if(H5Dclose(dset_id) < 0) TEST_ERROR
|
||
|
||
/* Close the file */
|
||
if(H5Fclose(file_id) < 0) TEST_ERROR
|
||
|
||
/* Re-open the file */
|
||
if((file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Delete the dataset */
|
||
if(H5Gunlink(file_id, DATASETNAME) < 0) TEST_ERROR
|
||
|
||
/* Close the file */
|
||
if(H5Fclose(file_id) < 0) TEST_ERROR
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Pclose(dcpl_id);
|
||
H5Sclose(space_id);
|
||
H5Dclose(dset_id);
|
||
H5Fclose(file_id);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
} /* end test_unlink_chunked_dataset() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_full_group_compact
|
||
*
|
||
* Purpose: Test deleting a compact group which still has valid objects in it
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Wednesday, January 18, 2006
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_full_group_compact(hid_t fapl)
|
||
{
|
||
hid_t file_id = -1;
|
||
hid_t gid = -1, gid2 = -1; /* Group IDs */
|
||
H5G_stat_t sb; /* Stat buffer for object */
|
||
char objname[128]; /* Buffer for name of objects to create */
|
||
char objname2[128]; /* Buffer for name of objects to create */
|
||
char filename[1024]; /* Buffer for filename */
|
||
h5_stat_size_t keep_size; /* Size of the file with objects to keep */
|
||
h5_stat_size_t file_size; /* Size of each file created */
|
||
unsigned u; /* Local index variable */
|
||
|
||
TESTING("unlinking non-empty compact group");
|
||
|
||
/* Create filename */
|
||
h5_fixname(FILENAME[10], fapl, filename, sizeof filename);
|
||
|
||
/* Create the file */
|
||
if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create group to link objects to */
|
||
if((gid = H5Gcreate(file_id, "/keep", (size_t)0)) < 0) TEST_ERROR
|
||
|
||
/* Create several objects to link to */
|
||
for(u = 0; u < FULL_GROUP_NUM_KEEP; u++) {
|
||
sprintf(objname, "keep %u\n", u);
|
||
if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
|
||
if(H5Gclose(gid2) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close group with objects to keep */
|
||
if(H5Gclose(gid) < 0) TEST_ERROR
|
||
|
||
/* Close the file */
|
||
if(H5Fclose(file_id) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file with only the objects to keep */
|
||
if((keep_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
||
|
||
/* Re-open the file */
|
||
if((file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create group to delete */
|
||
if((gid = H5Gcreate(file_id, "/delete", (size_t)0)) < 0) TEST_ERROR
|
||
|
||
/* Create external link (doesn't matter if it dangles) */
|
||
if(H5Lcreate_external("foo.h5", "/dst", gid, "external", H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
|
||
|
||
/* Create soft link (doesn't matter if it dangles) */
|
||
if(H5Glink2(file_id, "/foo", H5L_TYPE_SOFT, gid, "soft") < 0) TEST_ERROR
|
||
|
||
/* Create hard links to objects in group to keep */
|
||
for(u = 0; u < FULL_GROUP_NUM_KEEP; u++) {
|
||
sprintf(objname, "/keep/keep %u\n", u);
|
||
sprintf(objname2, "keep %u\n", u);
|
||
if(H5Glink2(file_id, objname, H5L_TYPE_HARD, gid, objname2) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Create several objects to delete */
|
||
for(u = 0; u < FULL_GROUP_NUM_DELETE_COMPACT; u++) {
|
||
sprintf(objname, "delete %u\n", u);
|
||
if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
|
||
if(H5Gclose(gid2) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Check on group's status */
|
||
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
|
||
|
||
/* Close group with objects to delete */
|
||
if(H5Gclose(gid) < 0) TEST_ERROR
|
||
|
||
/* Check reference count on objects to keep */
|
||
for(u = 0; u < FULL_GROUP_NUM_KEEP; u++) {
|
||
sprintf(objname, "/keep/keep %u\n", u);
|
||
if(H5Gget_objinfo(file_id, objname, TRUE, &sb) < 0) TEST_ERROR
|
||
if(sb.nlink != 2) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close the file */
|
||
if(H5Fclose(file_id) < 0) TEST_ERROR
|
||
|
||
|
||
/* Re-open the file */
|
||
if((file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Delete the full group */
|
||
if(H5Gunlink(file_id, "/delete") < 0) TEST_ERROR
|
||
|
||
/* Check reference count on objects to keep */
|
||
for(u = 0; u < FULL_GROUP_NUM_KEEP; u++) {
|
||
sprintf(objname, "/keep/keep %u\n", u);
|
||
if(H5Gget_objinfo(file_id, objname, TRUE, &sb) < 0) TEST_ERROR
|
||
if(sb.nlink != 1) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close the file */
|
||
if(H5Fclose(file_id) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size != keep_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Gclose(gid2);
|
||
H5Gclose(gid);
|
||
H5Fclose(file_id);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
} /* end test_full_group_compact() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: test_full_group_dense
|
||
*
|
||
* Purpose: Test deleting a dense group which still has valid objects in it
|
||
*
|
||
* Return: Success: 0
|
||
* Failure: number of errors
|
||
*
|
||
* Programmer: Quincey Koziol
|
||
* Wednesday, January 18, 2006
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
static int
|
||
test_full_group_dense(hid_t fapl)
|
||
{
|
||
hid_t file_id = -1;
|
||
hid_t gcpl = (-1); /* Group creation property list ID */
|
||
hid_t gid = -1, gid2 = -1; /* Group IDs */
|
||
H5G_stat_t sb; /* Stat buffer for object */
|
||
char objname[128]; /* Buffer for name of objects to create */
|
||
char objname2[128]; /* Buffer for name of objects to create */
|
||
char filename[1024]; /* Buffer for filename */
|
||
h5_stat_size_t keep_size; /* Size of the file with objects to keep */
|
||
h5_stat_size_t file_size; /* Size of each file created */
|
||
unsigned u; /* Local index variable */
|
||
|
||
TESTING("unlinking non-empty dense group");
|
||
|
||
/* Create filename */
|
||
h5_fixname(FILENAME[10], fapl, filename, sizeof filename);
|
||
|
||
/* Create the file */
|
||
if((file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Create group to link objects to */
|
||
if((gid = H5Gcreate(file_id, "/keep", (size_t)0)) < 0) TEST_ERROR
|
||
|
||
/* Create several objects to link to */
|
||
for(u = 0; u < FULL_GROUP_NUM_KEEP; u++) {
|
||
sprintf(objname, "keep %u\n", u);
|
||
if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
|
||
if(H5Gclose(gid2) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close group with objects to keep */
|
||
if(H5Gclose(gid) < 0) TEST_ERROR
|
||
|
||
/* Close the file */
|
||
if(H5Fclose(file_id) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file with only the objects to keep */
|
||
if((keep_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
||
|
||
/* Re-open the file */
|
||
if((file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Set group creation "est. link info" closer to what will actually occur */
|
||
if((gcpl = H5Pcreate(H5P_GROUP_CREATE)) < 0) TEST_ERROR
|
||
if(H5Pset_est_link_info(gcpl, FULL_GROUP_EST_NUM_ENTRIES, FULL_GROUP_EST_ENTRY_LEN) < 0) TEST_ERROR
|
||
|
||
/* Create group to delete */
|
||
/* (use non-default GCPL, in order to make certain that the group's object
|
||
* header is large enough to hold the links inserted without allocating
|
||
* another object header message chunk - in order to make the file size
|
||
* computation below easier/correct - QAK)
|
||
*/
|
||
if((gid = H5Gcreate2(file_id, "/delete", H5P_DEFAULT, gcpl, H5P_DEFAULT)) < 0) TEST_ERROR
|
||
|
||
/* Close GCPL */
|
||
if(H5Pclose(gcpl) < 0) TEST_ERROR
|
||
|
||
/* Create external link (doesn't matter if it dangles) */
|
||
if(H5Lcreate_external("foo.h5", "/dst", gid, "external", H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR
|
||
|
||
/* Create soft link (doesn't matter if it dangles) */
|
||
if(H5Glink2(file_id, "/foo", H5L_TYPE_SOFT, gid, "soft") < 0) TEST_ERROR
|
||
|
||
/* Create hard links to objects in group to keep */
|
||
for(u = 0; u < FULL_GROUP_NUM_KEEP; u++) {
|
||
sprintf(objname, "/keep/keep %u\n", u);
|
||
sprintf(objname2, "keep %u\n", u);
|
||
if(H5Glink2(file_id, objname, H5L_TYPE_HARD, gid, objname2) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Create several objects to delete */
|
||
for(u = 0; u < FULL_GROUP_NUM_DELETE_DENSE; u++) {
|
||
sprintf(objname, "delete %u\n", u);
|
||
if((gid2 = H5Gcreate(gid, objname, (size_t)0)) < 0) TEST_ERROR
|
||
if(H5Gclose(gid2) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Check on group's status */
|
||
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
|
||
|
||
/* Close group with objects to delete */
|
||
if(H5Gclose(gid) < 0) TEST_ERROR
|
||
|
||
/* Check reference count on objects to keep */
|
||
for(u = 0; u < FULL_GROUP_NUM_KEEP; u++) {
|
||
sprintf(objname, "/keep/keep %u\n", u);
|
||
if(H5Gget_objinfo(file_id, objname, TRUE, &sb) < 0) TEST_ERROR
|
||
if(sb.nlink != 2) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close the file */
|
||
if(H5Fclose(file_id) < 0) TEST_ERROR
|
||
|
||
|
||
/* Re-open the file */
|
||
if((file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl)) < 0) TEST_ERROR
|
||
|
||
/* Delete the full group */
|
||
if(H5Gunlink(file_id, "/delete") < 0) TEST_ERROR
|
||
|
||
/* Check reference count on objects to keep */
|
||
for(u = 0; u < FULL_GROUP_NUM_KEEP; u++) {
|
||
sprintf(objname, "/keep/keep %u\n", u);
|
||
if(H5Gget_objinfo(file_id, objname, TRUE, &sb) < 0) TEST_ERROR
|
||
if(sb.nlink != 1) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close the file */
|
||
if(H5Fclose(file_id) < 0) TEST_ERROR
|
||
|
||
/* Get the size of the file */
|
||
if((file_size = h5_get_file_size(filename)) < 0) TEST_ERROR
|
||
|
||
/* Verify the file is correct size */
|
||
if(file_size != keep_size) TEST_ERROR
|
||
|
||
PASSED();
|
||
return 0;
|
||
|
||
error:
|
||
H5E_BEGIN_TRY {
|
||
H5Gclose(gid2);
|
||
H5Gclose(gid);
|
||
H5Pclose(gcpl);
|
||
H5Fclose(file_id);
|
||
} H5E_END_TRY;
|
||
return 1;
|
||
} /* end test_full_group_dense() */
|
||
|
||
|
||
/*-------------------------------------------------------------------------
|
||
* Function: main
|
||
*
|
||
* Purpose: Test H5Gunlink()
|
||
*
|
||
* Return: Success: zero
|
||
*
|
||
* Failure: non-zero
|
||
*
|
||
* Programmer: Robb Matzke
|
||
* Friday, September 25, 1998
|
||
*
|
||
* Modifications:
|
||
*
|
||
*-------------------------------------------------------------------------
|
||
*/
|
||
int
|
||
main(void)
|
||
{
|
||
const char *envval = NULL;
|
||
|
||
/* Don't run this test using the wrong file drivers */
|
||
envval = HDgetenv("HDF5_DRIVER");
|
||
if(envval == NULL)
|
||
envval = "nomatch";
|
||
if(HDstrcmp(envval, "core") && HDstrcmp(envval, "split") && HDstrcmp(envval, "multi") && HDstrcmp(envval, "family")) {
|
||
hid_t fapl, fapl2, file;
|
||
int nerrors = 0;
|
||
char filename[1024];
|
||
hbool_t new_format;
|
||
|
||
/* Metadata cache parameters */
|
||
int mdc_nelmts;
|
||
size_t rdcc_nelmts;
|
||
size_t rdcc_nbytes;
|
||
double rdcc_w0;
|
||
|
||
/* Set the random # seed */
|
||
HDsrandom((unsigned long)HDtime(NULL));
|
||
|
||
/* Open */
|
||
h5_reset();
|
||
fapl = h5_fileaccess();
|
||
|
||
/* Copy the file access property list */
|
||
if((fapl2 = H5Pcopy(fapl)) < 0) TEST_ERROR
|
||
|
||
/* Set the "use the latest version of the format" flag for creating objects in the file */
|
||
if(H5Pset_latest_format(fapl2, TRUE) < 0) TEST_ERROR
|
||
|
||
/* Test with old & new format groups */
|
||
for(new_format = FALSE; new_format <= TRUE; new_format++) {
|
||
hid_t my_fapl;
|
||
|
||
/* Set the FAPL for the type of format */
|
||
if(new_format) {
|
||
puts("\nTesting with new group format:");
|
||
my_fapl = fapl2;
|
||
} /* end if */
|
||
else {
|
||
puts("Testing with old group format:");
|
||
my_fapl = fapl;
|
||
} /* end else */
|
||
|
||
h5_fixname(FILENAME[0], my_fapl, filename, sizeof filename);
|
||
if((file = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, my_fapl)) < 0) TEST_ERROR
|
||
|
||
/* Tests */
|
||
nerrors += test_one(file);
|
||
nerrors += test_many(file);
|
||
nerrors += test_symlink(file);
|
||
nerrors += test_rename(file);
|
||
|
||
nerrors += test_new_move(my_fapl);
|
||
nerrors += check_new_move(my_fapl);
|
||
nerrors += test_filespace(my_fapl);
|
||
|
||
/* Test creating & unlinking lots of objects with default FAPL */
|
||
nerrors += test_create_unlink("create and unlink large number of objects", my_fapl);
|
||
|
||
{
|
||
hid_t fapl_small_mdc;
|
||
|
||
/* Make copy of regular fapl, to turn down the elements in the metadata cache */
|
||
if((fapl_small_mdc = H5Pcopy(my_fapl)) < 0)
|
||
goto error;
|
||
|
||
/* Get FAPL cache settings */
|
||
if(H5Pget_cache(fapl_small_mdc, &mdc_nelmts, &rdcc_nelmts, &rdcc_nbytes, &rdcc_w0) < 0)
|
||
printf("H5Pget_cache failed\n");
|
||
|
||
/* Change FAPL cache settings */
|
||
mdc_nelmts=1;
|
||
if(H5Pset_cache(fapl_small_mdc, mdc_nelmts, rdcc_nelmts, rdcc_nbytes, rdcc_w0) < 0)
|
||
printf("H5Pset_cache failed\n");
|
||
|
||
/* Test creating & unlinking lots of objects with a 1-element metadata cache FAPL */
|
||
nerrors += test_create_unlink("create and unlink large number of objects with small cache", fapl_small_mdc);
|
||
|
||
if(H5Pclose(fapl_small_mdc) < 0) TEST_ERROR
|
||
} /* end block */
|
||
|
||
nerrors += test_link_slashes(my_fapl);
|
||
nerrors += test_unlink_slashes(my_fapl);
|
||
|
||
/* Test specific B-tree removal issues */
|
||
/* (only for old format groups) */
|
||
if(!new_format) {
|
||
nerrors += test_unlink_rightleaf(file);
|
||
nerrors += test_unlink_rightnode(file);
|
||
nerrors += test_unlink_middlenode(file);
|
||
} /* end if */
|
||
|
||
/* Test "resurrecting" objects */
|
||
nerrors += test_resurrect_dataset(my_fapl);
|
||
nerrors += test_resurrect_datatype(my_fapl);
|
||
nerrors += test_resurrect_group(my_fapl);
|
||
|
||
/* Test unlinking chunked datasets */
|
||
nerrors += test_unlink_chunked_dataset(my_fapl);
|
||
|
||
/* Test unlinked groups which still have objects in them */
|
||
/* (only for new format groups) */
|
||
if(new_format) {
|
||
nerrors += test_full_group_compact(my_fapl);
|
||
nerrors += test_full_group_dense(my_fapl);
|
||
} /* end if */
|
||
|
||
/* Close */
|
||
if(H5Fclose(file) < 0) TEST_ERROR
|
||
} /* end for */
|
||
|
||
/* Close 2nd FAPL */
|
||
H5Pclose(fapl2);
|
||
|
||
if (nerrors) {
|
||
printf("***** %d FAILURE%s! *****\n", nerrors, 1==nerrors?"":"S");
|
||
exit(1);
|
||
}
|
||
|
||
puts("All unlink tests passed.");
|
||
h5_cleanup(FILENAME, fapl);
|
||
}
|
||
else
|
||
puts("All unlink tests skipped - Incompatible with current Virtual File Driver");
|
||
|
||
return 0;
|
||
|
||
error:
|
||
return 1;
|
||
}
|
||
|