You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7173 lines
248 KiB
7173 lines
248 KiB
2 years ago
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||
|
* Copyright by The HDF Group. *
|
||
|
* 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 COPYING file, which can be found at the root of the source code *
|
||
|
* distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases. *
|
||
|
* If you do not have access to either file, you may request a copy from *
|
||
|
* help@hdfgroup.org. *
|
||
|
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||
|
|
||
|
#include "H5_api_object_test.h"
|
||
|
|
||
|
static int test_open_object(void);
|
||
|
static int test_open_object_invalid_params(void);
|
||
|
static int test_object_exists(void);
|
||
|
static int test_object_exists_invalid_params(void);
|
||
|
static int test_get_object_info(void);
|
||
|
static int test_get_object_info_invalid_params(void);
|
||
|
static int test_link_object(void);
|
||
|
static int test_link_object_invalid_params(void);
|
||
|
static int test_incr_decr_object_refcount(void);
|
||
|
static int test_incr_decr_object_refcount_invalid_params(void);
|
||
|
static int test_object_copy_basic(void);
|
||
|
static int test_object_copy_already_existing(void);
|
||
|
static int test_object_copy_shallow_group_copy(void);
|
||
|
static int test_object_copy_no_attributes(void);
|
||
|
static int test_object_copy_by_soft_link(void);
|
||
|
static int test_object_copy_group_with_soft_links(void);
|
||
|
static int test_object_copy_between_files(void);
|
||
|
static int test_object_copy_invalid_params(void);
|
||
|
static int test_object_comments(void);
|
||
|
static int test_object_comments_invalid_params(void);
|
||
|
static int test_object_visit(void);
|
||
|
static int test_object_visit_soft_link(void);
|
||
|
static int test_object_visit_invalid_params(void);
|
||
|
static int test_close_object(void);
|
||
|
static int test_close_object_invalid_params(void);
|
||
|
static int test_close_invalid_objects(void);
|
||
|
static int test_flush_object(void);
|
||
|
static int test_flush_object_invalid_params(void);
|
||
|
static int test_refresh_object(void);
|
||
|
static int test_refresh_object_invalid_params(void);
|
||
|
|
||
|
static herr_t object_copy_attribute_iter_callback(hid_t location_id, const char *attr_name,
|
||
|
const H5A_info_t *ainfo, void *op_data);
|
||
|
static herr_t object_copy_soft_link_non_expand_callback(hid_t group, const char *name,
|
||
|
const H5L_info2_t *info, void *op_data);
|
||
|
static herr_t object_copy_soft_link_expand_callback(hid_t group, const char *name, const H5L_info2_t *info,
|
||
|
void *op_data);
|
||
|
static herr_t object_visit_callback(hid_t o_id, const char *name, const H5O_info2_t *object_info,
|
||
|
void *op_data);
|
||
|
static herr_t object_visit_dset_callback(hid_t o_id, const char *name, const H5O_info2_t *object_info,
|
||
|
void *op_data);
|
||
|
static herr_t object_visit_dtype_callback(hid_t o_id, const char *name, const H5O_info2_t *object_info,
|
||
|
void *op_data);
|
||
|
static herr_t object_visit_soft_link_callback(hid_t o_id, const char *name, const H5O_info2_t *object_info,
|
||
|
void *op_data);
|
||
|
static herr_t object_visit_noop_callback(hid_t o_id, const char *name, const H5O_info2_t *object_info,
|
||
|
void *op_data);
|
||
|
|
||
|
/*
|
||
|
* The array of object tests to be performed.
|
||
|
*/
|
||
|
static int (*object_tests[])(void) = {
|
||
|
test_open_object,
|
||
|
test_open_object_invalid_params,
|
||
|
test_object_exists,
|
||
|
test_object_exists_invalid_params,
|
||
|
test_get_object_info,
|
||
|
test_get_object_info_invalid_params,
|
||
|
test_link_object,
|
||
|
test_link_object_invalid_params,
|
||
|
test_incr_decr_object_refcount,
|
||
|
test_incr_decr_object_refcount_invalid_params,
|
||
|
test_object_copy_basic,
|
||
|
test_object_copy_already_existing,
|
||
|
test_object_copy_shallow_group_copy,
|
||
|
test_object_copy_no_attributes,
|
||
|
test_object_copy_by_soft_link,
|
||
|
test_object_copy_group_with_soft_links,
|
||
|
test_object_copy_between_files,
|
||
|
test_object_copy_invalid_params,
|
||
|
test_object_comments,
|
||
|
test_object_comments_invalid_params,
|
||
|
test_object_visit,
|
||
|
test_object_visit_soft_link,
|
||
|
test_object_visit_invalid_params,
|
||
|
test_close_object,
|
||
|
test_close_object_invalid_params,
|
||
|
test_close_invalid_objects,
|
||
|
test_flush_object,
|
||
|
test_flush_object_invalid_params,
|
||
|
test_refresh_object,
|
||
|
test_refresh_object_invalid_params,
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* A test to check that various objects (group, dataset, datatype)
|
||
|
* can be opened by using H5Oopen, H5Oopen_by_idx and H5Oopen_by_addr.
|
||
|
*
|
||
|
* XXX: create separate objects for each test part.
|
||
|
*
|
||
|
* XXX: Add more open by idx tests
|
||
|
*
|
||
|
* XXX: test opening through dangling and resolving soft links.
|
||
|
*/
|
||
|
static int
|
||
|
test_open_object(void)
|
||
|
{
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t dset_id = H5I_INVALID_HID;
|
||
|
hid_t dset_dtype = H5I_INVALID_HID;
|
||
|
hid_t type_id = H5I_INVALID_HID;
|
||
|
hid_t fspace_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object opening");
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, dataset, or stored datatype aren't "
|
||
|
"supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_OPEN_TEST_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container sub-group '%s'\n", OBJECT_OPEN_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((fspace_id = generate_random_dataspace(OBJECT_OPEN_TEST_SPACE_RANK, NULL, NULL, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((dset_dtype = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Oopen_group)
|
||
|
{
|
||
|
TESTING_2("H5Oopen on a group");
|
||
|
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_OPEN_TEST_GRP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_OPEN_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oopen_group);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(group_id2);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if ((group_id2 = H5Oopen(group_id, OBJECT_OPEN_TEST_GRP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open group '%s' with H5Oopen\n", OBJECT_OPEN_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oopen_group);
|
||
|
}
|
||
|
|
||
|
if (H5Iget_type(group_id2) != H5I_GROUP) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" ID is not a group\n");
|
||
|
PART_ERROR(H5Oopen_group);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(group_id2) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group opened with H5Oopen\n");
|
||
|
PART_ERROR(H5Oopen_group);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_group);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_dset)
|
||
|
{
|
||
|
TESTING_2("H5Oopen on a dataset");
|
||
|
|
||
|
if ((dset_id = H5Dcreate2(group_id, OBJECT_OPEN_TEST_DSET_NAME, dset_dtype, fspace_id,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create dataset '%s'\n", OBJECT_OPEN_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oopen_dset);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Dclose(dset_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if ((dset_id = H5Oopen(group_id, OBJECT_OPEN_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open dataset '%s' with H5Oopen\n", OBJECT_OPEN_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oopen_dset);
|
||
|
}
|
||
|
|
||
|
if (H5Iget_type(dset_id) != H5I_DATASET) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" ID is not a dataset\n");
|
||
|
PART_ERROR(H5Oopen_dset);
|
||
|
}
|
||
|
|
||
|
if (H5Dclose(dset_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close dataset opened with H5Oopen\n");
|
||
|
PART_ERROR(H5Oopen_dset);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_dset);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_dtype)
|
||
|
{
|
||
|
TESTING_2("H5Oopen on a committed datatype");
|
||
|
|
||
|
if ((type_id = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create datatype '%s'\n", OBJECT_OPEN_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oopen_dtype);
|
||
|
}
|
||
|
|
||
|
if (H5Tcommit2(group_id, OBJECT_OPEN_TEST_TYPE_NAME, type_id, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't commit datatype '%s'\n", OBJECT_OPEN_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oopen_dtype);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Tclose(type_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if ((type_id = H5Oopen(group_id, OBJECT_OPEN_TEST_TYPE_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open datatype '%s' with H5Oopen\n", OBJECT_OPEN_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oopen_dtype);
|
||
|
}
|
||
|
|
||
|
if (H5Iget_type(type_id) != H5I_DATATYPE) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" ID is not a dataset\n");
|
||
|
PART_ERROR(H5Oopen_dtype);
|
||
|
}
|
||
|
|
||
|
if (H5Tclose(type_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close committed datatype opened with H5Oopen\n");
|
||
|
PART_ERROR(H5Oopen_dtype);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_dtype);
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(group_id2);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
group_id2 = H5I_INVALID_HID;
|
||
|
}
|
||
|
if (dset_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Dclose(dset_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
dset_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
if (type_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Tclose(type_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
type_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
|
||
|
PART_BEGIN(H5Oopen_by_idx_group)
|
||
|
{
|
||
|
TESTING_2("H5Oopen_by_idx on a group");
|
||
|
|
||
|
if ((group_id2 = H5Oopen_by_idx(container_group, OBJECT_OPEN_TEST_GROUP_NAME, H5_INDEX_NAME,
|
||
|
H5_ITER_INC, 1, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open group '%s' with H5Oopen_by_idx\n", OBJECT_OPEN_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oopen_by_idx_group);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_by_idx_group);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_by_idx_dset)
|
||
|
{
|
||
|
TESTING_2("H5Oopen_by_idx on a dataset");
|
||
|
|
||
|
if ((dset_id = H5Oopen_by_idx(container_group, OBJECT_OPEN_TEST_GROUP_NAME, H5_INDEX_NAME,
|
||
|
H5_ITER_INC, 0, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open dataset '%s' with H5Oopen_by_idx\n", OBJECT_OPEN_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oopen_by_idx_dset);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_by_idx_dset);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_by_idx_dtype)
|
||
|
{
|
||
|
TESTING_2("H5Oopen_by_idx on a committed datatype");
|
||
|
|
||
|
if ((type_id = H5Oopen_by_idx(container_group, OBJECT_OPEN_TEST_GROUP_NAME, H5_INDEX_NAME,
|
||
|
H5_ITER_INC, 2, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open committed datatype '%s' with H5Oopen_by_idx\n",
|
||
|
OBJECT_OPEN_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oopen_by_idx_dtype);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_by_idx_dtype);
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(group_id2);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
group_id2 = H5I_INVALID_HID;
|
||
|
}
|
||
|
if (dset_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Dclose(dset_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
dset_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
if (type_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Tclose(type_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
type_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(fspace_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dset_dtype) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Sclose(fspace_id);
|
||
|
H5Tclose(dset_dtype);
|
||
|
H5Tclose(type_id);
|
||
|
H5Dclose(dset_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that various objects (group, dataset, datatype)
|
||
|
* can't be opened when H5Oopen, H5Oopen_by_idx and H5Oopen_by_addr
|
||
|
* are passed invalid parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_open_object_invalid_params(void)
|
||
|
{
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t gcpl_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object opening with invalid parameters");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, or creation order aren't supported with "
|
||
|
"this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create a GCPL\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't enable link creation order tracking and indexing on GCPL\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_OPEN_INVALID_PARAMS_TEST_GROUP_NAME, H5P_DEFAULT,
|
||
|
gcpl_id, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container sub-group '%s'\n",
|
||
|
OBJECT_OPEN_INVALID_PARAMS_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_OPEN_INVALID_PARAMS_TEST_GRP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_OPEN_INVALID_PARAMS_TEST_GRP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Oopen_invalid_loc_id)
|
||
|
{
|
||
|
TESTING_2("H5Oopen with an invalid location ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen(H5I_INVALID_HID, OBJECT_OPEN_INVALID_PARAMS_TEST_GRP_NAME, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen succeeded with an invalid location ID!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_invalid_loc_id);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_invalid_loc_id);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_invalid_obj_name)
|
||
|
{
|
||
|
TESTING_2("H5Oopen with an invalid object name");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen(group_id, NULL, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen succeeded with a NULL object name!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_invalid_obj_name);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen(group_id, "", H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen succeeded with an invalid object name of ''!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_invalid_obj_name);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_invalid_obj_name);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_invalid_lapl)
|
||
|
{
|
||
|
TESTING_2("H5Oopen with an invalid LAPL");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen(group_id, OBJECT_OPEN_INVALID_PARAMS_TEST_GRP_NAME, H5I_INVALID_HID);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen succeeded with an invalid LAPL!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_invalid_lapl);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_invalid_lapl);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_by_idx_invalid_loc_id)
|
||
|
{
|
||
|
TESTING_2("H5Oopen_by_idx with an invalid location ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen_by_idx(H5I_INVALID_HID, OBJECT_OPEN_INVALID_PARAMS_TEST_GROUP_NAME,
|
||
|
H5_INDEX_NAME, H5_ITER_INC, 0, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen_by_idx succeeded with an invalid location ID!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_by_idx_invalid_loc_id);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_by_idx_invalid_loc_id);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_by_idx_invalid_grp_name)
|
||
|
{
|
||
|
TESTING_2("H5Oopen_by_idx with an invalid group name");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen_by_idx(container_group, NULL, H5_INDEX_NAME, H5_ITER_INC, 0, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen_by_idx succeeded with a NULL group name!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_by_idx_invalid_grp_name);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen_by_idx(container_group, "", H5_INDEX_NAME, H5_ITER_INC, 0, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen_by_idx succeeded with an invalid group name of ''!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_by_idx_invalid_grp_name);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_by_idx_invalid_grp_name);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_by_idx_invalid_index_type)
|
||
|
{
|
||
|
TESTING_2("H5Oopen_by_idx with an invalid index type");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen_by_idx(container_group, OBJECT_OPEN_INVALID_PARAMS_TEST_GROUP_NAME,
|
||
|
H5_INDEX_UNKNOWN, H5_ITER_INC, 0, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen_by_idx succeeded with invalid index type H5_INDEX_UNKNOWN!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_by_idx_invalid_index_type);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen_by_idx(container_group, OBJECT_OPEN_INVALID_PARAMS_TEST_GROUP_NAME,
|
||
|
H5_INDEX_N, H5_ITER_INC, 0, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen_by_idx succeeded with invalid index type H5_INDEX_N!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_by_idx_invalid_index_type);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_by_idx_invalid_index_type);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_by_idx_invalid_iter_order)
|
||
|
{
|
||
|
TESTING_2("H5Oopen_by_idx with an invalid iteration order");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen_by_idx(container_group, OBJECT_OPEN_INVALID_PARAMS_TEST_GROUP_NAME,
|
||
|
H5_INDEX_NAME, H5_ITER_UNKNOWN, 0, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(
|
||
|
" H5Oopen_by_idx succeeded with an invalid iteration ordering H5_ITER_UNKNOWN!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_by_idx_invalid_iter_order);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen_by_idx(container_group, OBJECT_OPEN_INVALID_PARAMS_TEST_GROUP_NAME,
|
||
|
H5_INDEX_NAME, H5_ITER_N, 0, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen_by_idx succeeded with an invalid iteration ordering H5_ITER_N!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_by_idx_invalid_iter_order);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_by_idx_invalid_iter_order);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_by_idx_invalid_lapl)
|
||
|
{
|
||
|
TESTING_2("H5Oopen_by_idx with an invalid LAPL");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen_by_idx(container_group, OBJECT_OPEN_INVALID_PARAMS_TEST_GROUP_NAME,
|
||
|
H5_INDEX_NAME, H5_ITER_INC, 0, H5I_INVALID_HID);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen_by_idx succeeded with an invalid LAPL!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_by_idx_invalid_lapl);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_by_idx_invalid_lapl);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_by_token_invalid_loc_id)
|
||
|
{
|
||
|
TESTING_2("H5Oopen_by_token with an invalid location ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen_by_token(H5I_INVALID_HID, H5O_TOKEN_UNDEF);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen_by_token succeeded with an invalid location ID!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_by_token_invalid_loc_id);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_by_token_invalid_loc_id);
|
||
|
|
||
|
PART_BEGIN(H5Oopen_by_token_invalid_token)
|
||
|
{
|
||
|
TESTING_2("H5Oopen_by_token with an invalid token");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
group_id2 = H5Oopen_by_token(file_id, H5O_TOKEN_UNDEF);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (group_id2 >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oopen_by_token succeeded with an invalid token!\n");
|
||
|
H5Gclose(group_id2);
|
||
|
PART_ERROR(H5Oopen_by_token_invalid_token);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oopen_by_token_invalid_token);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Pclose(gcpl_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Pclose(gcpl_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test for H5Oexists_by_name.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_exists(void)
|
||
|
{
|
||
|
htri_t object_exists;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t dset_id = H5I_INVALID_HID;
|
||
|
hid_t dtype_id = H5I_INVALID_HID;
|
||
|
hid_t fspace_id = H5I_INVALID_HID;
|
||
|
hid_t dset_dtype = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object existence");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_SOFT_LINKS)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, dataset, stored datatype or soft link "
|
||
|
"aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_EXISTS_TEST_SUBGROUP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n", OBJECT_EXISTS_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((fspace_id = generate_random_dataspace(OBJECT_EXISTS_TEST_DSET_SPACE_RANK, NULL, NULL, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((dset_dtype = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
/*
|
||
|
* NOTE: H5Oexists_by_name for hard links should always succeed.
|
||
|
* H5Oexists_by_name for a soft link may fail if the link doesn't resolve.
|
||
|
*/
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Oexists_by_name_group)
|
||
|
{
|
||
|
TESTING_2("H5Oexists_by_name on a group");
|
||
|
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_EXISTS_TEST_GRP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_EXISTS_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_group);
|
||
|
}
|
||
|
|
||
|
if ((object_exists = H5Oexists_by_name(group_id, OBJECT_EXISTS_TEST_GRP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if object '%s' exists\n", OBJECT_EXISTS_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_group);
|
||
|
}
|
||
|
|
||
|
if (!object_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" object '%s' didn't exist!\n", OBJECT_EXISTS_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_group);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(group_id2) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group\n");
|
||
|
PART_ERROR(H5Oexists_by_name_group);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oexists_by_name_group);
|
||
|
|
||
|
PART_BEGIN(H5Oexists_by_name_dset)
|
||
|
{
|
||
|
TESTING_2("H5Oexists_by_name on a dataset");
|
||
|
|
||
|
if ((dset_id = H5Dcreate2(group_id, OBJECT_EXISTS_TEST_DSET_NAME, dset_dtype, fspace_id,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create dataset '%s'\n", OBJECT_EXISTS_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_dset);
|
||
|
}
|
||
|
|
||
|
if ((object_exists = H5Oexists_by_name(group_id, OBJECT_EXISTS_TEST_DSET_NAME, H5P_DEFAULT)) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if object '%s' exists\n", OBJECT_EXISTS_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_dset);
|
||
|
}
|
||
|
|
||
|
if (!object_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" object '%s' didn't exist!\n", OBJECT_EXISTS_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_dset);
|
||
|
}
|
||
|
|
||
|
if (H5Dclose(dset_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close dataset\n");
|
||
|
PART_ERROR(H5Oexists_by_name_dset);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oexists_by_name_dset);
|
||
|
|
||
|
PART_BEGIN(H5Oexists_by_name_dtype)
|
||
|
{
|
||
|
TESTING_2("H5Oexists_by_name on a committed datatype");
|
||
|
|
||
|
if ((dtype_id = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create datatype '%s'\n", OBJECT_EXISTS_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_dtype);
|
||
|
}
|
||
|
|
||
|
if (H5Tcommit2(group_id, OBJECT_EXISTS_TEST_TYPE_NAME, dtype_id, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't commit datatype '%s'\n", OBJECT_EXISTS_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_dtype);
|
||
|
}
|
||
|
|
||
|
if ((object_exists = H5Oexists_by_name(group_id, OBJECT_EXISTS_TEST_TYPE_NAME, H5P_DEFAULT)) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if object '%s' exists\n", OBJECT_EXISTS_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_dtype);
|
||
|
}
|
||
|
|
||
|
if (!object_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" object '%s' didn't exist!\n", OBJECT_EXISTS_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_dtype);
|
||
|
}
|
||
|
|
||
|
if (H5Tclose(dtype_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close datatype\n");
|
||
|
PART_ERROR(H5Oexists_by_name_dtype);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oexists_by_name_dtype);
|
||
|
|
||
|
PART_BEGIN(H5Oexists_by_name_soft_link)
|
||
|
{
|
||
|
TESTING_2("H5Oexists_by_name for a soft link");
|
||
|
|
||
|
if (H5Lcreate_soft("/" OBJECT_TEST_GROUP_NAME "/" OBJECT_EXISTS_TEST_SUBGROUP_NAME, group_id,
|
||
|
OBJECT_EXISTS_TEST_SOFT_LINK_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create soft link '%s'\n", OBJECT_EXISTS_TEST_SOFT_LINK_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_soft_link);
|
||
|
}
|
||
|
|
||
|
if ((object_exists =
|
||
|
H5Oexists_by_name(group_id, OBJECT_EXISTS_TEST_SOFT_LINK_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if object '%s' exists\n", OBJECT_EXISTS_TEST_SOFT_LINK_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_soft_link);
|
||
|
}
|
||
|
|
||
|
if (!object_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" object '%s' didn't exist!\n", OBJECT_EXISTS_TEST_SOFT_LINK_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_soft_link);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oexists_by_name_soft_link);
|
||
|
|
||
|
PART_BEGIN(H5Oexists_by_name_dangling_soft_link)
|
||
|
{
|
||
|
TESTING_2("H5Oexists_by_name for a dangling soft link");
|
||
|
|
||
|
if (H5Lcreate_soft(
|
||
|
"/" OBJECT_TEST_GROUP_NAME "/" OBJECT_EXISTS_TEST_SUBGROUP_NAME "/non_existent_object",
|
||
|
group_id, OBJECT_EXISTS_TEST_DANGLING_LINK_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create soft link '%s'\n", OBJECT_EXISTS_TEST_DANGLING_LINK_NAME);
|
||
|
PART_ERROR(H5Oexists_by_name_dangling_soft_link);
|
||
|
}
|
||
|
|
||
|
if ((object_exists =
|
||
|
H5Oexists_by_name(group_id, OBJECT_EXISTS_TEST_DANGLING_LINK_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if object '%s' exists\n",
|
||
|
"/" OBJECT_TEST_GROUP_NAME "/" OBJECT_EXISTS_TEST_SUBGROUP_NAME
|
||
|
"/non_existent_object");
|
||
|
PART_ERROR(H5Oexists_by_name_dangling_soft_link);
|
||
|
}
|
||
|
|
||
|
if (object_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" object pointed to by dangling soft link should not have existed!\n");
|
||
|
PART_ERROR(H5Oexists_by_name_dangling_soft_link);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oexists_by_name_dangling_soft_link);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(fspace_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dset_dtype) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Sclose(fspace_id);
|
||
|
H5Tclose(dset_dtype);
|
||
|
H5Tclose(dtype_id);
|
||
|
H5Dclose(dset_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that H5Oexists_by_name fails
|
||
|
* when it is passed invalid parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_exists_invalid_params(void)
|
||
|
{
|
||
|
htri_t object_exists;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object existence with invalid parameters");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, or object aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_EXISTS_INVALID_PARAMS_TEST_SUBGROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n",
|
||
|
OBJECT_EXISTS_INVALID_PARAMS_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_EXISTS_INVALID_PARAMS_TEST_GRP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_EXISTS_INVALID_PARAMS_TEST_GRP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Oexists_by_name_invalid_loc_id)
|
||
|
{
|
||
|
TESTING_2("H5Oexists_by_name with an invalid location ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
object_exists = H5Oexists_by_name(H5I_INVALID_HID, OBJECT_EXISTS_INVALID_PARAMS_TEST_GRP_NAME,
|
||
|
H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (object_exists >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oexists_by_name succeeded with an invalid location ID!\n");
|
||
|
PART_ERROR(H5Oexists_by_name_invalid_loc_id);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oexists_by_name_invalid_loc_id);
|
||
|
|
||
|
PART_BEGIN(H5Oexists_by_name_invalid_obj_name)
|
||
|
{
|
||
|
TESTING_2("H5Oexists_by_name with an invalid object name");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
object_exists = H5Oexists_by_name(group_id, NULL, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (object_exists >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oexists_by_name succeeded with a NULL object name!\n");
|
||
|
PART_ERROR(H5Oexists_by_name_invalid_obj_name);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
object_exists = H5Oexists_by_name(group_id, "", H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (object_exists >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oexists_by_name succeeded with an invalid object name of ''!\n");
|
||
|
PART_ERROR(H5Oexists_by_name_invalid_obj_name);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oexists_by_name_invalid_obj_name);
|
||
|
|
||
|
PART_BEGIN(H5Oexists_by_name_invalid_lapl)
|
||
|
{
|
||
|
TESTING_2("H5Oexists_by_name with an invalid LAPL");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
object_exists =
|
||
|
H5Oexists_by_name(group_id, OBJECT_EXISTS_INVALID_PARAMS_TEST_GRP_NAME, H5I_INVALID_HID);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (object_exists >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oexists_by_name succeeded with an invalid LAPL!\n");
|
||
|
PART_ERROR(H5Oexists_by_name_invalid_lapl);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oexists_by_name_invalid_lapl);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test for H5Oget_info(_by_name/_by_idx).
|
||
|
*/
|
||
|
static int
|
||
|
test_get_object_info(void)
|
||
|
{
|
||
|
TESTING("object info retrieval");
|
||
|
|
||
|
SKIPPED();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that an object's info can't be retrieved
|
||
|
* when H5Oget_info(_by_name/_by_idx) are passed invalid
|
||
|
* parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_get_object_info_invalid_params(void)
|
||
|
{
|
||
|
TESTING("object info retrieval with invalid parameters");
|
||
|
|
||
|
SKIPPED();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test for H5Olink.
|
||
|
*/
|
||
|
static int
|
||
|
test_link_object(void)
|
||
|
{
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t dset_id = H5I_INVALID_HID;
|
||
|
hid_t dset_dtype = H5I_INVALID_HID;
|
||
|
hid_t type_id = H5I_INVALID_HID;
|
||
|
hid_t fspace_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object linking");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, dataset, or stored datatype aren't "
|
||
|
"supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_LINK_TEST_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container sub-group '%s'\n", OBJECT_LINK_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((fspace_id = generate_random_dataspace(OBJECT_LINK_TEST_SPACE_RANK, NULL, NULL, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((dset_dtype = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Olink_group)
|
||
|
{
|
||
|
TESTING_2("H5Olink an anonymous group");
|
||
|
|
||
|
if ((group_id2 = H5Gcreate_anon(group_id, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create an anonymous group\n");
|
||
|
PART_ERROR(H5Olink_group);
|
||
|
}
|
||
|
|
||
|
if (H5Olink(group_id2, group_id, OBJECT_LINK_TEST_GROUP_NAME2, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't link the anonymous group\n");
|
||
|
PART_ERROR(H5Olink_group);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Olink_group);
|
||
|
|
||
|
PART_BEGIN(H5Olink_dataset)
|
||
|
{
|
||
|
TESTING_2("H5Olink an anonymous dataset");
|
||
|
|
||
|
if ((dset_id = H5Dcreate_anon(group_id, dset_dtype, fspace_id, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create an anonymous dataset\n");
|
||
|
PART_ERROR(H5Olink_dataset);
|
||
|
}
|
||
|
|
||
|
if (H5Olink(dset_id, group_id, OBJECT_LINK_TEST_DSET_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't link the anonymous dataset\n");
|
||
|
PART_ERROR(H5Olink_dataset);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Olink_dataset);
|
||
|
|
||
|
PART_BEGIN(H5Olink_datatype)
|
||
|
{
|
||
|
TESTING_2("H5Olink an anonymous datatype");
|
||
|
|
||
|
if (H5Tcommit_anon(group_id, dset_dtype, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create an anonymous datatype\n");
|
||
|
PART_ERROR(H5Olink_datatype);
|
||
|
}
|
||
|
|
||
|
if (H5Olink(dset_dtype, group_id, OBJECT_LINK_TEST_DTYPE_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't link the anonymous datatype\n");
|
||
|
PART_ERROR(H5Olink_datatype);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Olink_datatype);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(fspace_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dset_dtype) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Dclose(dset_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Sclose(fspace_id);
|
||
|
H5Tclose(dset_dtype);
|
||
|
H5Tclose(type_id);
|
||
|
H5Dclose(dset_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that an object can't be linked into
|
||
|
* the file structure when H5Olink is passed invalid
|
||
|
* parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_link_object_invalid_params(void)
|
||
|
{
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
herr_t status;
|
||
|
|
||
|
TESTING_MULTIPART("object linking with invalid parameters");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, or object aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_LINK_INVALID_PARAMS_TEST_GROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container sub-group '%s'\n", OBJECT_LINK_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id2 = H5Gcreate_anon(group_id, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create an anonymous group\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Olink_invalid_object_id)
|
||
|
{
|
||
|
TESTING_2("H5Olink with an invalid object ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status = H5Olink(H5I_INVALID_HID, group_id, OBJECT_LINK_TEST_GROUP_NAME2, H5P_DEFAULT,
|
||
|
H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Olink succeeded with an invalid object ID!\n");
|
||
|
PART_ERROR(H5Olink_invalid_object_id);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Olink_invalid_object_id);
|
||
|
|
||
|
PART_BEGIN(H5Olink_invalid_location)
|
||
|
{
|
||
|
TESTING_2("H5Olink with an invalid location ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status = H5Olink(group_id2, H5I_INVALID_HID, OBJECT_LINK_TEST_GROUP_NAME2, H5P_DEFAULT,
|
||
|
H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Olink succeeded with an invalid location ID!\n");
|
||
|
PART_ERROR(H5Olink_invalid_location);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Olink_invalid_location);
|
||
|
|
||
|
PART_BEGIN(H5Olink_invalid_name)
|
||
|
{
|
||
|
TESTING_2("H5Olink with an invalid name");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status = H5Olink(group_id2, group_id, NULL, H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Olink succeeded with NULL as the object name!\n");
|
||
|
PART_ERROR(H5Olink_invalid_name);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status = H5Olink(group_id2, group_id, "", H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Olink succeeded with an invalid object name of ''!\n");
|
||
|
PART_ERROR(H5Olink_invalid_name);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Olink_invalid_name);
|
||
|
|
||
|
PART_BEGIN(H5Olink_invalid_lcpl)
|
||
|
{
|
||
|
TESTING_2("H5Olink with an invalid LCPL");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status =
|
||
|
H5Olink(group_id2, group_id, OBJECT_LINK_TEST_GROUP_NAME2, H5I_INVALID_HID, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Olink succeeded with an invalid LCPL!\n");
|
||
|
PART_ERROR(H5Olink_invalid_lcpl);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Olink_invalid_lcpl);
|
||
|
|
||
|
PART_BEGIN(H5Olink_invalid_lapl)
|
||
|
{
|
||
|
TESTING_2("H5Olink with an invalid LAPL");
|
||
|
#ifndef NO_INVALID_PROPERTY_LIST_TESTS
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status =
|
||
|
H5Olink(group_id2, group_id, OBJECT_LINK_TEST_GROUP_NAME2, H5P_DEFAULT, H5I_INVALID_HID);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Olink succeeded with an invalid LAPL!\n");
|
||
|
PART_ERROR(H5Olink_invalid_lapl);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
#else
|
||
|
SKIPPED();
|
||
|
PART_EMPTY(H5Olink_invalid_lapl);
|
||
|
#endif
|
||
|
}
|
||
|
PART_END(H5Olink_invalid_lapl);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test for H5Oincr_refcount/H5Odecr_refcount.
|
||
|
*/
|
||
|
static int
|
||
|
test_incr_decr_object_refcount(void)
|
||
|
{
|
||
|
H5O_info2_t oinfo; /* Object info struct */
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t dset_id = H5I_INVALID_HID;
|
||
|
hid_t fspace_id = H5I_INVALID_HID;
|
||
|
hid_t dset_dtype = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("increment/decrement the reference count of object");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_MORE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, dataset, stored datatype, basic or more object "
|
||
|
"aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_REF_COUNT_TEST_SUBGROUP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n", OBJECT_REF_COUNT_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((fspace_id = generate_random_dataspace(OBJECT_REF_COUNT_TEST_DSET_SPACE_RANK, NULL, NULL, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((dset_dtype = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Oincr_decr_refcount_group)
|
||
|
{
|
||
|
TESTING_2("H5Oincr_refcount/H5Odecr_refcount on a group");
|
||
|
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_REF_COUNT_TEST_GRP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_REF_COUNT_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_group);
|
||
|
}
|
||
|
|
||
|
/* Increment the reference count */
|
||
|
if (H5Oincr_refcount(group_id2) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't increment reference count for the group '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_group);
|
||
|
}
|
||
|
|
||
|
/* Verify that reference count is 2 now */
|
||
|
if (H5Oget_info_by_name3(group_id, OBJECT_REF_COUNT_TEST_GRP_NAME, &oinfo, H5O_INFO_BASIC,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't get reference count for the group '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_group);
|
||
|
}
|
||
|
|
||
|
if (oinfo.rc != 2) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" the reference count for the group '%s' isn't 2: %d\n",
|
||
|
OBJECT_REF_COUNT_TEST_GRP_NAME, oinfo.rc);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_group);
|
||
|
}
|
||
|
|
||
|
/* Decrement the reference count */
|
||
|
if (H5Odecr_refcount(group_id2) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't decrement reference count for the group '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_group);
|
||
|
}
|
||
|
|
||
|
/* Verify that reference count is 1 now */
|
||
|
if (H5Oget_info_by_name3(group_id, OBJECT_REF_COUNT_TEST_GRP_NAME, &oinfo, H5O_INFO_BASIC,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't get reference count for the group '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_group);
|
||
|
}
|
||
|
|
||
|
if (oinfo.rc != 1) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" the reference count for the group '%s' isn't 1: %d\n",
|
||
|
OBJECT_REF_COUNT_TEST_GRP_NAME, oinfo.rc);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_group);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(group_id2) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group\n");
|
||
|
PART_ERROR(H5Oincr_decr_refcount_group);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oincr_decr_refcount_group);
|
||
|
|
||
|
PART_BEGIN(H5Oincr_decr_refcount_dset)
|
||
|
{
|
||
|
TESTING_2("H5Oincr_refcount/H5Odecr_refcount on a dataset");
|
||
|
|
||
|
if ((dset_id = H5Dcreate2(group_id, OBJECT_REF_COUNT_TEST_DSET_NAME, dset_dtype, fspace_id,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create dataset '%s'\n", OBJECT_REF_COUNT_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dset);
|
||
|
}
|
||
|
|
||
|
/* Increment the reference count */
|
||
|
if (H5Oincr_refcount(dset_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't increment reference count for the dataset '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dset);
|
||
|
}
|
||
|
|
||
|
/* Verify that reference count is 2 now */
|
||
|
if (H5Oget_info_by_name3(group_id, OBJECT_REF_COUNT_TEST_DSET_NAME, &oinfo, H5O_INFO_BASIC,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't get reference count for the dataset '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dset);
|
||
|
}
|
||
|
|
||
|
if (oinfo.rc != 2) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" the reference count for the dataset '%s' isn't 2: %d\n",
|
||
|
OBJECT_REF_COUNT_TEST_DSET_NAME, oinfo.rc);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dset);
|
||
|
}
|
||
|
|
||
|
/* Decrement the reference count */
|
||
|
if (H5Odecr_refcount(dset_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't decrement reference count for the dataset '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dset);
|
||
|
}
|
||
|
|
||
|
/* Verify that reference count is 1 now */
|
||
|
if (H5Oget_info_by_name3(group_id, OBJECT_REF_COUNT_TEST_DSET_NAME, &oinfo, H5O_INFO_BASIC,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't get reference count for the dataset '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dset);
|
||
|
}
|
||
|
|
||
|
if (oinfo.rc != 1) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" the reference count for the dataset '%s' isn't 1: %d\n",
|
||
|
OBJECT_REF_COUNT_TEST_DSET_NAME, oinfo.rc);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dset);
|
||
|
}
|
||
|
|
||
|
if (H5Dclose(dset_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close dataset\n");
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dset);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oincr_decr_refcount_dset);
|
||
|
|
||
|
PART_BEGIN(H5Oincr / decr_refcount_dtype)
|
||
|
{
|
||
|
TESTING_2("H5Oincr_refcount/H5Odecr_refcount on a committed datatype");
|
||
|
|
||
|
if (H5Tcommit2(group_id, OBJECT_REF_COUNT_TEST_TYPE_NAME, dset_dtype, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't commit datatype '%s'\n", OBJECT_REF_COUNT_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dtype);
|
||
|
}
|
||
|
|
||
|
/* Increment the reference count */
|
||
|
if (H5Oincr_refcount(dset_dtype) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't increment reference count for the datatype '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dtype);
|
||
|
}
|
||
|
|
||
|
/* Verify that reference count is 2 now */
|
||
|
if (H5Oget_info_by_name3(group_id, OBJECT_REF_COUNT_TEST_TYPE_NAME, &oinfo, H5O_INFO_BASIC,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't get reference count for the datatype '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dtype);
|
||
|
}
|
||
|
|
||
|
if (oinfo.rc != 2) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" the reference count for the datatype '%s' isn't 2: %d\n",
|
||
|
OBJECT_REF_COUNT_TEST_TYPE_NAME, oinfo.rc);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dtype);
|
||
|
}
|
||
|
|
||
|
/* Decrement the reference count */
|
||
|
if (H5Odecr_refcount(dset_dtype) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't decrement reference count for the datatype '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dtype);
|
||
|
}
|
||
|
|
||
|
/* Verify that reference count is 1 now */
|
||
|
if (H5Oget_info_by_name3(group_id, OBJECT_REF_COUNT_TEST_TYPE_NAME, &oinfo, H5O_INFO_BASIC,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't get reference count for the datatype '%s' \n",
|
||
|
OBJECT_REF_COUNT_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dtype);
|
||
|
}
|
||
|
|
||
|
if (oinfo.rc != 1) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" the reference count for the datatype '%s' isn't 1: %d\n",
|
||
|
OBJECT_REF_COUNT_TEST_TYPE_NAME, oinfo.rc);
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dtype);
|
||
|
}
|
||
|
|
||
|
if (H5Tclose(dset_dtype) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close datatype\n");
|
||
|
PART_ERROR(H5Oincr_decr_refcount_dtype);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oincr_decr_refcount_dtype);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(fspace_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Sclose(fspace_id);
|
||
|
H5Tclose(dset_dtype);
|
||
|
H5Dclose(dset_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
} /* test_incr_decr_object_refcount */
|
||
|
|
||
|
/*
|
||
|
* A test to check that H5Oincr_refcount/H5Odecr_refcount
|
||
|
* fail when passed invalid parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_incr_decr_object_refcount_invalid_params(void)
|
||
|
{
|
||
|
herr_t status;
|
||
|
|
||
|
TESTING_MULTIPART("object reference count incr./decr. with an invalid parameter");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_MORE)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for more object aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Oincr_refcount_invalid_param)
|
||
|
{
|
||
|
TESTING_2("H5Oincr_refcount with invalid object ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status = H5Oincr_refcount(H5I_INVALID_HID);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" incremented the reference count for an invalid object ID\n");
|
||
|
PART_ERROR(H5Oincr_refcount_invalid_param);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oincr_refcount_invalid_param);
|
||
|
|
||
|
PART_BEGIN(H5Odecr_refcount_invalid_param)
|
||
|
{
|
||
|
TESTING_2("H5Odecr_refcount with invalid object ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status = H5Odecr_refcount(H5I_INVALID_HID);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" decremented the reference count for an invalid object ID\n");
|
||
|
PART_ERROR(H5Odecr_refcount_invalid_param);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Odecr_refcount_invalid_param);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Basic tests for H5Ocopy.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_copy_basic(void)
|
||
|
{
|
||
|
H5O_info2_t object_info;
|
||
|
H5G_info_t group_info;
|
||
|
htri_t object_link_exists;
|
||
|
size_t i;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID;
|
||
|
hid_t group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t tmp_group_id = H5I_INVALID_HID;
|
||
|
hid_t dset_id = H5I_INVALID_HID;
|
||
|
hid_t tmp_dset_id = H5I_INVALID_HID;
|
||
|
hid_t dtype_id = H5I_INVALID_HID;
|
||
|
hid_t tmp_dtype_id = H5I_INVALID_HID;
|
||
|
hid_t tmp_attr_id = H5I_INVALID_HID;
|
||
|
hid_t dset_dtype = H5I_INVALID_HID;
|
||
|
hid_t attr_space_id = H5I_INVALID_HID;
|
||
|
hid_t space_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("basic object copying");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_MORE) || !(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, link, dataset, attribute, iterate, or "
|
||
|
"stored datatype aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_COPY_BASIC_TEST_SUBGROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n", OBJECT_COPY_BASIC_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((space_id = generate_random_dataspace(OBJECT_COPY_BASIC_TEST_SPACE_RANK, NULL, NULL, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
if ((attr_space_id = generate_random_dataspace(OBJECT_COPY_BASIC_TEST_SPACE_RANK, NULL, NULL, TRUE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((dset_dtype = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
/* Create the test group object, along with its nested members and the attributes attached to it. */
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_COPY_BASIC_TEST_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_COPY_BASIC_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_BASIC_TEST_NUM_NESTED_OBJS; i++) {
|
||
|
char grp_name[OBJECT_COPY_BASIC_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(grp_name, OBJECT_COPY_BASIC_TEST_BUF_SIZE, "grp%d", (int)i);
|
||
|
|
||
|
if ((tmp_group_id = H5Gcreate2(group_id2, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s' under group '%s'\n", grp_name,
|
||
|
OBJECT_COPY_BASIC_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create a further nested group under the last group added */
|
||
|
if (i == (OBJECT_COPY_BASIC_TEST_NUM_NESTED_OBJS - 1)) {
|
||
|
if (H5Gclose(H5Gcreate2(tmp_group_id, OBJECT_COPY_BASIC_TEST_DEEP_NESTED_GROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create nested group '%s' under group '%s'\n",
|
||
|
OBJECT_COPY_BASIC_TEST_DEEP_NESTED_GROUP_NAME, grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group '%s'\n", grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_BASIC_TEST_NUM_ATTRS; i++) {
|
||
|
char attr_name[OBJECT_COPY_BASIC_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(attr_name, OBJECT_COPY_BASIC_TEST_BUF_SIZE, "attr%d", (int)i);
|
||
|
|
||
|
if ((tmp_attr_id = H5Acreate2(group_id2, attr_name, H5T_NATIVE_INT, attr_space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create attribute '%s' on group '%s'\n", attr_name,
|
||
|
OBJECT_COPY_BASIC_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Aclose(tmp_attr_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close attribute '%s'\n", attr_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Create the test dataset object, along with the attributes attached to it. */
|
||
|
if ((dset_id = H5Dcreate2(group_id, OBJECT_COPY_BASIC_TEST_DSET_NAME, dset_dtype, space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create dataset '%s'\n", OBJECT_COPY_BASIC_TEST_DSET_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_BASIC_TEST_NUM_ATTRS; i++) {
|
||
|
char attr_name[OBJECT_COPY_BASIC_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(attr_name, OBJECT_COPY_BASIC_TEST_BUF_SIZE, "attr%d", (int)i);
|
||
|
|
||
|
if ((tmp_attr_id = H5Acreate2(dset_id, attr_name, H5T_NATIVE_INT, attr_space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create attribute '%s' on dataset '%s'\n", attr_name,
|
||
|
OBJECT_COPY_BASIC_TEST_DSET_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Aclose(tmp_attr_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close attribute '%s'\n", attr_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Create the test committed datatype object, along with the attributes attached to it. */
|
||
|
if ((dtype_id = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create datatype\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Tcommit2(group_id, OBJECT_COPY_BASIC_TEST_DTYPE_NAME, dtype_id, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't commit datatype '%s'\n", OBJECT_COPY_BASIC_TEST_DTYPE_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_BASIC_TEST_NUM_ATTRS; i++) {
|
||
|
char attr_name[OBJECT_COPY_BASIC_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(attr_name, OBJECT_COPY_BASIC_TEST_BUF_SIZE, "attr%d", (int)i);
|
||
|
|
||
|
if ((tmp_attr_id = H5Acreate2(dtype_id, attr_name, H5T_NATIVE_INT, attr_space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create attribute '%s' on committed datatype '%s'\n", attr_name,
|
||
|
OBJECT_COPY_BASIC_TEST_DTYPE_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Aclose(tmp_attr_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close attribute '%s'\n", attr_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Ocopy_group)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on a group (default copy options)");
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_BASIC_TEST_GROUP_NAME, group_id,
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy group '%s' to '%s'\n", OBJECT_COPY_BASIC_TEST_GROUP_NAME,
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(group_id, OBJECT_COPY_BASIC_TEST_NEW_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied group exists\n",
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied group didn't exist!\n",
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the new group has all the members of the copied group, and all its attributes */
|
||
|
if ((tmp_group_id = H5Gopen2(group_id, OBJECT_COPY_BASIC_TEST_NEW_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open group copy '%s'\n", OBJECT_COPY_BASIC_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
memset(&group_info, 0, sizeof(group_info));
|
||
|
|
||
|
/*
|
||
|
* Set link count to zero in case the connector doesn't support
|
||
|
* retrieval of group info.
|
||
|
*/
|
||
|
group_info.nlinks = 0;
|
||
|
|
||
|
if (H5Gget_info(tmp_group_id, &group_info) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve group info\n");
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
if (group_info.nlinks != OBJECT_COPY_BASIC_TEST_NUM_NESTED_OBJS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group contained %d members instead of %d members after a deep copy!\n",
|
||
|
(int)group_info.nlinks, OBJECT_COPY_BASIC_TEST_NUM_NESTED_OBJS);
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
memset(&object_info, 0, sizeof(object_info));
|
||
|
|
||
|
/*
|
||
|
* Set attribute count to zero in case the connector doesn't
|
||
|
* support retrieval of object info.
|
||
|
*/
|
||
|
object_info.num_attrs = 0;
|
||
|
|
||
|
if (H5Oget_info3(tmp_group_id, &object_info, H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve object info\n");
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
if (object_info.num_attrs == 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group didn't contain any attributes after copy operation!\n");
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
/* Check the attribute names, types, etc. */
|
||
|
i = 0;
|
||
|
if (H5Aiterate2(tmp_group_id, H5_INDEX_NAME, H5_ITER_INC, NULL,
|
||
|
object_copy_attribute_iter_callback, &i) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to iterate over copied group's attributes\n");
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_COPY_BASIC_TEST_NUM_ATTRS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(
|
||
|
" number of attributes on copied group (%llu) didn't match expected number (%llu)!\n",
|
||
|
(unsigned long long)i, (unsigned long long)OBJECT_COPY_BASIC_TEST_NUM_ATTRS);
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close group copy\n");
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Ensure that the last immediate member of the copied group
|
||
|
* contains its single member after the deep copy.
|
||
|
*/
|
||
|
{
|
||
|
char grp_name[OBJECT_COPY_BASIC_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(grp_name, OBJECT_COPY_BASIC_TEST_BUF_SIZE,
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_GROUP_NAME "/grp%d",
|
||
|
OBJECT_COPY_BASIC_TEST_NUM_NESTED_OBJS - 1);
|
||
|
|
||
|
if ((tmp_group_id = H5Gopen2(group_id, grp_name, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open group '%s'\n",
|
||
|
OBJECT_COPY_BASIC_TEST_DEEP_NESTED_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
memset(&group_info, 0, sizeof(group_info));
|
||
|
|
||
|
/*
|
||
|
* Set link count to zero in case the connector doesn't support
|
||
|
* retrieval of group info.
|
||
|
*/
|
||
|
group_info.nlinks = 0;
|
||
|
|
||
|
if (H5Gget_info(tmp_group_id, &group_info) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve group info\n");
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
if (group_info.nlinks != 1) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group's immediate members didn't contain nested members after a "
|
||
|
"deep copy!\n");
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close group '%s'\n",
|
||
|
OBJECT_COPY_BASIC_TEST_DEEP_NESTED_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_group);
|
||
|
|
||
|
if (tmp_group_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(tmp_group_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_group_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_dset)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on a dataset (default copy options)");
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_BASIC_TEST_DSET_NAME, group_id,
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_DSET_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy dataset '%s' to '%s'\n", OBJECT_COPY_BASIC_TEST_DSET_NAME,
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(group_id, OBJECT_COPY_BASIC_TEST_NEW_DSET_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied dataset exists\n",
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied dataset didn't exist!\n",
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the new dataset has all of the attributes of the copied dataset */
|
||
|
if ((tmp_dset_id = H5Dopen2(group_id, OBJECT_COPY_BASIC_TEST_NEW_DSET_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open dataset copy '%s'\n", OBJECT_COPY_BASIC_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset);
|
||
|
}
|
||
|
|
||
|
memset(&object_info, 0, sizeof(object_info));
|
||
|
|
||
|
/*
|
||
|
* Set attribute count to zero in case the connector doesn't
|
||
|
* support retrieval of object info.
|
||
|
*/
|
||
|
object_info.num_attrs = 0;
|
||
|
|
||
|
if (H5Oget_info3(tmp_dset_id, &object_info, H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve object info\n");
|
||
|
PART_ERROR(H5Ocopy_dset);
|
||
|
}
|
||
|
|
||
|
if (object_info.num_attrs == 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied dataset didn't contain any attributes after copy operation!\n");
|
||
|
PART_ERROR(H5Ocopy_dset);
|
||
|
}
|
||
|
|
||
|
/* Check the attribute names, types, etc. */
|
||
|
i = 0;
|
||
|
if (H5Aiterate2(tmp_dset_id, H5_INDEX_NAME, H5_ITER_INC, NULL,
|
||
|
object_copy_attribute_iter_callback, &i) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to iterate over copied dataset's attributes\n");
|
||
|
PART_ERROR(H5Ocopy_dset);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_COPY_BASIC_TEST_NUM_ATTRS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" number of attributes on copied dataset (%llu) didn't match expected number "
|
||
|
"(%llu)!\n",
|
||
|
(unsigned long long)i, (unsigned long long)OBJECT_COPY_BASIC_TEST_NUM_ATTRS);
|
||
|
PART_ERROR(H5Ocopy_dset);
|
||
|
}
|
||
|
|
||
|
if (H5Dclose(tmp_dset_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close dataset copy\n");
|
||
|
PART_ERROR(H5Ocopy_dset);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_dset);
|
||
|
|
||
|
if (tmp_dset_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Dclose(tmp_dset_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_dset_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_dtype)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on a committed datatype (default copy options)");
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_BASIC_TEST_DTYPE_NAME, group_id,
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_DTYPE_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy datatype '%s' to '%s'\n", OBJECT_COPY_BASIC_TEST_DTYPE_NAME,
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(group_id, OBJECT_COPY_BASIC_TEST_NEW_DTYPE_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied datatype exists\n",
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied datatype didn't exist!\n",
|
||
|
OBJECT_COPY_BASIC_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the new committed datatype has all the attributes of the copied datatype */
|
||
|
if ((tmp_dtype_id = H5Topen2(group_id, OBJECT_COPY_BASIC_TEST_NEW_DTYPE_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open datatype copy '%s'\n", OBJECT_COPY_BASIC_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype);
|
||
|
}
|
||
|
|
||
|
memset(&object_info, 0, sizeof(object_info));
|
||
|
|
||
|
/*
|
||
|
* Set attribute count to zero in case the connector doesn't
|
||
|
* support retrieval of object info.
|
||
|
*/
|
||
|
object_info.num_attrs = 0;
|
||
|
|
||
|
if (H5Oget_info3(tmp_dtype_id, &object_info, H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve object info\n");
|
||
|
PART_ERROR(H5Ocopy_dtype);
|
||
|
}
|
||
|
|
||
|
if (object_info.num_attrs == 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(
|
||
|
" copied committed datatype didn't contain any attributes after copy operation!\n");
|
||
|
PART_ERROR(H5Ocopy_dtype);
|
||
|
}
|
||
|
|
||
|
/* Check the attribute names, types, etc. */
|
||
|
i = 0;
|
||
|
if (H5Aiterate2(tmp_dtype_id, H5_INDEX_NAME, H5_ITER_INC, NULL,
|
||
|
object_copy_attribute_iter_callback, &i) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to iterate over copied datatype's attributes\n");
|
||
|
PART_ERROR(H5Ocopy_dtype);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_COPY_BASIC_TEST_NUM_ATTRS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" number of attributes on copied datatype (%llu) didn't match expected number "
|
||
|
"(%llu)!\n",
|
||
|
(unsigned long long)i, (unsigned long long)OBJECT_COPY_BASIC_TEST_NUM_ATTRS);
|
||
|
PART_ERROR(H5Ocopy_dtype);
|
||
|
}
|
||
|
|
||
|
if (H5Tclose(tmp_dtype_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close datatype copy\n");
|
||
|
PART_ERROR(H5Ocopy_dtype);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_dtype);
|
||
|
|
||
|
if (tmp_dtype_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Tclose(tmp_dtype_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_dtype_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(attr_space_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Sclose(space_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dset_dtype) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dtype_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Dclose(dset_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Sclose(attr_space_id);
|
||
|
H5Sclose(space_id);
|
||
|
H5Aclose(tmp_attr_id);
|
||
|
H5Tclose(dset_dtype);
|
||
|
H5Tclose(tmp_dtype_id);
|
||
|
H5Tclose(dtype_id);
|
||
|
H5Dclose(tmp_dset_id);
|
||
|
H5Dclose(dset_id);
|
||
|
H5Gclose(tmp_group_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Tests to ensure that H5Ocopy fails when attempting to copy
|
||
|
* an object to a destination where the object already exists.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_copy_already_existing(void)
|
||
|
{
|
||
|
herr_t err_ret;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID;
|
||
|
hid_t group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t dset_id = H5I_INVALID_HID;
|
||
|
hid_t dtype_id = H5I_INVALID_HID;
|
||
|
hid_t dset_dtype = H5I_INVALID_HID;
|
||
|
hid_t space_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object copying to location where objects already exist");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_MORE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, dataset, or stored datatype aren't "
|
||
|
"supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_COPY_ALREADY_EXISTING_TEST_SUBGROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n",
|
||
|
OBJECT_COPY_ALREADY_EXISTING_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((space_id =
|
||
|
generate_random_dataspace(OBJECT_COPY_ALREADY_EXISTING_TEST_SPACE_RANK, NULL, NULL, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
if ((dset_dtype = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
/* Create the test group object */
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_COPY_ALREADY_EXISTING_TEST_GROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_COPY_ALREADY_EXISTING_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create the test dataset object */
|
||
|
if ((dset_id = H5Dcreate2(group_id, OBJECT_COPY_ALREADY_EXISTING_TEST_DSET_NAME, dset_dtype, space_id,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create dataset '%s'\n", OBJECT_COPY_ALREADY_EXISTING_TEST_DSET_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create the test committed datatype object */
|
||
|
if ((dtype_id = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create datatype\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Tcommit2(group_id, OBJECT_COPY_ALREADY_EXISTING_TEST_DTYPE_NAME, dtype_id, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't commit datatype '%s'\n", OBJECT_COPY_ALREADY_EXISTING_TEST_DTYPE_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Ocopy_already_existing_group)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy group to location where group already exists");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(group_id, OBJECT_COPY_ALREADY_EXISTING_TEST_GROUP_NAME, group_id,
|
||
|
OBJECT_COPY_ALREADY_EXISTING_TEST_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" group copy succeeded in location where group already exists!\n");
|
||
|
PART_ERROR(H5Ocopy_already_existing_group);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_already_existing_group);
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_already_existing_dset)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy dataset to location where dataset already exists");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(group_id, OBJECT_COPY_ALREADY_EXISTING_TEST_DSET_NAME, group_id,
|
||
|
OBJECT_COPY_ALREADY_EXISTING_TEST_DSET_NAME, H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" dataset copy succeeded in location where dataset already exists!\n");
|
||
|
PART_ERROR(H5Ocopy_already_existing_dset);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_already_existing_dset);
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_already_existing_dtype)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy committed datatype to location where committed datatype already exists");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(group_id, OBJECT_COPY_ALREADY_EXISTING_TEST_DTYPE_NAME, group_id,
|
||
|
OBJECT_COPY_ALREADY_EXISTING_TEST_DTYPE_NAME, H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" committed datatype copy succeeded in location where committed datatype already "
|
||
|
"exists!\n");
|
||
|
PART_ERROR(H5Ocopy_already_existing_dtype);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_already_existing_dtype);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(space_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dset_dtype) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dtype_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Dclose(dset_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Sclose(space_id);
|
||
|
H5Tclose(dset_dtype);
|
||
|
H5Tclose(dtype_id);
|
||
|
H5Dclose(dset_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to exercise the H5O_COPY_SHALLOW_HIERARCHY_FLAG flag
|
||
|
* for H5Ocopy.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_copy_shallow_group_copy(void)
|
||
|
{
|
||
|
H5G_info_t group_info;
|
||
|
htri_t object_link_exists;
|
||
|
size_t i;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID;
|
||
|
hid_t group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t tmp_group_id = H5I_INVALID_HID;
|
||
|
hid_t ocpypl_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING("object copying with H5O_COPY_SHALLOW_HIERARCHY_FLAG flag");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_MORE) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_BASIC)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, or link aren't supported with this "
|
||
|
"connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_COPY_SHALLOW_TEST_SUBGROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n", OBJECT_COPY_SHALLOW_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create the test group object, along with its nested members. */
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_COPY_SHALLOW_TEST_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_COPY_SHALLOW_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_SHALLOW_TEST_NUM_NESTED_OBJS; i++) {
|
||
|
char grp_name[OBJECT_COPY_SHALLOW_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(grp_name, OBJECT_COPY_SHALLOW_TEST_BUF_SIZE, "grp%d", (int)i);
|
||
|
|
||
|
if ((tmp_group_id = H5Gcreate2(group_id2, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s' under group '%s'\n", grp_name,
|
||
|
OBJECT_COPY_SHALLOW_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create a further nested group under the last group added */
|
||
|
if (i == (OBJECT_COPY_SHALLOW_TEST_NUM_NESTED_OBJS - 1)) {
|
||
|
if (H5Gclose(H5Gcreate2(tmp_group_id, OBJECT_COPY_SHALLOW_TEST_DEEP_NESTED_GROUP_NAME,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create nested group '%s' under group '%s'\n",
|
||
|
OBJECT_COPY_SHALLOW_TEST_DEEP_NESTED_GROUP_NAME, grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group '%s'\n", grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ((ocpypl_id = H5Pcreate(H5P_OBJECT_COPY)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create OCopyPL\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Pset_copy_object(ocpypl_id, H5O_COPY_SHALLOW_HIERARCHY_FLAG) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't set object copying options\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_SHALLOW_TEST_GROUP_NAME, group_id,
|
||
|
OBJECT_COPY_SHALLOW_TEST_NEW_GROUP_NAME, ocpypl_id, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy group '%s' to '%s'\n", OBJECT_COPY_SHALLOW_TEST_GROUP_NAME,
|
||
|
OBJECT_COPY_SHALLOW_TEST_NEW_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists = H5Lexists(group_id, OBJECT_COPY_SHALLOW_TEST_NEW_GROUP_NAME, H5P_DEFAULT)) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied group exists\n",
|
||
|
OBJECT_COPY_SHALLOW_TEST_NEW_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied group didn't exist!\n", OBJECT_COPY_SHALLOW_TEST_NEW_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Ensure that the new group has only the immediate members of the copied group.
|
||
|
*/
|
||
|
if ((tmp_group_id = H5Gopen2(group_id, OBJECT_COPY_SHALLOW_TEST_NEW_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open group copy '%s'\n", OBJECT_COPY_SHALLOW_TEST_NEW_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
memset(&group_info, 0, sizeof(group_info));
|
||
|
|
||
|
/*
|
||
|
* Set link count to zero in case the connector doesn't support
|
||
|
* retrieval of group info.
|
||
|
*/
|
||
|
group_info.nlinks = 0;
|
||
|
|
||
|
if (H5Gget_info(tmp_group_id, &group_info) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve group info\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (group_info.nlinks != OBJECT_COPY_SHALLOW_TEST_NUM_NESTED_OBJS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group contained %d members instead of %d members after a shallow copy!\n",
|
||
|
(int)group_info.nlinks, OBJECT_COPY_SHALLOW_TEST_NUM_NESTED_OBJS);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
/*
|
||
|
* Ensure that the last immediate member of the copied group doesn't
|
||
|
* contain any members after the shallow copy.
|
||
|
*/
|
||
|
{
|
||
|
char grp_name[OBJECT_COPY_SHALLOW_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(grp_name, OBJECT_COPY_SHALLOW_TEST_BUF_SIZE,
|
||
|
OBJECT_COPY_SHALLOW_TEST_NEW_GROUP_NAME "/grp%d",
|
||
|
OBJECT_COPY_SHALLOW_TEST_NUM_NESTED_OBJS - 1);
|
||
|
|
||
|
if ((tmp_group_id = H5Gopen2(group_id, grp_name, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open group '%s'\n", grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
memset(&group_info, 0, sizeof(group_info));
|
||
|
|
||
|
/*
|
||
|
* Set link count to non-zero in case the connector doesn't support
|
||
|
* retrieval of group info.
|
||
|
*/
|
||
|
group_info.nlinks = 1;
|
||
|
|
||
|
if (H5Gget_info(tmp_group_id, &group_info) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve group info\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (group_info.nlinks != 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group's immediate members contained nested members after a shallow copy!\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close group '%s'\n", grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (H5Pclose(ocpypl_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Pclose(ocpypl_id);
|
||
|
H5Gclose(tmp_group_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Tests to exercise the H5O_COPY_WITHOUT_ATTR_FLAG flag
|
||
|
* of H5Ocopy.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_copy_no_attributes(void)
|
||
|
{
|
||
|
H5O_info2_t object_info;
|
||
|
htri_t object_link_exists;
|
||
|
size_t i;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID;
|
||
|
hid_t group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t tmp_group_id = H5I_INVALID_HID;
|
||
|
hid_t dset_id = H5I_INVALID_HID;
|
||
|
hid_t tmp_dset_id = H5I_INVALID_HID;
|
||
|
hid_t dset_dtype = H5I_INVALID_HID;
|
||
|
hid_t dtype_id = H5I_INVALID_HID;
|
||
|
hid_t tmp_dtype_id = H5I_INVALID_HID;
|
||
|
hid_t attr_id = H5I_INVALID_HID;
|
||
|
hid_t attr_space_id = H5I_INVALID_HID;
|
||
|
hid_t space_id = H5I_INVALID_HID;
|
||
|
hid_t ocpypl_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object copying with H5O_COPY_WITHOUT_ATTR_FLAG flag");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_MORE) || !(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, link, dataset, attribute, or stored "
|
||
|
"datatype aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_COPY_NO_ATTRS_TEST_SUBGROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n", OBJECT_COPY_NO_ATTRS_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((space_id = generate_random_dataspace(OBJECT_COPY_NO_ATTRS_TEST_SPACE_RANK, NULL, NULL, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
if ((attr_space_id = generate_random_dataspace(OBJECT_COPY_NO_ATTRS_TEST_SPACE_RANK, NULL, NULL, TRUE)) <
|
||
|
0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((dset_dtype = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
/* Create the test group object, along with the attributes attached to it. */
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_COPY_NO_ATTRS_TEST_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_COPY_NO_ATTRS_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_NO_ATTRS_TEST_NUM_ATTRS; i++) {
|
||
|
char attr_name[OBJECT_COPY_NO_ATTRS_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(attr_name, OBJECT_COPY_NO_ATTRS_TEST_BUF_SIZE, "attr%d", (int)i);
|
||
|
|
||
|
if ((attr_id = H5Acreate2(group_id2, attr_name, H5T_NATIVE_INT, attr_space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create attribute '%s' on group '%s'\n", attr_name,
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Aclose(attr_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close attribute '%s'\n", attr_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Create the test dataset object, along with the attributes attached to it. */
|
||
|
if ((dset_id = H5Dcreate2(group_id, OBJECT_COPY_NO_ATTRS_TEST_DSET_NAME, dset_dtype, space_id,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create dataset '%s'\n", OBJECT_COPY_NO_ATTRS_TEST_DSET_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_NO_ATTRS_TEST_NUM_ATTRS; i++) {
|
||
|
char attr_name[OBJECT_COPY_NO_ATTRS_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(attr_name, OBJECT_COPY_NO_ATTRS_TEST_BUF_SIZE, "attr%d", (int)i);
|
||
|
|
||
|
if ((attr_id = H5Acreate2(dset_id, attr_name, H5T_NATIVE_INT, attr_space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create attribute '%s' on dataset '%s'\n", attr_name,
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_DSET_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Aclose(attr_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close attribute '%s'\n", attr_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Create the test committed datatype object, along with the attributes attached to it. */
|
||
|
if ((dtype_id = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create datatype\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Tcommit2(group_id, OBJECT_COPY_NO_ATTRS_TEST_DTYPE_NAME, dtype_id, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't commit datatype '%s'\n", OBJECT_COPY_NO_ATTRS_TEST_DTYPE_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_NO_ATTRS_TEST_NUM_ATTRS; i++) {
|
||
|
char attr_name[OBJECT_COPY_NO_ATTRS_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(attr_name, OBJECT_COPY_NO_ATTRS_TEST_BUF_SIZE, "attr%d", (int)i);
|
||
|
|
||
|
if ((attr_id = H5Acreate2(dtype_id, attr_name, H5T_NATIVE_INT, attr_space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create attribute '%s' on committed datatype '%s'\n", attr_name,
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_DTYPE_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Aclose(attr_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close attribute '%s'\n", attr_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Ocopy_group_no_attributes)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on a group (without attributes)");
|
||
|
|
||
|
if ((ocpypl_id = H5Pcreate(H5P_OBJECT_COPY)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create OCopyPL\n");
|
||
|
PART_ERROR(H5Ocopy_group_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Pset_copy_object(ocpypl_id, H5O_COPY_WITHOUT_ATTR_FLAG) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't set object copying options\n");
|
||
|
PART_ERROR(H5Ocopy_group_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_NO_ATTRS_TEST_GROUP_NAME, group_id,
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_GROUP_NAME, ocpypl_id, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy group '%s' to '%s'\n", OBJECT_COPY_NO_ATTRS_TEST_GROUP_NAME,
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group_no_attributes);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(group_id, OBJECT_COPY_NO_ATTRS_TEST_NEW_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied group exists\n",
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied group didn't exist!\n",
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group_no_attributes);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the new group has no attributes */
|
||
|
if ((tmp_group_id = H5Gopen2(group_id, OBJECT_COPY_NO_ATTRS_TEST_NEW_GROUP_NAME, H5P_DEFAULT)) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open group copy '%s'\n", OBJECT_COPY_NO_ATTRS_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group_no_attributes);
|
||
|
}
|
||
|
|
||
|
memset(&object_info, 0, sizeof(object_info));
|
||
|
|
||
|
/*
|
||
|
* Set attribute count to non-zero in case the connector doesn't
|
||
|
* support retrieval of object info.
|
||
|
*/
|
||
|
object_info.num_attrs = 1;
|
||
|
|
||
|
if (H5Oget_info3(tmp_group_id, &object_info, H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve object info\n");
|
||
|
PART_ERROR(H5Ocopy_group_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (object_info.num_attrs != 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group contained attributes after a non-attribute copy!\n");
|
||
|
PART_ERROR(H5Ocopy_group_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Pclose(ocpypl_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close OCopyPL\n");
|
||
|
PART_ERROR(H5Ocopy_group_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close group copy\n");
|
||
|
PART_ERROR(H5Ocopy_group_no_attributes);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_group_no_attributes);
|
||
|
|
||
|
if (ocpypl_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Pclose(ocpypl_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
ocpypl_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
if (tmp_group_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(tmp_group_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_group_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_dset_no_attributes)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on a dataset (without attributes)");
|
||
|
|
||
|
if ((ocpypl_id = H5Pcreate(H5P_OBJECT_COPY)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create OCopyPL\n");
|
||
|
PART_ERROR(H5Ocopy_dset_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Pset_copy_object(ocpypl_id, H5O_COPY_WITHOUT_ATTR_FLAG) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't set object copying options\n");
|
||
|
PART_ERROR(H5Ocopy_dset_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_NO_ATTRS_TEST_DSET_NAME, group_id,
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_DSET_NAME, ocpypl_id, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy dataset '%s' to '%s'\n", OBJECT_COPY_NO_ATTRS_TEST_DSET_NAME,
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset_no_attributes);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(group_id, OBJECT_COPY_NO_ATTRS_TEST_NEW_DSET_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied dataset exists\n",
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied dataset didn't exist!\n",
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset_no_attributes);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the new dataset doesn't have any attributes */
|
||
|
if ((tmp_dset_id = H5Dopen2(group_id, OBJECT_COPY_NO_ATTRS_TEST_NEW_DSET_NAME, H5P_DEFAULT)) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open dataset copy '%s'\n", OBJECT_COPY_NO_ATTRS_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset_no_attributes);
|
||
|
}
|
||
|
|
||
|
memset(&object_info, 0, sizeof(object_info));
|
||
|
|
||
|
/*
|
||
|
* Set attribute count to non-zero in case the connector doesn't
|
||
|
* support retrieval of object info.
|
||
|
*/
|
||
|
object_info.num_attrs = 1;
|
||
|
|
||
|
if (H5Oget_info3(tmp_dset_id, &object_info, H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve object info\n");
|
||
|
PART_ERROR(H5Ocopy_dset_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (object_info.num_attrs != 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied dataset contained attributes after a non-attribute copy!\n");
|
||
|
PART_ERROR(H5Ocopy_dset_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Pclose(ocpypl_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close OCopyPL\n");
|
||
|
PART_ERROR(H5Ocopy_dset_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Dclose(tmp_dset_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close dataset copy\n");
|
||
|
PART_ERROR(H5Ocopy_dset_no_attributes);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_dset_no_attributes);
|
||
|
|
||
|
if (ocpypl_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Pclose(ocpypl_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
ocpypl_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
if (tmp_dset_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Dclose(tmp_dset_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_dset_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_dtype_no_attributes)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on a committed datatype (without attributes)");
|
||
|
|
||
|
if ((ocpypl_id = H5Pcreate(H5P_OBJECT_COPY)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create OCopyPL\n");
|
||
|
PART_ERROR(H5Ocopy_dtype_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Pset_copy_object(ocpypl_id, H5O_COPY_WITHOUT_ATTR_FLAG) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't set object copying options\n");
|
||
|
PART_ERROR(H5Ocopy_dtype_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_NO_ATTRS_TEST_DTYPE_NAME, group_id,
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_DTYPE_NAME, ocpypl_id, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy datatype '%s' to '%s'\n", OBJECT_COPY_NO_ATTRS_TEST_DTYPE_NAME,
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype_no_attributes);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(group_id, OBJECT_COPY_NO_ATTRS_TEST_NEW_DTYPE_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied datatype exists\n",
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied datatype didn't exist!\n",
|
||
|
OBJECT_COPY_NO_ATTRS_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype_no_attributes);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the new committed datatype doesn't have any attributes */
|
||
|
if ((tmp_dtype_id = H5Topen2(group_id, OBJECT_COPY_NO_ATTRS_TEST_NEW_DTYPE_NAME, H5P_DEFAULT)) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open dataset copy '%s'\n", OBJECT_COPY_NO_ATTRS_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype_no_attributes);
|
||
|
}
|
||
|
|
||
|
memset(&object_info, 0, sizeof(object_info));
|
||
|
|
||
|
/*
|
||
|
* Set attribute count to non-zero in case the connector doesn't
|
||
|
* support retrieval of object info.
|
||
|
*/
|
||
|
object_info.num_attrs = 1;
|
||
|
|
||
|
if (H5Oget_info3(tmp_dtype_id, &object_info, H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve object info\n");
|
||
|
PART_ERROR(H5Ocopy_dtype_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (object_info.num_attrs != 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied committed datatype contained attributes after a non-attribute copy!\n");
|
||
|
PART_ERROR(H5Ocopy_dtype_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Pclose(ocpypl_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close OCopyPL\n");
|
||
|
PART_ERROR(H5Ocopy_dtype_no_attributes);
|
||
|
}
|
||
|
|
||
|
if (H5Tclose(tmp_dtype_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close datatype copy\n");
|
||
|
PART_ERROR(H5Ocopy_dtype_no_attributes);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_dtype_no_attributes);
|
||
|
|
||
|
if (ocpypl_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Pclose(ocpypl_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
ocpypl_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
if (tmp_dtype_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Tclose(tmp_dtype_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_dtype_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(attr_space_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Sclose(space_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dset_dtype) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dtype_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Dclose(dset_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Pclose(ocpypl_id);
|
||
|
H5Sclose(attr_space_id);
|
||
|
H5Sclose(space_id);
|
||
|
H5Aclose(attr_id);
|
||
|
H5Tclose(dset_dtype);
|
||
|
H5Tclose(tmp_dtype_id);
|
||
|
H5Tclose(dtype_id);
|
||
|
H5Dclose(tmp_dset_id);
|
||
|
H5Dclose(dset_id);
|
||
|
H5Gclose(tmp_group_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Tests to exercise the behavior of H5Ocopy when the source
|
||
|
* object specified is a soft link or dangling soft link.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_copy_by_soft_link(void)
|
||
|
{
|
||
|
H5O_info2_t object_info;
|
||
|
H5G_info_t group_info;
|
||
|
H5L_info2_t link_info;
|
||
|
htri_t object_link_exists;
|
||
|
size_t i;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID;
|
||
|
hid_t group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t tmp_group_id = H5I_INVALID_HID;
|
||
|
hid_t attr_id = H5I_INVALID_HID;
|
||
|
hid_t attr_space_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object copying through use of soft links");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_MORE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_MORE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_SOFT_LINKS)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, link, dataset, attribute, iterate, or "
|
||
|
"soft link aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_COPY_SOFT_LINK_TEST_SUBGROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n", OBJECT_COPY_SOFT_LINK_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((attr_space_id = generate_random_dataspace(OBJECT_COPY_SOFT_LINK_TEST_SPACE_RANK, NULL, NULL, TRUE)) <
|
||
|
0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
/* Create the test group object, along with its nested members and the attributes attached to it. */
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_COPY_SOFT_LINK_TEST_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_COPY_SOFT_LINK_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_SOFT_LINK_TEST_NUM_NESTED_OBJS; i++) {
|
||
|
char grp_name[OBJECT_COPY_SOFT_LINK_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(grp_name, OBJECT_COPY_SOFT_LINK_TEST_BUF_SIZE, "grp%d", (int)i);
|
||
|
|
||
|
if ((tmp_group_id = H5Gcreate2(group_id2, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s' under group '%s'\n", grp_name,
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create a further nested group under the last group added */
|
||
|
if (i == (OBJECT_COPY_SOFT_LINK_TEST_NUM_NESTED_OBJS - 1)) {
|
||
|
if (H5Gclose(H5Gcreate2(tmp_group_id, OBJECT_COPY_SOFT_LINK_TEST_DEEP_NESTED_GROUP_NAME,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create nested group '%s' under group '%s'\n",
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_DEEP_NESTED_GROUP_NAME, grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group '%s'\n", grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_SOFT_LINK_TEST_NUM_ATTRS; i++) {
|
||
|
char attr_name[OBJECT_COPY_SOFT_LINK_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(attr_name, OBJECT_COPY_SOFT_LINK_TEST_BUF_SIZE, "attr%d", (int)i);
|
||
|
|
||
|
if ((attr_id = H5Acreate2(group_id2, attr_name, H5T_NATIVE_INT, attr_space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create attribute '%s' on group '%s'\n", attr_name,
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Aclose(attr_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close attribute '%s'\n", attr_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Ocopy_through_soft_link)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy through use of a soft link");
|
||
|
|
||
|
if (H5Lcreate_soft("/" OBJECT_TEST_GROUP_NAME "/" OBJECT_COPY_SOFT_LINK_TEST_SUBGROUP_NAME
|
||
|
"/" OBJECT_COPY_SOFT_LINK_TEST_GROUP_NAME,
|
||
|
group_id, OBJECT_COPY_SOFT_LINK_TEST_SOFT_LINK_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to create soft link '%s' to group for copying\n",
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_SOFT_LINK_NAME);
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_SOFT_LINK_TEST_SOFT_LINK_NAME, group_id,
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_NEW_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy group '%s' to '%s'\n", OBJECT_COPY_SOFT_LINK_TEST_GROUP_NAME,
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(group_id, OBJECT_COPY_SOFT_LINK_TEST_NEW_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied group exists\n",
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied group didn't exist!\n",
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
/* Make sure the new object is an actual group and not another soft link */
|
||
|
memset(&link_info, 0, sizeof(link_info));
|
||
|
if (H5Lget_info2(group_id, OBJECT_COPY_SOFT_LINK_TEST_NEW_GROUP_NAME, &link_info, H5P_DEFAULT) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve info for link '%s'\n",
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
if (link_info.type != H5L_TYPE_HARD) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(
|
||
|
" after group copy through soft link, group's new link type wasn't H5L_TYPE_HARD!\n");
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Ensure that the new group doesn't have any attributes and only the
|
||
|
* immediate members of the copied group.
|
||
|
*/
|
||
|
if ((tmp_group_id = H5Gopen2(group_id, OBJECT_COPY_SOFT_LINK_TEST_NEW_GROUP_NAME, H5P_DEFAULT)) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open group copy '%s'\n", OBJECT_COPY_SOFT_LINK_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
memset(&group_info, 0, sizeof(group_info));
|
||
|
|
||
|
/*
|
||
|
* Set link count to zero in case the connector doesn't support
|
||
|
* retrieval of group info.
|
||
|
*/
|
||
|
group_info.nlinks = 0;
|
||
|
|
||
|
if (H5Gget_info(tmp_group_id, &group_info) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve group info\n");
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
if (group_info.nlinks != OBJECT_COPY_SOFT_LINK_TEST_NUM_NESTED_OBJS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(
|
||
|
" copied group contained %d members instead of %d members after a shallow copy!\n",
|
||
|
(int)group_info.nlinks, OBJECT_COPY_SOFT_LINK_TEST_NUM_NESTED_OBJS);
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
memset(&object_info, 0, sizeof(object_info));
|
||
|
|
||
|
/*
|
||
|
* Set attribute count to zero in case the connector doesn't
|
||
|
* support retrieval of object info.
|
||
|
*/
|
||
|
object_info.num_attrs = 0;
|
||
|
|
||
|
if (H5Oget_info3(tmp_group_id, &object_info, H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve object info\n");
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
if (object_info.num_attrs == 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group didn't contain any attributes after copy operation!\n");
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
/* Check the attribute names, types, etc. */
|
||
|
i = 0;
|
||
|
if (H5Aiterate2(tmp_group_id, H5_INDEX_NAME, H5_ITER_INC, NULL,
|
||
|
object_copy_attribute_iter_callback, &i) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to iterate over copied group's attributes\n");
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_COPY_SOFT_LINK_TEST_NUM_ATTRS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(
|
||
|
" number of attributes on copied group (%llu) didn't match expected number (%llu)!\n",
|
||
|
(unsigned long long)i, (unsigned long long)OBJECT_COPY_SOFT_LINK_TEST_NUM_ATTRS);
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close group copy\n");
|
||
|
PART_ERROR(H5Ocopy_through_soft_link);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_through_soft_link);
|
||
|
|
||
|
if (tmp_group_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(tmp_group_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_group_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_through_dangling_soft_link)
|
||
|
{
|
||
|
herr_t err_ret;
|
||
|
|
||
|
TESTING_2("H5Ocopy through use of a dangling soft link");
|
||
|
|
||
|
if (H5Lcreate_soft("/" OBJECT_TEST_GROUP_NAME "/" OBJECT_COPY_SOFT_LINK_TEST_SUBGROUP_NAME
|
||
|
"/nonexistent_object",
|
||
|
group_id, OBJECT_COPY_SOFT_LINK_TEST_DANGLING_LINK_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to create dangling soft link '%s'\n",
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_DANGLING_LINK_NAME);
|
||
|
PART_ERROR(H5Ocopy_through_dangling_soft_link);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret =
|
||
|
H5Ocopy(group_id, OBJECT_COPY_SOFT_LINK_TEST_DANGLING_LINK_NAME, group_id,
|
||
|
OBJECT_COPY_SOFT_LINK_TEST_DANGLING_LINK_NAME "2", H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied non-existent object through use of a dangling soft link!\n");
|
||
|
PART_ERROR(H5Ocopy_through_dangling_soft_link);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_through_dangling_soft_link);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(attr_space_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Sclose(attr_space_id);
|
||
|
H5Aclose(attr_id);
|
||
|
H5Gclose(tmp_group_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Tests for copying groups that contain soft links with
|
||
|
* H5Ocopy. Also tested is the H5O_COPY_EXPAND_SOFT_LINK_FLAG
|
||
|
* flag.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_copy_group_with_soft_links(void)
|
||
|
{
|
||
|
H5G_info_t group_info;
|
||
|
htri_t object_link_exists;
|
||
|
size_t i;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID;
|
||
|
hid_t group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t tmp_group_id = H5I_INVALID_HID;
|
||
|
hid_t ocpypl_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("group copying when group contains soft links");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_MORE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_MORE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) || !(vol_cap_flags_g & H5VL_CAP_FLAG_SOFT_LINKS)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, link, or soft link aren't supported with "
|
||
|
"this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_SUBGROUP_NAME,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create the test group object. */
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_GROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create several groups at the root level and add soft links pointing to them inside
|
||
|
* the test group object.
|
||
|
*/
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NUM_NESTED_OBJS; i++) {
|
||
|
char grp_name[OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE];
|
||
|
char lnk_name[OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE];
|
||
|
char lnk_target[2 * OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(grp_name, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE, "grp%d", (int)i);
|
||
|
snprintf(lnk_name, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE, "link%d", (int)i);
|
||
|
snprintf(lnk_target, 2 * OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE,
|
||
|
"/" OBJECT_TEST_GROUP_NAME "/" OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_SUBGROUP_NAME "/%s",
|
||
|
grp_name);
|
||
|
|
||
|
if ((tmp_group_id = H5Gcreate2(group_id, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s' under group '%s'\n", grp_name,
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Lcreate_soft(lnk_target, group_id2, lnk_name, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to create soft link '%s'\n", lnk_name);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group '%s'\n", grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Ocopy_dont_expand_soft_links)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on group with soft links (soft links not expanded)");
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_GROUP_NAME, group_id,
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NON_EXPAND_GROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy group '%s' to '%s'\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_GROUP_NAME,
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NON_EXPAND_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_dont_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(group_id, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NON_EXPAND_GROUP_NAME,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied group exists\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NON_EXPAND_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_dont_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied group didn't exist!\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NON_EXPAND_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_dont_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the number of links is the same */
|
||
|
if ((tmp_group_id =
|
||
|
H5Gopen2(group_id, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NON_EXPAND_GROUP_NAME,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open group copy '%s'\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NON_EXPAND_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_dont_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
memset(&group_info, 0, sizeof(group_info));
|
||
|
|
||
|
/*
|
||
|
* Set link count to zero in case the connector doesn't support
|
||
|
* retrieval of group info.
|
||
|
*/
|
||
|
group_info.nlinks = 0;
|
||
|
|
||
|
if (H5Gget_info(tmp_group_id, &group_info) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve group info\n");
|
||
|
PART_ERROR(H5Ocopy_dont_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (group_info.nlinks != OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NUM_NESTED_OBJS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group contained %d members instead of %d members after copy!\n",
|
||
|
(int)group_info.nlinks, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NUM_NESTED_OBJS);
|
||
|
PART_ERROR(H5Ocopy_dont_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Iterate over the links in the copied group and ensure that they're all
|
||
|
* still soft links with their original values.
|
||
|
*/
|
||
|
i = 0;
|
||
|
if (H5Literate2(tmp_group_id, H5_INDEX_NAME, H5_ITER_INC, NULL,
|
||
|
object_copy_soft_link_non_expand_callback, &i) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to iterate over links in group '%s'\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NON_EXPAND_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_dont_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NUM_NESTED_OBJS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" number of links in copied group (%llu) didn't match expected number (%llu)!\n",
|
||
|
(unsigned long long)i,
|
||
|
(unsigned long long)OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NUM_NESTED_OBJS);
|
||
|
PART_ERROR(H5Ocopy_dont_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close group copy\n");
|
||
|
PART_ERROR(H5Ocopy_dont_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_dont_expand_soft_links);
|
||
|
|
||
|
if (tmp_group_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(tmp_group_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_group_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_expand_soft_links)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on group with soft links (soft links expanded)");
|
||
|
|
||
|
if ((ocpypl_id = H5Pcreate(H5P_OBJECT_COPY)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create OCopyPL\n");
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (H5Pset_copy_object(ocpypl_id, H5O_COPY_EXPAND_SOFT_LINK_FLAG) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't set object copying options\n");
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_GROUP_NAME, group_id,
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_EXPAND_GROUP_NAME, ocpypl_id,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy group '%s' to '%s'\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_GROUP_NAME,
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_EXPAND_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists = H5Lexists(
|
||
|
group_id, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_EXPAND_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied group exists\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_EXPAND_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied group didn't exist!\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_EXPAND_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the number of links is the same */
|
||
|
if ((tmp_group_id = H5Gopen2(group_id, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_EXPAND_GROUP_NAME,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open group copy '%s'\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_EXPAND_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
memset(&group_info, 0, sizeof(group_info));
|
||
|
|
||
|
/*
|
||
|
* Set link count to zero in case the connector doesn't support
|
||
|
* retrieval of group info.
|
||
|
*/
|
||
|
group_info.nlinks = 0;
|
||
|
|
||
|
if (H5Gget_info(tmp_group_id, &group_info) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve group info\n");
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (group_info.nlinks != OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NUM_NESTED_OBJS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group contained %d members instead of %d members after copy!\n",
|
||
|
(int)group_info.nlinks, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NUM_NESTED_OBJS);
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Iterate over the links in the copied group and ensure that they've all
|
||
|
* been expanded into hard links corresponding to the top-level groups
|
||
|
* created.
|
||
|
*/
|
||
|
i = 0;
|
||
|
if (H5Literate2(tmp_group_id, H5_INDEX_NAME, H5_ITER_INC, NULL,
|
||
|
object_copy_soft_link_expand_callback, &i) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to iterate over links in group '%s'\n",
|
||
|
OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_EXPAND_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NUM_NESTED_OBJS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" number of links in copied group (%llu) didn't match expected number (%llu)!\n",
|
||
|
(unsigned long long)i,
|
||
|
(unsigned long long)OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_NUM_NESTED_OBJS);
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (H5Pclose(ocpypl_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close OCopyPL\n");
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close group copy\n");
|
||
|
PART_ERROR(H5Ocopy_expand_soft_links);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_expand_soft_links);
|
||
|
|
||
|
if (ocpypl_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(ocpypl_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
ocpypl_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
if (tmp_group_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(tmp_group_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_group_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Pclose(ocpypl_id);
|
||
|
H5Gclose(tmp_group_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Tests for copying objects between two different files using
|
||
|
* H5Ocopy.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_copy_between_files(void)
|
||
|
{
|
||
|
H5O_info2_t object_info;
|
||
|
H5G_info_t group_info;
|
||
|
htri_t object_link_exists;
|
||
|
size_t i;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t file_id2 = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID;
|
||
|
hid_t group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t tmp_group_id = H5I_INVALID_HID;
|
||
|
hid_t dset_id = H5I_INVALID_HID;
|
||
|
hid_t tmp_dset_id = H5I_INVALID_HID;
|
||
|
hid_t dset_dtype = H5I_INVALID_HID;
|
||
|
hid_t dtype_id = H5I_INVALID_HID;
|
||
|
hid_t tmp_dtype_id = H5I_INVALID_HID;
|
||
|
hid_t attr_id = H5I_INVALID_HID;
|
||
|
hid_t attr_space_id = H5I_INVALID_HID;
|
||
|
hid_t space_id = H5I_INVALID_HID;
|
||
|
hid_t ocpypl_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object copying between files");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_MORE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_LINK_MORE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_MORE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, link, dataset, attribute, stored "
|
||
|
"datatype, or iterate aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
/*
|
||
|
* Create the second file for the between file copying tests.
|
||
|
*/
|
||
|
if ((file_id2 = H5Fcreate(OBJECT_COPY_BETWEEN_FILES_TEST_FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_COPY_BETWEEN_FILES_TEST_SUBGROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((space_id = generate_random_dataspace(OBJECT_COPY_BETWEEN_FILES_TEST_SPACE_RANK, NULL, NULL, FALSE)) <
|
||
|
0)
|
||
|
TEST_ERROR;
|
||
|
if ((attr_space_id =
|
||
|
generate_random_dataspace(OBJECT_COPY_BETWEEN_FILES_TEST_SPACE_RANK, NULL, NULL, TRUE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((dset_dtype = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
/* Create the test group object, along with its nested members and the attributes attached to it. */
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_COPY_BETWEEN_FILES_TEST_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_COPY_BETWEEN_FILES_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_BETWEEN_FILES_TEST_NUM_NESTED_OBJS; i++) {
|
||
|
char grp_name[OBJECT_COPY_BETWEEN_FILES_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(grp_name, OBJECT_COPY_BETWEEN_FILES_TEST_BUF_SIZE, "grp%d", (int)i);
|
||
|
|
||
|
if ((tmp_group_id = H5Gcreate2(group_id2, grp_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s' under group '%s'\n", grp_name,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create a further nested group under the last group added */
|
||
|
if (i == (OBJECT_COPY_BETWEEN_FILES_TEST_NUM_NESTED_OBJS - 1)) {
|
||
|
if (H5Gclose(H5Gcreate2(tmp_group_id, OBJECT_COPY_BETWEEN_FILES_TEST_DEEP_NESTED_GROUP_NAME,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create nested group '%s' under group '%s'\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_DEEP_NESTED_GROUP_NAME, grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group '%s'\n", grp_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_BETWEEN_FILES_TEST_NUM_ATTRS; i++) {
|
||
|
char attr_name[OBJECT_COPY_BETWEEN_FILES_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(attr_name, OBJECT_COPY_BETWEEN_FILES_TEST_BUF_SIZE, "attr%d", (int)i);
|
||
|
|
||
|
if ((attr_id = H5Acreate2(group_id2, attr_name, H5T_NATIVE_INT, attr_space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create attribute '%s' on group '%s'\n", attr_name,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Aclose(attr_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close attribute '%s'\n", attr_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Create the test dataset object, along with the attributes attached to it. */
|
||
|
if ((dset_id = H5Dcreate2(group_id, OBJECT_COPY_BETWEEN_FILES_TEST_DSET_NAME, dset_dtype, space_id,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create dataset '%s'\n", OBJECT_COPY_BETWEEN_FILES_TEST_DSET_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_BETWEEN_FILES_TEST_NUM_ATTRS; i++) {
|
||
|
char attr_name[OBJECT_COPY_BETWEEN_FILES_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(attr_name, OBJECT_COPY_BETWEEN_FILES_TEST_BUF_SIZE, "attr%d", (int)i);
|
||
|
|
||
|
if ((attr_id = H5Acreate2(dset_id, attr_name, H5T_NATIVE_INT, attr_space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create attribute '%s' on dataset '%s'\n", attr_name,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_DSET_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Aclose(attr_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close attribute '%s'\n", attr_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Create the test committed datatype object, along with the attributes attached to it. */
|
||
|
if ((dtype_id = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create datatype\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Tcommit2(group_id, OBJECT_COPY_BETWEEN_FILES_TEST_DTYPE_NAME, dtype_id, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't commit datatype '%s'\n", OBJECT_COPY_BETWEEN_FILES_TEST_DTYPE_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < (size_t)OBJECT_COPY_BETWEEN_FILES_TEST_NUM_ATTRS; i++) {
|
||
|
char attr_name[OBJECT_COPY_BETWEEN_FILES_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(attr_name, OBJECT_COPY_BETWEEN_FILES_TEST_BUF_SIZE, "attr%d", (int)i);
|
||
|
|
||
|
if ((attr_id = H5Acreate2(dtype_id, attr_name, H5T_NATIVE_INT, attr_space_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create attribute '%s' on committed datatype '%s'\n", attr_name,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_DTYPE_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Aclose(attr_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close attribute '%s'\n", attr_name);
|
||
|
goto error;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Ocopy_group_between_files)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on group between different files");
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_BETWEEN_FILES_TEST_GROUP_NAME, file_id2,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy group '%s' to second file '%s'\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_GROUP_NAME,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(file_id2, OBJECT_COPY_BETWEEN_FILES_TEST_NEW_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied group exists\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied group in second file '%s' didn't exist!\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_GROUP_NAME,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_FILE_NAME);
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the new group has all the members of the copied group, and all its attributes */
|
||
|
if ((tmp_group_id =
|
||
|
H5Gopen2(file_id2, OBJECT_COPY_BETWEEN_FILES_TEST_NEW_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open group copy '%s'\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_GROUP_NAME);
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
memset(&group_info, 0, sizeof(group_info));
|
||
|
|
||
|
/*
|
||
|
* Set link count to zero in case the connector doesn't support
|
||
|
* retrieval of group info.
|
||
|
*/
|
||
|
group_info.nlinks = 0;
|
||
|
|
||
|
if (H5Gget_info(tmp_group_id, &group_info) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve group info\n");
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
if (group_info.nlinks != OBJECT_COPY_BETWEEN_FILES_TEST_NUM_NESTED_OBJS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group contained %d members instead of %d members after a deep copy!\n",
|
||
|
(int)group_info.nlinks, OBJECT_COPY_BETWEEN_FILES_TEST_NUM_NESTED_OBJS);
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
memset(&object_info, 0, sizeof(object_info));
|
||
|
|
||
|
/*
|
||
|
* Set attribute count to zero in case the connector doesn't
|
||
|
* support retrieval of object info.
|
||
|
*/
|
||
|
object_info.num_attrs = 0;
|
||
|
|
||
|
if (H5Oget_info3(tmp_group_id, &object_info, H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve object info\n");
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
if (object_info.num_attrs == 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group didn't contain any attributes after copy operation!\n");
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
/* Check the attribute names, types, etc. */
|
||
|
i = 0;
|
||
|
if (H5Aiterate2(tmp_group_id, H5_INDEX_NAME, H5_ITER_INC, NULL,
|
||
|
object_copy_attribute_iter_callback, &i) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to iterate over copied group's attributes\n");
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_COPY_BETWEEN_FILES_TEST_NUM_ATTRS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(
|
||
|
" number of attributes on copied group (%llu) didn't match expected number (%llu)!\n",
|
||
|
(unsigned long long)i, (unsigned long long)OBJECT_COPY_BETWEEN_FILES_TEST_NUM_ATTRS);
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close group copy\n");
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Ensure that the last immediate member of the copied group
|
||
|
* contains its single member after the deep copy.
|
||
|
*/
|
||
|
{
|
||
|
char grp_name[OBJECT_COPY_BETWEEN_FILES_TEST_BUF_SIZE];
|
||
|
|
||
|
snprintf(grp_name, OBJECT_COPY_BETWEEN_FILES_TEST_BUF_SIZE,
|
||
|
"/" OBJECT_COPY_BETWEEN_FILES_TEST_NEW_GROUP_NAME "/grp%d",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NUM_NESTED_OBJS - 1);
|
||
|
|
||
|
if ((tmp_group_id = H5Gopen2(file_id2, grp_name, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open group '%s'\n", grp_name);
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
memset(&group_info, 0, sizeof(group_info));
|
||
|
|
||
|
/*
|
||
|
* Set link count to zero in case the connector doesn't support
|
||
|
* retrieval of group info.
|
||
|
*/
|
||
|
group_info.nlinks = 0;
|
||
|
|
||
|
if (H5Gget_info(tmp_group_id, &group_info) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve group info\n");
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
if (group_info.nlinks != 1) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied group's immediate members didn't contain nested members after a "
|
||
|
"deep copy!\n");
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(tmp_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close group '%s'\n", grp_name);
|
||
|
PART_ERROR(H5Ocopy_group_between_files);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_group_between_files);
|
||
|
|
||
|
if (tmp_group_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(tmp_group_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_group_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_dset_between_files)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on dataset between different files");
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_BETWEEN_FILES_TEST_DSET_NAME, file_id2,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DSET_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy dataset '%s' to second file '%s'\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_DSET_NAME,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset_between_files);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(file_id2, OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DSET_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied dataset exists\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset_between_files);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied dataset in second file '%s' didn't exist!\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DSET_NAME,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_FILE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset_between_files);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the new dataset has all the attributes of the copied dataset */
|
||
|
if ((tmp_dset_id =
|
||
|
H5Dopen2(file_id2, OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DSET_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open dataset copy '%s'\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DSET_NAME);
|
||
|
PART_ERROR(H5Ocopy_dset_between_files);
|
||
|
}
|
||
|
|
||
|
memset(&object_info, 0, sizeof(object_info));
|
||
|
|
||
|
/*
|
||
|
* Set attribute count to zero in case the connector doesn't
|
||
|
* support retrieval of object info.
|
||
|
*/
|
||
|
object_info.num_attrs = 0;
|
||
|
|
||
|
if (H5Oget_info3(tmp_dset_id, &object_info, H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve object info\n");
|
||
|
PART_ERROR(H5Ocopy_dset_between_files);
|
||
|
}
|
||
|
|
||
|
if (object_info.num_attrs == 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" copied dataset didn't contain any attributes after copy operation!\n");
|
||
|
PART_ERROR(H5Ocopy_dset_between_files);
|
||
|
}
|
||
|
|
||
|
/* Check the attribute names, types, etc. */
|
||
|
i = 0;
|
||
|
if (H5Aiterate2(tmp_dset_id, H5_INDEX_NAME, H5_ITER_INC, NULL,
|
||
|
object_copy_attribute_iter_callback, &i) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to iterate over copied dataset's attributes\n");
|
||
|
PART_ERROR(H5Ocopy_dset_between_files);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_COPY_BETWEEN_FILES_TEST_NUM_ATTRS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" number of attributes on copied dataset (%llu) didn't match expected number "
|
||
|
"(%llu)!\n",
|
||
|
(unsigned long long)i, (unsigned long long)OBJECT_COPY_BETWEEN_FILES_TEST_NUM_ATTRS);
|
||
|
PART_ERROR(H5Ocopy_dset_between_files);
|
||
|
}
|
||
|
|
||
|
if (H5Dclose(tmp_dset_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close dataset copy\n");
|
||
|
PART_ERROR(H5Ocopy_dset_between_files);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_dset_between_files);
|
||
|
|
||
|
if (tmp_dset_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Dclose(tmp_dset_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_dset_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_dtype_between_files)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy on committed datatype between different files");
|
||
|
|
||
|
if (H5Ocopy(group_id, OBJECT_COPY_BETWEEN_FILES_TEST_DTYPE_NAME, file_id2,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DTYPE_NAME, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to copy committed datatype '%s' to second file '%s'\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_DTYPE_NAME,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype_between_files);
|
||
|
}
|
||
|
|
||
|
if ((object_link_exists =
|
||
|
H5Lexists(file_id2, OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DTYPE_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't determine if link '%s' to copied committed datatype exists\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype_between_files);
|
||
|
}
|
||
|
|
||
|
if (!object_link_exists) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" link '%s' to copied committed datatype in second file '%s' didn't exist!\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DTYPE_NAME,
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_FILE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype_between_files);
|
||
|
}
|
||
|
|
||
|
/* Ensure that the new committed datatype has all the attributes of the copied committed datatype
|
||
|
*/
|
||
|
if ((tmp_dtype_id =
|
||
|
H5Topen2(file_id2, OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DTYPE_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to open committed datatype copy '%s'\n",
|
||
|
OBJECT_COPY_BETWEEN_FILES_TEST_NEW_DTYPE_NAME);
|
||
|
PART_ERROR(H5Ocopy_dtype_between_files);
|
||
|
}
|
||
|
|
||
|
memset(&object_info, 0, sizeof(object_info));
|
||
|
|
||
|
/*
|
||
|
* Set attribute count to zero in case the connector doesn't
|
||
|
* support retrieval of object info.
|
||
|
*/
|
||
|
object_info.num_attrs = 0;
|
||
|
|
||
|
if (H5Oget_info3(tmp_dtype_id, &object_info, H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to retrieve object info\n");
|
||
|
PART_ERROR(H5Ocopy_dtype_between_files);
|
||
|
}
|
||
|
|
||
|
if (object_info.num_attrs == 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(
|
||
|
" copied committed datatype didn't contain any attributes after copy operation!\n");
|
||
|
PART_ERROR(H5Ocopy_dtype_between_files);
|
||
|
}
|
||
|
|
||
|
/* Check the attribute names, types, etc. */
|
||
|
i = 0;
|
||
|
if (H5Aiterate2(tmp_dtype_id, H5_INDEX_NAME, H5_ITER_INC, NULL,
|
||
|
object_copy_attribute_iter_callback, &i) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to iterate over copied datatype's attributes\n");
|
||
|
PART_ERROR(H5Ocopy_dtype_between_files);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_COPY_BETWEEN_FILES_TEST_NUM_ATTRS) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" number of attributes on copied datatype (%llu) didn't match expected number "
|
||
|
"(%llu)!\n",
|
||
|
(unsigned long long)i, (unsigned long long)OBJECT_COPY_BETWEEN_FILES_TEST_NUM_ATTRS);
|
||
|
PART_ERROR(H5Ocopy_dtype_between_files);
|
||
|
}
|
||
|
|
||
|
if (H5Tclose(tmp_dtype_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" failed to close committed datatype copy\n");
|
||
|
PART_ERROR(H5Ocopy_dtype_between_files);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_dtype_between_files);
|
||
|
|
||
|
if (tmp_dtype_id >= 0) {
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Tclose(tmp_dtype_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
tmp_dtype_id = H5I_INVALID_HID;
|
||
|
}
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(attr_space_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Sclose(space_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dset_dtype) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dtype_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Dclose(dset_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Pclose(ocpypl_id);
|
||
|
H5Sclose(attr_space_id);
|
||
|
H5Sclose(space_id);
|
||
|
H5Aclose(attr_id);
|
||
|
H5Tclose(dset_dtype);
|
||
|
H5Tclose(tmp_dtype_id);
|
||
|
H5Tclose(dtype_id);
|
||
|
H5Dclose(tmp_dset_id);
|
||
|
H5Dclose(dset_id);
|
||
|
H5Gclose(tmp_group_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id2);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that H5Ocopy fails when it
|
||
|
* is passed invalid parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_copy_invalid_params(void)
|
||
|
{
|
||
|
herr_t err_ret = -1;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object copying with invalid parameters");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_MORE)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, or object aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_COPY_INVALID_PARAMS_TEST_SUBGROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n",
|
||
|
OBJECT_COPY_INVALID_PARAMS_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Ocopy_invalid_src_loc_id)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy with an invalid source location ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(H5I_INVALID_HID, OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME, group_id,
|
||
|
OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME2, H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ocopy succeeded with an invalid source location ID!\n");
|
||
|
PART_ERROR(H5Ocopy_invalid_src_loc_id);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_invalid_src_loc_id);
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_invalid_src_obj_name)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy with an invalid source object name");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(group_id, NULL, group_id, OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME2,
|
||
|
H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ocopy succeeded with a NULL source object name!\n");
|
||
|
PART_ERROR(H5Ocopy_invalid_src_obj_name);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(group_id, "", group_id, OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME2,
|
||
|
H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ocopy succeeded with an invalid source object name of ''!\n");
|
||
|
PART_ERROR(H5Ocopy_invalid_src_obj_name);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_invalid_src_obj_name);
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_invalid_dst_loc_id)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy with an invalid destination location ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(group_id, OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME, H5I_INVALID_HID,
|
||
|
OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME2, H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ocopy succeeded with an invalid destination location ID!\n");
|
||
|
PART_ERROR(H5Ocopy_invalid_dst_loc_id);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_invalid_dst_loc_id);
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_invalid_dst_obj_name)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy with an invalid destination object name");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(group_id, OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME, group_id, NULL,
|
||
|
H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ocopy succeeded with a NULL destination object name!\n");
|
||
|
PART_ERROR(H5Ocopy_invalid_dst_obj_name);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(group_id, OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME, group_id, "",
|
||
|
H5P_DEFAULT, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ocopy succeeded with an invalid destination object name of ''!\n");
|
||
|
PART_ERROR(H5Ocopy_invalid_dst_obj_name);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_invalid_dst_obj_name);
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_invalid_ocpypl)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy with an invalid OcpyPL");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(group_id, OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME, group_id,
|
||
|
OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME2, H5I_INVALID_HID, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ocopy succeeded with an invalid OcpyPL!\n");
|
||
|
PART_ERROR(H5Ocopy_invalid_ocpypl);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_invalid_ocpypl);
|
||
|
|
||
|
PART_BEGIN(H5Ocopy_invalid_lcpl)
|
||
|
{
|
||
|
TESTING_2("H5Ocopy with an invalid LCPL");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ocopy(group_id, OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME, group_id,
|
||
|
OBJECT_COPY_INVALID_PARAMS_TEST_GROUP_NAME2, H5P_DEFAULT, H5I_INVALID_HID);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ocopy succeeded with an invalid LCPL!\n");
|
||
|
PART_ERROR(H5Ocopy_invalid_lcpl);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ocopy_invalid_lcpl);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test for H5Oset_comment(_by_name)/H5Oget_comment(_by_name).
|
||
|
*/
|
||
|
static int
|
||
|
test_object_comments(void)
|
||
|
{
|
||
|
TESTING("object comments");
|
||
|
|
||
|
SKIPPED();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that H5Oset_comment(_by_name)/H5Oget_comment(_by_name)
|
||
|
* fail when passed invalid parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_comments_invalid_params(void)
|
||
|
{
|
||
|
TESTING("object comment ");
|
||
|
|
||
|
SKIPPED();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test for H5Ovisit(_by_name).
|
||
|
*
|
||
|
* XXX: Should have test for checking nested object's names/paths.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_visit(void)
|
||
|
{
|
||
|
size_t i;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t gcpl_id = H5I_INVALID_HID;
|
||
|
hid_t type_id = H5I_INVALID_HID;
|
||
|
hid_t dset_id = H5I_INVALID_HID;
|
||
|
hid_t dset_dtype = H5I_INVALID_HID;
|
||
|
hid_t fspace_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object visiting");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES) || !(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, dataset, attribute, stored datatype, "
|
||
|
"iterate, or creation order aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create a GCPL\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't enable link creation order tracking and indexing on GCPL\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_VISIT_TEST_SUBGROUP_NAME, H5P_DEFAULT, gcpl_id,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container sub-group '%s'\n", OBJECT_VISIT_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((fspace_id = generate_random_dataspace(OBJECT_VISIT_TEST_SPACE_RANK, NULL, NULL, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((dset_dtype = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((type_id = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create datatype '%s'\n", OBJECT_VISIT_TEST_TYPE_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_VISIT_TEST_GROUP_NAME, H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_VISIT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((dset_id = H5Dcreate2(group_id, OBJECT_VISIT_TEST_DSET_NAME, dset_dtype, fspace_id, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create dataset '%s'\n", OBJECT_VISIT_TEST_DSET_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Tcommit2(group_id, OBJECT_VISIT_TEST_TYPE_NAME, type_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't commit datatype '%s'\n", OBJECT_VISIT_TEST_TYPE_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
/*
|
||
|
* NOTE: A counter is passed to the iteration callback to try to match up
|
||
|
* the expected objects with a given step throughout all of the following
|
||
|
* iterations. This is to try and check that the objects are indeed being
|
||
|
* returned in the correct order.
|
||
|
*/
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_obj_name_increasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit by object name in increasing order");
|
||
|
|
||
|
i = 0;
|
||
|
|
||
|
if (H5Ovisit3(group_id, H5_INDEX_NAME, H5_ITER_INC, object_visit_callback, &i, H5O_INFO_ALL) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit by object name in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_obj_name_increasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_obj_name_decreasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit by object name in decreasing order");
|
||
|
#ifndef NO_DECREASING_ALPHA_ITER_ORDER
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = OBJECT_VISIT_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
if (H5Ovisit3(group_id, H5_INDEX_NAME, H5_ITER_DEC, object_visit_callback, &i, H5O_INFO_ALL) <
|
||
|
0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit by object name in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 2 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
#else
|
||
|
SKIPPED();
|
||
|
PART_EMPTY(H5Ovisit_obj_name_decreasing);
|
||
|
#endif
|
||
|
}
|
||
|
PART_END(H5Ovisit_obj_name_decreasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_create_order_increasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit by creation order in increasing order");
|
||
|
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = 2 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
if (H5Ovisit3(group_id, H5_INDEX_CRT_ORDER, H5_ITER_INC, object_visit_callback, &i,
|
||
|
H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit by creation order in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != 3 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_create_order_increasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_create_order_decreasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit by creation order in decreasing order");
|
||
|
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = 3 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
if (H5Ovisit3(group_id, H5_INDEX_CRT_ORDER, H5_ITER_DEC, object_visit_callback, &i,
|
||
|
H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit by creation order in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 4 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_create_order_decreasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_file)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit on a file ID");
|
||
|
|
||
|
/*
|
||
|
* XXX:
|
||
|
*/
|
||
|
|
||
|
SKIPPED();
|
||
|
PART_EMPTY(H5Ovisit_file);
|
||
|
}
|
||
|
PART_END(H5Ovisit_file);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_dset)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit on a dataset ID");
|
||
|
|
||
|
if (H5Ovisit3(dset_id, H5_INDEX_NAME, H5_ITER_INC, object_visit_dset_callback, NULL,
|
||
|
H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit failed\n");
|
||
|
PART_ERROR(H5Ovisit_dset);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_dset);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_dtype)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit on a committed datatype ID");
|
||
|
|
||
|
if (H5Ovisit3(type_id, H5_INDEX_NAME, H5_ITER_INC, object_visit_dtype_callback, NULL,
|
||
|
H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit failed\n");
|
||
|
PART_ERROR(H5Ovisit_dtype);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_dtype);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_obj_name_increasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name by object name in increasing order");
|
||
|
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = 0;
|
||
|
|
||
|
/* First, test visiting using "." for the object name */
|
||
|
if (H5Ovisit_by_name3(group_id, ".", H5_INDEX_NAME, H5_ITER_INC, object_visit_callback, &i,
|
||
|
H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by object name in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
/* Reset the special counter and repeat the test using an indirect object name. */
|
||
|
i = 0;
|
||
|
|
||
|
if (H5Ovisit_by_name3(container_group, OBJECT_VISIT_TEST_SUBGROUP_NAME, H5_INDEX_NAME,
|
||
|
H5_ITER_INC, object_visit_callback, &i, H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by object name in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_obj_name_increasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_obj_name_decreasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name by object name in decreasing order");
|
||
|
#ifndef NO_DECREASING_ALPHA_ITER_ORDER
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = OBJECT_VISIT_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
/* First, test visiting using "." for the object name */
|
||
|
if (H5Ovisit_by_name3(group_id, ".", H5_INDEX_NAME, H5_ITER_DEC, object_visit_callback, &i,
|
||
|
H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by object name in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 2 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
/* Reset the special counter and repeat the test using an indirect object name. */
|
||
|
i = OBJECT_VISIT_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
if (H5Ovisit_by_name3(container_group, OBJECT_VISIT_TEST_SUBGROUP_NAME, H5_INDEX_NAME,
|
||
|
H5_ITER_DEC, object_visit_callback, &i, H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by object name in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 2 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
#else
|
||
|
SKIPPED();
|
||
|
PART_EMPTY(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
#endif
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_create_order_increasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name by creation order in increasing order");
|
||
|
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = 2 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
/* First, test visiting using "." for the object name */
|
||
|
if (H5Ovisit_by_name3(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, object_visit_callback, &i,
|
||
|
H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by creation order in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != 3 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
/* Reset the special counter and repeat the test using an indirect object name. */
|
||
|
i = 2 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
if (H5Ovisit_by_name3(container_group, OBJECT_VISIT_TEST_SUBGROUP_NAME, H5_INDEX_CRT_ORDER,
|
||
|
H5_ITER_INC, object_visit_callback, &i, H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by creation order in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != 3 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_create_order_increasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_create_order_decreasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name by creation order in decreasing order");
|
||
|
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = 3 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
/* First, test visiting using "." for the object name */
|
||
|
if (H5Ovisit_by_name3(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, object_visit_callback, &i,
|
||
|
H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by creation order in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 4 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
/* Reset the special counter and repeat the test using an indirect object name. */
|
||
|
i = 3 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
if (H5Ovisit_by_name3(container_group, OBJECT_VISIT_TEST_SUBGROUP_NAME, H5_INDEX_CRT_ORDER,
|
||
|
H5_ITER_DEC, object_visit_callback, &i, H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by creation order in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 4 * OBJECT_VISIT_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_create_order_decreasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_file)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name on a file ID");
|
||
|
|
||
|
/*
|
||
|
* XXX:
|
||
|
*/
|
||
|
|
||
|
SKIPPED();
|
||
|
PART_EMPTY(H5Ovisit_by_name_file);
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_file);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_dset)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name on a dataset ID");
|
||
|
|
||
|
if (H5Ovisit_by_name3(group_id, OBJECT_VISIT_TEST_DSET_NAME, H5_INDEX_NAME, H5_ITER_INC,
|
||
|
object_visit_dset_callback, NULL, H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_dset);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_dset);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_dtype)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name on a committed datatype ID");
|
||
|
|
||
|
if (H5Ovisit_by_name3(group_id, OBJECT_VISIT_TEST_TYPE_NAME, H5_INDEX_NAME, H5_ITER_INC,
|
||
|
object_visit_dtype_callback, NULL, H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_dtype);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_dtype);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(fspace_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dset_dtype) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(type_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Dclose(dset_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Pclose(gcpl_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Sclose(fspace_id);
|
||
|
H5Tclose(dset_dtype);
|
||
|
H5Tclose(type_id);
|
||
|
H5Dclose(dset_id);
|
||
|
H5Pclose(gcpl_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test for H5Ovisit(_by_name) on soft links. Since
|
||
|
* H5Ovisit(_by_name) ignores soft links, this test is
|
||
|
* meant to verify that behavior by placing objects and
|
||
|
* the soft links pointing to those objects in separate
|
||
|
* groups. Visiting is done only on the group containing
|
||
|
* the links to ensure that the objects in the other group
|
||
|
* do not get visited.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_visit_soft_link(void)
|
||
|
{
|
||
|
size_t i;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t subgroup_id = H5I_INVALID_HID, subgroup_id2 = H5I_INVALID_HID;
|
||
|
hid_t linked_group_id = H5I_INVALID_HID;
|
||
|
hid_t gcpl_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object visiting with soft links");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_CREATION_ORDER) || !(vol_cap_flags_g & H5VL_CAP_FLAG_SOFT_LINKS)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, soft link, iterate, or creation order "
|
||
|
"aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((gcpl_id = H5Pcreate(H5P_GROUP_CREATE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create a GCPL\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Pset_link_creation_order(gcpl_id, H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't enable link creation order tracking and indexing on GCPL\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_VISIT_SOFT_LINK_TEST_SUBGROUP_NAME, H5P_DEFAULT,
|
||
|
gcpl_id, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container sub-group '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create group to hold soft links */
|
||
|
if ((subgroup_id = H5Gcreate2(group_id, OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME1, H5P_DEFAULT, gcpl_id,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME1);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create group to hold objects pointed to by soft links */
|
||
|
if ((subgroup_id2 = H5Gcreate2(group_id, OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME2, H5P_DEFAULT, gcpl_id,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME2);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create objects under subgroup 2 */
|
||
|
if ((linked_group_id = H5Gcreate2(subgroup_id2, OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME1, H5P_DEFAULT,
|
||
|
gcpl_id, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME1);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(linked_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME1);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((linked_group_id = H5Gcreate2(subgroup_id2, OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME2, H5P_DEFAULT,
|
||
|
gcpl_id, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME2);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(linked_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME2);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((linked_group_id = H5Gcreate2(subgroup_id2, OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME3, H5P_DEFAULT,
|
||
|
gcpl_id, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME3);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(linked_group_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME3);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Gclose(subgroup_id2) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME2);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
/* Create soft links under subgroup 1 to point to the previously-created objects */
|
||
|
if (H5Lcreate_soft("/" OBJECT_TEST_GROUP_NAME "/" OBJECT_VISIT_SOFT_LINK_TEST_SUBGROUP_NAME
|
||
|
"/" OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME2 "/" OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME1,
|
||
|
subgroup_id, OBJECT_VISIT_SOFT_LINK_TEST_LINK_NAME1, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create soft link '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_LINK_NAME1);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Lcreate_soft("/" OBJECT_TEST_GROUP_NAME "/" OBJECT_VISIT_SOFT_LINK_TEST_SUBGROUP_NAME
|
||
|
"/" OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME2 "/" OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME2,
|
||
|
subgroup_id, OBJECT_VISIT_SOFT_LINK_TEST_LINK_NAME2, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create soft link '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_LINK_NAME2);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Lcreate_soft("/" OBJECT_TEST_GROUP_NAME "/" OBJECT_VISIT_SOFT_LINK_TEST_SUBGROUP_NAME
|
||
|
"/" OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME2 "/" OBJECT_VISIT_SOFT_LINK_TEST_OBJ_NAME3,
|
||
|
subgroup_id, OBJECT_VISIT_SOFT_LINK_TEST_LINK_NAME3, H5P_DEFAULT, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create soft link '%s'\n", OBJECT_VISIT_SOFT_LINK_TEST_LINK_NAME3);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
/*
|
||
|
* NOTE: A counter is passed to the iteration callback to try to match up
|
||
|
* the expected objects with a given step throughout all of the following
|
||
|
* iterations. This is to try and check that the objects are indeed being
|
||
|
* returned in the correct order.
|
||
|
*/
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_obj_name_increasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit by object name in increasing order");
|
||
|
|
||
|
i = 0;
|
||
|
|
||
|
if (H5Ovisit3(subgroup_id, H5_INDEX_NAME, H5_ITER_INC, object_visit_soft_link_callback, &i,
|
||
|
H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit by object name in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_obj_name_increasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_obj_name_decreasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit by object name in decreasing order");
|
||
|
#ifndef NO_DECREASING_ALPHA_ITER_ORDER
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
if (H5Ovisit3(subgroup_id, H5_INDEX_NAME, H5_ITER_DEC, object_visit_soft_link_callback, &i,
|
||
|
H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit by object name in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 2 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
#else
|
||
|
SKIPPED();
|
||
|
PART_EMPTY(H5Ovisit_obj_name_decreasing);
|
||
|
#endif
|
||
|
}
|
||
|
PART_END(H5Ovisit_obj_name_decreasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_create_order_increasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit by creation order in increasing order");
|
||
|
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = 2 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
if (H5Ovisit3(subgroup_id, H5_INDEX_CRT_ORDER, H5_ITER_INC, object_visit_soft_link_callback, &i,
|
||
|
H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit by creation order in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != 3 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_create_order_increasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_create_order_decreasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit by creation order in decreasing order");
|
||
|
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = 3 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
if (H5Ovisit3(subgroup_id, H5_INDEX_CRT_ORDER, H5_ITER_DEC, object_visit_soft_link_callback, &i,
|
||
|
H5O_INFO_ALL) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit by creation order in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 4 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_create_order_decreasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_obj_name_increasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name by object name in increasing order");
|
||
|
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = 0;
|
||
|
|
||
|
/* First, test visiting using "." for the object name */
|
||
|
if (H5Ovisit_by_name3(subgroup_id, ".", H5_INDEX_NAME, H5_ITER_INC,
|
||
|
object_visit_soft_link_callback, &i, H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by object name in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
/* Reset the special counter and repeat the test using an indirect object name. */
|
||
|
i = 0;
|
||
|
|
||
|
/* Repeat the test using an indirect object name */
|
||
|
if (H5Ovisit_by_name3(group_id, OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME1, H5_INDEX_NAME,
|
||
|
H5_ITER_INC, object_visit_soft_link_callback, &i, H5O_INFO_ALL,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by object name in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_increasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_obj_name_increasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_obj_name_decreasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name by object name in decreasing order");
|
||
|
#ifndef NO_DECREASING_ALPHA_ITER_ORDER
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
/* First, test visiting using "." for the object name */
|
||
|
if (H5Ovisit_by_name3(subgroup_id, ".", H5_INDEX_NAME, H5_ITER_DEC,
|
||
|
object_visit_soft_link_callback, &i, H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by object name in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 2 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
/* Reset the special counter and repeat the test using an indirect object name. */
|
||
|
i = OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
/* Repeat the test using an indirect object name */
|
||
|
if (H5Ovisit_by_name3(group_id, OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME1, H5_INDEX_NAME,
|
||
|
H5_ITER_DEC, object_visit_soft_link_callback, &i, H5O_INFO_ALL,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by object name in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 2 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
#else
|
||
|
SKIPPED();
|
||
|
PART_EMPTY(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
#endif
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_obj_name_decreasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_create_order_increasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name by creation order in increasing order");
|
||
|
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = 2 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
/* First, test visiting using "." for the object name */
|
||
|
if (H5Ovisit_by_name3(subgroup_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC,
|
||
|
object_visit_soft_link_callback, &i, H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by creation order in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != 3 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
/* Reset the special counter and repeat the test using an indirect object name. */
|
||
|
i = 2 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
/* Repeat the test using an indirect object name */
|
||
|
if (H5Ovisit_by_name3(group_id, OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME1, H5_INDEX_CRT_ORDER,
|
||
|
H5_ITER_INC, object_visit_soft_link_callback, &i, H5O_INFO_ALL,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by creation order in increasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
if (i != 3 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_increasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_create_order_increasing);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_create_order_decreasing)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name by creation order in decreasing order");
|
||
|
|
||
|
/* Reset the counter to the appropriate value for the next test */
|
||
|
i = 3 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
/* First, test visiting using "." for the object name */
|
||
|
if (H5Ovisit_by_name3(subgroup_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC,
|
||
|
object_visit_soft_link_callback, &i, H5O_INFO_ALL, H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by creation order in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 4 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
/* Reset the special counter and repeat the test using an indirect object name. */
|
||
|
i = 3 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED;
|
||
|
|
||
|
/* Repeat the test using an indirect object name */
|
||
|
if (H5Ovisit_by_name3(group_id, OBJECT_VISIT_SOFT_LINK_TEST_GROUP_NAME1, H5_INDEX_CRT_ORDER,
|
||
|
H5_ITER_DEC, object_visit_soft_link_callback, &i, H5O_INFO_ALL,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name by creation order in decreasing order failed\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
if (i != 4 * OBJECT_VISIT_SOFT_LINK_TEST_NUM_OBJS_VISITED) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" some objects were not visited!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_create_order_decreasing);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_create_order_decreasing);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Pclose(gcpl_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(subgroup_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Pclose(gcpl_id);
|
||
|
H5Gclose(linked_group_id);
|
||
|
H5Gclose(subgroup_id);
|
||
|
H5Gclose(subgroup_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that H5Ovisit(_by_name) fails when
|
||
|
* it is passed invalid parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_object_visit_invalid_params(void)
|
||
|
{
|
||
|
herr_t err_ret = -1;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("object visiting with invalid parameters");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & H5VL_CAP_FLAG_FILE_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_ITERATE)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(
|
||
|
" API functions for basic file, group, or iterate aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_VISIT_INVALID_PARAMS_TEST_SUBGROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container sub-group '%s'\n",
|
||
|
OBJECT_VISIT_INVALID_PARAMS_TEST_SUBGROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_VISIT_INVALID_PARAMS_TEST_GROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_VISIT_INVALID_PARAMS_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Ovisit_invalid_obj_id)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit with an invalid object ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit3(H5I_INVALID_HID, H5_INDEX_NAME, H5_ITER_INC, object_visit_noop_callback,
|
||
|
NULL, H5O_INFO_ALL);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit succeeded with an invalid object ID!\n");
|
||
|
PART_ERROR(H5Ovisit_invalid_obj_id);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_invalid_obj_id);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_invalid_index_type)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit with an invalid index type");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit3(group_id, H5_INDEX_UNKNOWN, H5_ITER_INC, object_visit_noop_callback, NULL,
|
||
|
H5O_INFO_ALL);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit succeeded with invalid index type H5_INDEX_UNKNOWN!\n");
|
||
|
PART_ERROR(H5Ovisit_invalid_index_type);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit3(group_id, H5_INDEX_N, H5_ITER_INC, object_visit_noop_callback, NULL,
|
||
|
H5O_INFO_ALL);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit succeeded with invalid index type H5_INDEX_N!\n");
|
||
|
PART_ERROR(H5Ovisit_invalid_index_type);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_invalid_index_type);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_invalid_iter_order)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit with an invalid iteration ordering");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit3(group_id, H5_INDEX_NAME, H5_ITER_UNKNOWN, object_visit_noop_callback,
|
||
|
NULL, H5O_INFO_ALL);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit succeeded with invalid iteration ordering H5_ITER_UNKNOWN!\n");
|
||
|
PART_ERROR(H5Ovisit_invalid_iter_order);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit3(group_id, H5_INDEX_NAME, H5_ITER_N, object_visit_noop_callback, NULL,
|
||
|
H5O_INFO_ALL);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit succeeded with invalid iteration ordering H5_ITER_N!\n");
|
||
|
PART_ERROR(H5Ovisit_invalid_iter_order);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_invalid_iter_order);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_invalid_loc_id)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name with an invalid location ID");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit_by_name3(H5I_INVALID_HID, ".", H5_INDEX_NAME, H5_ITER_N,
|
||
|
object_visit_noop_callback, NULL, H5O_INFO_ALL, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name succeeded with an invalid location ID!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_invalid_loc_id);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_invalid_loc_id);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_invalid_obj_name)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name with an invalid object name");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit_by_name3(group_id, NULL, H5_INDEX_NAME, H5_ITER_N,
|
||
|
object_visit_noop_callback, NULL, H5O_INFO_ALL, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name succeeded with a NULL object name!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_invalid_obj_name);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit_by_name3(group_id, "", H5_INDEX_NAME, H5_ITER_N,
|
||
|
object_visit_noop_callback, NULL, H5O_INFO_ALL, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name succeeded with an invalid object name of ''!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_invalid_obj_name);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_invalid_obj_name);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_invalid_index_type)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name with an invalid index type");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit_by_name3(group_id, ".", H5_INDEX_UNKNOWN, H5_ITER_N,
|
||
|
object_visit_noop_callback, NULL, H5O_INFO_ALL, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name succeeded with invalid index type H5_INDEX_UNKNOWN!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_invalid_index_type);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit_by_name3(group_id, ".", H5_INDEX_N, H5_ITER_N, object_visit_noop_callback,
|
||
|
NULL, H5O_INFO_ALL, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name succeeded with invalid index type H5_INDEX_N!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_invalid_index_type);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_invalid_index_type);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_invalid_iter_order)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name with an invalid iteration ordering");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit_by_name3(group_id, ".", H5_INDEX_NAME, H5_ITER_UNKNOWN,
|
||
|
object_visit_noop_callback, NULL, H5O_INFO_ALL, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name succeeded with invalid iteration ordering H5_ITER_UNKNOWN!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_invalid_iter_order);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit_by_name3(group_id, ".", H5_INDEX_NAME, H5_ITER_N,
|
||
|
object_visit_noop_callback, NULL, H5O_INFO_ALL, H5P_DEFAULT);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name succeeded with invalid iteration ordering H5_ITER_N!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_invalid_iter_order);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_invalid_iter_order);
|
||
|
|
||
|
PART_BEGIN(H5Ovisit_by_name_invalid_lapl)
|
||
|
{
|
||
|
TESTING_2("H5Ovisit_by_name with an invalid LAPL");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Ovisit_by_name3(group_id, ".", H5_INDEX_NAME, H5_ITER_INC,
|
||
|
object_visit_noop_callback, NULL, H5O_INFO_ALL, H5I_INVALID_HID);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Ovisit_by_name succeeded with an invalid LAPL!\n");
|
||
|
PART_ERROR(H5Ovisit_by_name_invalid_lapl);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Ovisit_by_name_invalid_lapl);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Gclose(group_id2) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test for H5Oclose.
|
||
|
*/
|
||
|
static int
|
||
|
test_close_object(void)
|
||
|
{
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t group_id2 = H5I_INVALID_HID;
|
||
|
hid_t dtype_id = H5I_INVALID_HID;
|
||
|
hid_t dset_id = H5I_INVALID_HID;
|
||
|
hid_t dset_dtype = H5I_INVALID_HID;
|
||
|
hid_t fspace_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING_MULTIPART("H5Oclose");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC) || !(vol_cap_flags_g & H5VL_CAP_FLAG_DATASET_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_ATTR_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_STORED_DATATYPES)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, dataset, attribute, or stored datatype "
|
||
|
"aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_CLOSE_TEST_GROUP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container subgroup '%s'\n", OBJECT_CLOSE_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((fspace_id = generate_random_dataspace(OBJECT_CLOSE_TEST_SPACE_RANK, NULL, NULL, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((dset_dtype = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Oclose_group)
|
||
|
{
|
||
|
TESTING_2("H5Oclose on a group");
|
||
|
|
||
|
if ((group_id2 = H5Gcreate2(group_id, OBJECT_CLOSE_TEST_GRP_NAME, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create group '%s'\n", OBJECT_CLOSE_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oclose_group);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Gclose(group_id2);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if ((group_id2 = H5Oopen(group_id, OBJECT_CLOSE_TEST_GRP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open group '%s' with H5Oopen\n", OBJECT_CLOSE_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oclose_group);
|
||
|
}
|
||
|
|
||
|
if (H5Oclose(group_id2) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close group '%s' with H5Oclose\n", OBJECT_CLOSE_TEST_GRP_NAME);
|
||
|
PART_ERROR(H5Oclose_group);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oclose_group);
|
||
|
|
||
|
PART_BEGIN(H5Oclose_dset)
|
||
|
{
|
||
|
TESTING_2("H5Oclose on a dataset");
|
||
|
|
||
|
if ((dset_id = H5Dcreate2(group_id, OBJECT_CLOSE_TEST_DSET_NAME, dset_dtype, fspace_id,
|
||
|
H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create dataset '%s'\n", OBJECT_CLOSE_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oclose_dset);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Dclose(dset_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if ((dset_id = H5Oopen(group_id, OBJECT_CLOSE_TEST_DSET_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open dataset '%s' with H5Oopen\n", OBJECT_CLOSE_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oclose_dset);
|
||
|
}
|
||
|
|
||
|
if (H5Oclose(dset_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close dataset '%s' with H5Oclose\n", OBJECT_CLOSE_TEST_DSET_NAME);
|
||
|
PART_ERROR(H5Oclose_dset);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oclose_dset);
|
||
|
|
||
|
PART_BEGIN(H5Oclose_dtype)
|
||
|
{
|
||
|
TESTING_2("H5Oclose on a committed datatype");
|
||
|
|
||
|
if ((dtype_id = generate_random_datatype(H5T_NO_CLASS, FALSE)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create datatype '%s'\n", OBJECT_CLOSE_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oclose_dtype);
|
||
|
}
|
||
|
|
||
|
if (H5Tcommit2(group_id, OBJECT_CLOSE_TEST_TYPE_NAME, dtype_id, H5P_DEFAULT, H5P_DEFAULT,
|
||
|
H5P_DEFAULT) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't commit datatype '%s'\n", OBJECT_CLOSE_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oclose_dtype);
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Tclose(dtype_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if ((dtype_id = H5Oopen(group_id, OBJECT_CLOSE_TEST_TYPE_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open datatype '%s' with H5Oopen\n", OBJECT_CLOSE_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oclose_dtype);
|
||
|
}
|
||
|
|
||
|
if (H5Oclose(dtype_id) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't close datatype '%s' with H5Oclose\n", OBJECT_CLOSE_TEST_TYPE_NAME);
|
||
|
PART_ERROR(H5Oclose_dtype);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oclose_dtype);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Sclose(fspace_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Tclose(dset_dtype) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Sclose(fspace_id);
|
||
|
H5Tclose(dset_dtype);
|
||
|
H5Tclose(dtype_id);
|
||
|
H5Dclose(dset_id);
|
||
|
H5Gclose(group_id2);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that H5Oclose fails when it
|
||
|
* is passed invalid parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_close_object_invalid_params(void)
|
||
|
{
|
||
|
herr_t err_ret = -1;
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
|
||
|
TESTING("H5Oclose with an invalid object ID");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file or object aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
err_ret = H5Oclose(H5I_INVALID_HID);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (err_ret >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oclose succeeded with an invalid object ID!\n");
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Fclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that various objects (file, dataspace, property list,
|
||
|
* and attribute) can't be closed with H5Oclose.
|
||
|
*/
|
||
|
static int
|
||
|
test_close_invalid_objects(void)
|
||
|
{
|
||
|
hid_t file_id = H5I_INVALID_HID;
|
||
|
hid_t container_group = H5I_INVALID_HID, group_id = H5I_INVALID_HID;
|
||
|
hid_t attr_dtype = H5I_INVALID_HID;
|
||
|
hid_t attr_space_id = H5I_INVALID_HID;
|
||
|
hid_t fapl_id = H5I_INVALID_HID;
|
||
|
hid_t attr_id = H5I_INVALID_HID;
|
||
|
herr_t status;
|
||
|
|
||
|
TESTING_MULTIPART("H5Oclose invalid objects");
|
||
|
|
||
|
/* Make sure the connector supports the API functions being tested */
|
||
|
if (!(vol_cap_flags_g & (H5VL_CAP_FLAG_FILE_BASIC)) || !(vol_cap_flags_g & H5VL_CAP_FLAG_GROUP_BASIC) ||
|
||
|
!(vol_cap_flags_g & H5VL_CAP_FLAG_OBJECT_BASIC)) {
|
||
|
SKIPPED();
|
||
|
HDprintf(" API functions for basic file, group, object, dataset, attribute, or stored datatype "
|
||
|
"aren't supported with this connector\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
TESTING_2("test setup");
|
||
|
|
||
|
if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((file_id = H5Fopen(H5_api_test_filename, H5F_ACC_RDWR, fapl_id)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open file '%s'\n", H5_api_test_filename);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((container_group = H5Gopen2(file_id, OBJECT_TEST_GROUP_NAME, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't open container group '%s'\n", OBJECT_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((group_id = H5Gcreate2(container_group, OBJECT_CLOSE_INVALID_TEST_GROUP_NAME, H5P_DEFAULT,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" couldn't create container sub-group '%s'\n", OBJECT_OPEN_TEST_GROUP_NAME);
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
if ((attr_space_id = generate_random_dataspace(OBJECT_CLOSE_INVALID_TEST_SPACE_RANK, NULL, NULL, TRUE)) <
|
||
|
0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((attr_dtype = generate_random_datatype(H5T_NO_CLASS, TRUE)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
if ((attr_id = H5Acreate2(group_id, OBJECT_CLOSE_INVALID_TEST_ATTRIBUTE_NAME, attr_dtype, attr_space_id,
|
||
|
H5P_DEFAULT, H5P_DEFAULT)) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
BEGIN_MULTIPART
|
||
|
{
|
||
|
PART_BEGIN(H5Oclose_file)
|
||
|
{
|
||
|
TESTING_2("H5Oclose with an invalid object - file");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status = H5Oclose(file_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oclose succeeded with an invalid object (file)!\n");
|
||
|
PART_ERROR(H5Oclose_file);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oclose_file);
|
||
|
|
||
|
PART_BEGIN(H5Oclose_plist)
|
||
|
{
|
||
|
TESTING_2("H5Oclose with an invalid object - property list");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status = H5Oclose(fapl_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oclose succeeded with an invalid object (property list)!\n");
|
||
|
PART_ERROR(H5Oclose_plist);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oclose_plist);
|
||
|
|
||
|
PART_BEGIN(H5Oclose_dspace)
|
||
|
{
|
||
|
TESTING_2("H5Oclose with an invalid object - data space");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status = H5Oclose(attr_space_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oclose succeeded with an invalid object (data space)!\n");
|
||
|
PART_ERROR(H5Oclose_dspace);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oclose_dspace);
|
||
|
|
||
|
PART_BEGIN(H5Oclose_attribute)
|
||
|
{
|
||
|
TESTING_2("H5Oclose with an invalid object - attribute");
|
||
|
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
status = H5Oclose(attr_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
if (status >= 0) {
|
||
|
H5_FAILED();
|
||
|
HDprintf(" H5Oclose succeeded with an invalid object (attribute)!\n");
|
||
|
PART_ERROR(H5Oclose_attribute);
|
||
|
}
|
||
|
|
||
|
PASSED();
|
||
|
}
|
||
|
PART_END(H5Oclose_attribute);
|
||
|
}
|
||
|
END_MULTIPART;
|
||
|
|
||
|
TESTING_2("test cleanup");
|
||
|
|
||
|
if (H5Tclose(attr_dtype) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Aclose(attr_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Sclose(attr_space_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(group_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Gclose(container_group) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Fclose(file_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
if (H5Pclose(fapl_id) < 0)
|
||
|
TEST_ERROR;
|
||
|
|
||
|
PASSED();
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
error:
|
||
|
H5E_BEGIN_TRY
|
||
|
{
|
||
|
H5Tclose(attr_dtype);
|
||
|
H5Sclose(attr_space_id);
|
||
|
H5Aclose(attr_id);
|
||
|
H5Gclose(group_id);
|
||
|
H5Gclose(container_group);
|
||
|
H5Fclose(file_id);
|
||
|
H5Pclose(fapl_id);
|
||
|
}
|
||
|
H5E_END_TRY;
|
||
|
|
||
|
return 1;
|
||
|
} /* test_close_invalid_objects */
|
||
|
|
||
|
/*
|
||
|
* A test for H5Oflush.
|
||
|
*/
|
||
|
static int
|
||
|
test_flush_object(void)
|
||
|
{
|
||
|
TESTING("H5Oflush");
|
||
|
|
||
|
SKIPPED();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that H5Oflush fails when
|
||
|
* it is passed invalid parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_flush_object_invalid_params(void)
|
||
|
{
|
||
|
TESTING("H5Oflush with invalid parameters");
|
||
|
|
||
|
SKIPPED();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test for H5Orefresh.
|
||
|
*/
|
||
|
static int
|
||
|
test_refresh_object(void)
|
||
|
{
|
||
|
TESTING("H5Orefresh");
|
||
|
|
||
|
SKIPPED();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* A test to check that H5Orefresh fails when
|
||
|
* it is passed invalid parameters.
|
||
|
*/
|
||
|
static int
|
||
|
test_refresh_object_invalid_params(void)
|
||
|
{
|
||
|
TESTING("H5Orefresh with invalid parameters");
|
||
|
|
||
|
SKIPPED();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* H5Ocopy test callback to check that an object's attributes got copied
|
||
|
* over successfully to the new object.
|
||
|
*/
|
||
|
static herr_t
|
||
|
object_copy_attribute_iter_callback(hid_t location_id, const char *attr_name, const H5A_info_t *ainfo,
|
||
|
void *op_data)
|
||
|
{
|
||
|
size_t *counter = (size_t *)op_data;
|
||
|
htri_t types_equal;
|
||
|
char expected_name[256];
|
||
|
hid_t attr_id = H5I_INVALID_HID;
|
||
|
hid_t attr_type = H5I_INVALID_HID;
|
||
|
herr_t ret_value = H5_ITER_CONT;
|
||
|
|
||
|
UNUSED(ainfo);
|
||
|
UNUSED(op_data);
|
||
|
|
||
|
snprintf(expected_name, 256, "attr%d", (int)(*counter));
|
||
|
|
||
|
if (HDstrncmp(attr_name, expected_name, 256)) {
|
||
|
HDprintf(" attribute name '%s' did not match expected name '%s'\n", attr_name, expected_name);
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
if ((attr_id = H5Aopen(location_id, attr_name, H5P_DEFAULT)) < 0) {
|
||
|
HDprintf(" failed to open attribute '%s'\n", attr_name);
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
if ((attr_type = H5Aget_type(attr_id)) < 0) {
|
||
|
HDprintf(" failed to retrieve attribute's datatype\n");
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
if ((types_equal = H5Tequal(attr_type, H5T_NATIVE_INT)) < 0) {
|
||
|
HDprintf(" failed to determine if attribute's datatype matched what is expected\n");
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
if (!types_equal) {
|
||
|
HDprintf(" attribute datatype did not match expected H5T_NATIVE_INT\n");
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
done:
|
||
|
if (attr_type >= 0)
|
||
|
H5Tclose(attr_type);
|
||
|
if (attr_id >= 0)
|
||
|
H5Aclose(attr_id);
|
||
|
|
||
|
(*counter)++;
|
||
|
|
||
|
return ret_value;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* H5Ocopy callback to check that a copied group's soft links
|
||
|
* have not been expanded when the default copy options are
|
||
|
* used.
|
||
|
*/
|
||
|
static herr_t
|
||
|
object_copy_soft_link_non_expand_callback(hid_t group, const char *name, const H5L_info2_t *info,
|
||
|
void *op_data)
|
||
|
{
|
||
|
size_t *counter = (size_t *)op_data;
|
||
|
void *link_val_buf = NULL;
|
||
|
char expected_link_val[OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE];
|
||
|
herr_t ret_value = H5_ITER_CONT;
|
||
|
|
||
|
/* Make sure the link type is soft */
|
||
|
if (H5L_TYPE_SOFT != info->type) {
|
||
|
HDprintf(" link type was not H5L_TYPE_SOFT; link must have been expanded!\n");
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
if (NULL == (link_val_buf = calloc(1, info->u.val_size))) {
|
||
|
HDprintf(" failed to allocate buffer for link value\n");
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
/* Retrieve the link's value */
|
||
|
if (H5Lget_val(group, name, link_val_buf, info->u.val_size, H5P_DEFAULT) < 0) {
|
||
|
HDprintf(" failed to retrieve value of link '%s'\n", name);
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
/* Make sure link's value matches what is expected */
|
||
|
snprintf(expected_link_val, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE,
|
||
|
"/" OBJECT_TEST_GROUP_NAME "/" OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_SUBGROUP_NAME "/grp%d",
|
||
|
(int)(*counter));
|
||
|
|
||
|
if (strncmp(link_val_buf, expected_link_val, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE)) {
|
||
|
HDprintf(" value '%s' for link '%s' did not match expected value '%s'\n", (char *)link_val_buf,
|
||
|
name, expected_link_val);
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
done:
|
||
|
if (link_val_buf)
|
||
|
free(link_val_buf);
|
||
|
|
||
|
(*counter)++;
|
||
|
|
||
|
return ret_value;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* H5Ocopy callback to check that a copied group's soft links
|
||
|
* have been expanded when the H5O_COPY_EXPAND_SOFT_LINK_FLAG
|
||
|
* flag is specified.
|
||
|
*/
|
||
|
static herr_t
|
||
|
object_copy_soft_link_expand_callback(hid_t group, const char *name, const H5L_info2_t *info, void *op_data)
|
||
|
{
|
||
|
size_t *counter = (size_t *)op_data;
|
||
|
char expected_link_name[OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE];
|
||
|
herr_t ret_value = H5_ITER_CONT;
|
||
|
|
||
|
UNUSED(group);
|
||
|
|
||
|
/* Make sure the link type is hard */
|
||
|
if (H5L_TYPE_HARD != info->type) {
|
||
|
HDprintf(" link type was not H5L_TYPE_HARD; link must not have been expanded!\n");
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
/* Ensure that the link's name still follows the 'link1', 'link2', etc. pattern */
|
||
|
snprintf(expected_link_name, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE, "link%d", (int)(*counter));
|
||
|
|
||
|
if (strncmp(name, expected_link_name, OBJECT_COPY_GROUP_WITH_SOFT_LINKS_TEST_BUF_SIZE)) {
|
||
|
HDprintf(" link name '%s' did not match expected name '%s'\n", name, expected_link_name);
|
||
|
ret_value = H5_ITER_ERROR;
|
||
|
goto done;
|
||
|
}
|
||
|
|
||
|
done:
|
||
|
(*counter)++;
|
||
|
|
||
|
return ret_value;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* H5Ovisit callback to simply iterate recursively through all of the objects in a
|
||
|
* group and check to make sure their names match what is expected.
|
||
|
*/
|
||
|
static herr_t
|
||
|
object_visit_callback(hid_t o_id, const char *name, const H5O_info2_t *object_info, void *op_data)
|
||
|
{
|
||
|
size_t *i = (size_t *)op_data;
|
||
|
size_t counter_val = *((size_t *)op_data);
|
||
|
herr_t ret_val = 0;
|
||
|
|
||
|
UNUSED(o_id);
|
||
|
|
||
|
if (!HDstrncmp(name, ".", strlen(".") + 1) &&
|
||
|
(counter_val == 0 || counter_val == 4 || counter_val == 8 || counter_val == 12)) {
|
||
|
if (H5O_TYPE_GROUP == object_info->type)
|
||
|
goto done;
|
||
|
else
|
||
|
HDprintf(" type for object '%s' was not H5O_TYPE_GROUP\n", name);
|
||
|
}
|
||
|
else if (!HDstrncmp(name, OBJECT_VISIT_TEST_GROUP_NAME, strlen(OBJECT_VISIT_TEST_GROUP_NAME) + 1) &&
|
||
|
(counter_val == 2 || counter_val == 6 || counter_val == 9 || counter_val == 15)) {
|
||
|
if (H5O_TYPE_GROUP == object_info->type)
|
||
|
goto done;
|
||
|
else
|
||
|
HDprintf(" type for object '%s' was not H5O_TYPE_GROUP\n", name);
|
||
|
}
|
||
|
else if (!HDstrncmp(name, OBJECT_VISIT_TEST_DSET_NAME, strlen(OBJECT_VISIT_TEST_DSET_NAME) + 1) &&
|
||
|
(counter_val == 1 || counter_val == 7 || counter_val == 10 || counter_val == 14)) {
|
||
|
if (H5O_TYPE_DATASET == object_info->type)
|
||
|
goto done;
|
||
|
else
|
||
|
HDprintf(" type for object '%s' was not H5O_TYPE_DATASET\n", name);
|
||
|
}
|
||
|
else if (!HDstrncmp(name, OBJECT_VISIT_TEST_TYPE_NAME, strlen(OBJECT_VISIT_TEST_TYPE_NAME) + 1) &&
|
||
|
(counter_val == 3 || counter_val == 5 || counter_val == 11 || counter_val == 13)) {
|
||
|
if (H5O_TYPE_NAMED_DATATYPE == object_info->type)
|
||
|
goto done;
|
||
|
else
|
||
|
HDprintf(" type for object '%s' was not H5O_TYPE_NAMED_DATATYPE\n", name);
|
||
|
}
|
||
|
else
|
||
|
HDprintf(" object '%s' didn't match known names or came in an incorrect order\n", name);
|
||
|
|
||
|
ret_val = -1;
|
||
|
|
||
|
done:
|
||
|
(*i)++;
|
||
|
|
||
|
return ret_val;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* H5Ovisit callback for visiting a singular dataset.
|
||
|
*/
|
||
|
static herr_t
|
||
|
object_visit_dset_callback(hid_t o_id, const char *name, const H5O_info2_t *object_info, void *op_data)
|
||
|
{
|
||
|
herr_t ret_val = 0;
|
||
|
|
||
|
UNUSED(o_id);
|
||
|
UNUSED(op_data);
|
||
|
|
||
|
if (HDstrncmp(name, ".", strlen(".") + 1)) {
|
||
|
HDprintf(" object '%s' didn't match known names\n", name);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if (H5O_TYPE_DATASET != object_info->type) {
|
||
|
HDprintf(" object type was not H5O_TYPE_DATASET\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
return ret_val;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* H5Ovisit callback for visiting a singular committed datatype.
|
||
|
*/
|
||
|
static herr_t
|
||
|
object_visit_dtype_callback(hid_t o_id, const char *name, const H5O_info2_t *object_info, void *op_data)
|
||
|
{
|
||
|
herr_t ret_val = 0;
|
||
|
|
||
|
UNUSED(o_id);
|
||
|
UNUSED(op_data);
|
||
|
|
||
|
if (HDstrncmp(name, ".", strlen(".") + 1)) {
|
||
|
HDprintf(" object '%s' didn't match known names\n", name);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if (H5O_TYPE_NAMED_DATATYPE != object_info->type) {
|
||
|
HDprintf(" object type was not H5O_TYPE_NAMED_DATATYPE\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
return ret_val;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* H5Ovisit callback for testing ignoring of
|
||
|
* soft links during object visiting.
|
||
|
*/
|
||
|
static herr_t
|
||
|
object_visit_soft_link_callback(hid_t o_id, const char *name, const H5O_info2_t *object_info, void *op_data)
|
||
|
{
|
||
|
size_t *i = (size_t *)op_data;
|
||
|
size_t counter_val = *((size_t *)op_data);
|
||
|
herr_t ret_val = 0;
|
||
|
|
||
|
UNUSED(o_id);
|
||
|
|
||
|
if (!HDstrncmp(name, ".", strlen(".") + 1) && (counter_val <= 5)) {
|
||
|
if (H5O_TYPE_GROUP == object_info->type)
|
||
|
goto done;
|
||
|
else
|
||
|
HDprintf(" type for object '%s' was not H5O_TYPE_GROUP\n", name);
|
||
|
}
|
||
|
else
|
||
|
HDprintf(" object '%s' didn't match known names or came in an incorrect order\n", name);
|
||
|
|
||
|
ret_val = -1;
|
||
|
|
||
|
done:
|
||
|
(*i)++;
|
||
|
|
||
|
return ret_val;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* H5Ovisit callback to simply iterate through all of the objects in a given
|
||
|
* group.
|
||
|
*/
|
||
|
static herr_t
|
||
|
object_visit_noop_callback(hid_t o_id, const char *name, const H5O_info2_t *object_info, void *op_data)
|
||
|
{
|
||
|
UNUSED(o_id);
|
||
|
UNUSED(name);
|
||
|
UNUSED(object_info);
|
||
|
UNUSED(op_data);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Cleanup temporary test files
|
||
|
*/
|
||
|
static void
|
||
|
cleanup_files(void)
|
||
|
{
|
||
|
H5Fdelete(OBJECT_COPY_BETWEEN_FILES_TEST_FILE_NAME, H5P_DEFAULT);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
H5_api_object_test(void)
|
||
|
{
|
||
|
size_t i;
|
||
|
int nerrors;
|
||
|
|
||
|
HDprintf("**********************************************\n");
|
||
|
HDprintf("* *\n");
|
||
|
HDprintf("* API Object Tests *\n");
|
||
|
HDprintf("* *\n");
|
||
|
HDprintf("**********************************************\n\n");
|
||
|
|
||
|
for (i = 0, nerrors = 0; i < ARRAY_LENGTH(object_tests); i++) {
|
||
|
nerrors += (*object_tests[i])() ? 1 : 0;
|
||
|
}
|
||
|
|
||
|
HDprintf("\n");
|
||
|
|
||
|
HDprintf("Cleaning up testing files\n");
|
||
|
cleanup_files();
|
||
|
|
||
|
return nerrors;
|
||
|
}
|