summaryrefslogtreecommitdiffstats
path: root/test/reserved.c
blob: fb484c8c565baa77a8e9a1fc8dce180c698219b3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 * Copyright by The HDF Group.                                               *
 * Copyright by the Board of Trustees of the University of Illinois.         *
 * All rights reserved.                                                      *
 *                                                                           *
 * This file is part of HDF5.  The full HDF5 copyright notice, including     *
 * terms governing use, modification, and redistribution, is contained in    *
 * the COPYING file, which can be found at the root of the source code       *
 * distribution tree, or in https://www.hdfgroup.org/licenses.               *
 * If you do not have access to either file, you may request a copy from     *
 * help@hdfgroup.org.                                                        *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

#include "h5test.h"

#ifdef BROKEN
const char *FILENAME[] = {"rsrv_heap", "rsrv_ohdr", "rsrv_vlen", NULL};

/*-------------------------------------------------------------------------
 * Function:    rsrv_heap
 *
 * Purpose:    Ensure that heaps reserve file address space.
 *            This function does this by creating datasets up to and past
 *            the limit of the file, then ensuring that an error (not an
 *            assert) was generated and that the file is readable.
 *
 * Return:    Success:    0
 *        Failure:    1
 *
 * Programmer:    James Laird
 *              Nat Furrer
 *              Friday, May 28, 2004
 *
 * Modifications:
 *
 *-------------------------------------------------------------------------
 */
static herr_t
rsrv_heap(void)
{
    hid_t   file_id = (-1), dataset_id = (-1), dataspace_id = (-1);
    hid_t   fapl = (-1), fcpl = (-1);
    hsize_t dims[1] = {1};
    char    filename[1024], dset_name[10];
    int     i;

    TESTING("Reserving file space for heap");

    /* Create a new file. */
    fapl = h5_fileaccess();

    h5_fixname(FILENAME[0], fapl, filename, sizeof filename);
    /* Set file address sizes to be very small. */
    fcpl = H5Pcreate(H5P_FILE_CREATE);
    if (fcpl < 0)
        TEST_ERROR;
    if (H5Pset_sizes(fcpl, (size_t)2, (size_t)2) < 0)
        TEST_ERROR;

    file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl);
    if (file_id < 0)
        TEST_ERROR;

    /* Write datasets until the file is full, at which point HDF5
     * should throw an error.
     */
    for (i = 0; i < 200; i++) {
        H5E_BEGIN_TRY
        {
            dataspace_id = H5Screate_simple(1, dims, dims);
        }
        H5E_END_TRY

        HDsnprintf(dset_name, sizeof(dset_name), "Dset %d", i);

        H5E_BEGIN_TRY
        {
            dataset_id = H5Dcreate2(file_id, dset_name, H5T_NATIVE_INT, dataspace_id, H5P_DEFAULT,
                                    H5P_DEFAULT, H5P_DEFAULT);
        }
        H5E_END_TRY

        if (dataset_id < 0)
            break;

        H5E_BEGIN_TRY
        {
            H5Dwrite(dataset_id, H5T_NATIVE_INT, dataspace_id, dataspace_id, H5P_DEFAULT, &i);
        }
        H5E_END_TRY

        if (H5Dclose(dataset_id) < 0)
            TEST_ERROR;
        if (H5Sclose(dataspace_id) < 0)
            TEST_ERROR;
    } /* end for */

    /* The loop should have broken before completing--the file should not have had
     * enough address space to hold 200 datasets (or this test needs to be updated!).
     */
    if (i == 200)
        TEST_ERROR;

    /* Close the file, property lists, and library */
    if (H5Fclose(file_id) < 0)
        TEST_ERROR;
    if (H5Pclose(fapl) < 0)
        TEST_ERROR;
    if (H5Pclose(fcpl) < 0)
        TEST_ERROR;
    if (H5close() < 0)
        TEST_ERROR;

    /* Re-open the library and try to read a dataset from the file we created */
    if (H5open() < 0)
        TEST_ERROR;

    HDsnprintf(dset_name, sizeof(dset_name), "Dset %d", i - 2);

    file_id = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT);
    if (file_id < 0)
        TEST_ERROR;

    dataset_id = H5Dopen2(file_id, dset_name, H5P_DEFAULT);

    /* If we can read a dataset from the file, the file has been flushed to disk
     * (if the heap or object headers weren't flushed, the file would be empty).
     */
    if (dataset_id == H5I_INVALID_HID)
        TEST_ERROR;

    if (H5Dclose(dataset_id) < 0)
        TEST_ERROR;
    if (H5Fclose(file_id) < 0)
        TEST_ERROR;

    PASSED();
    return 0;

error:
    /* Close everything we can and exit */
    H5E_BEGIN_TRY
    {
        H5Dclose(dataset_id);
        H5Sclose(dataspace_id);
        H5Pclose(fcpl);
        H5Pclose(fapl);
        H5Fclose(file_id);
    }
    H5E_END_TRY
    return 1;
}

/*-------------------------------------------------------------------------
 * Function:    rsrv_ohdr
 *
 * Purpose:    Ensure that object headers reserve file address space.
 *            This function does this by creating attributes of a dataset
 *            past the limit of the file, then ensuring that an error (not
 *            an assert) was generated and that the file is readable.
 *
 * Return:    Success:    0
 *        Failure:    1
 *
 * Programmer:    James Laird
 *              Nat Furrer
 *              Friday, May 28, 2004
 *
 * Modifications:
 *
 *-------------------------------------------------------------------------
 */
static herr_t
rsrv_ohdr(void)
{
    hid_t   file_id = (-1), dataset_id = (-1), dataspace_id = (-1);
    hid_t   fapl = (-1), fcpl = (-1), aid, attr_id;
    hsize_t dims[2];
    herr_t  status;
    int     attrval[4][6];
    char    filename[1024], attrname[20];
    int     i;

    TESTING("Reserving file space for object headers");

    /* Create a new file */
    fapl = h5_fileaccess();
    h5_fixname(FILENAME[1], fapl, filename, sizeof filename);

    fcpl = H5Pcreate(H5P_FILE_CREATE);
    if (fcpl < 0)
        TEST_ERROR;
    if (H5Pset_sizes(fcpl, (size_t)2, (size_t)2) < 0)
        TEST_ERROR;

    file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl);
    if (file_id < 0)
        TEST_ERROR;

    /* Create the data space for the dataset. */
    dims[0]      = 4;
    dims[1]      = 6;
    dataspace_id = H5Screate_simple(2, dims, NULL);
    if (dataspace_id < 0)
        TEST_ERROR;

    /* Create the dataset. */
    dataset_id =
        H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
    if (dataset_id < 0)
        TEST_ERROR;

    for (i = 0; i < 6; i++) {
        attrval[0][i] = 0;
        attrval[1][i] = 1;
        attrval[2][i] = 2;
        attrval[3][i] = 3;
    } /* end for */

    for (i = 0; i < 2000; i++) {
        HDsnprintf(attrname, sizeof(attrname), "attr %d", i);
        H5E_BEGIN_TRY
        {
            aid     = H5Screate_simple(2, dims, NULL);
            attr_id = H5Acreate2(dataset_id, attrname, H5T_STD_I32BE, aid, H5P_DEFAULT, H5P_DEFAULT);
            H5Awrite(attr_id, H5T_NATIVE_INT, attrval);
            status = H5Aclose(attr_id);
        }
        H5E_END_TRY

        if (status < 0)
            break;
    } /* end for */

    /* The loop should have broken before completing--the file should not have had
     * enough address space to hold 2000 attributes (or this test needs to be updated
!).
     */
    if (i == 2000)
        TEST_ERROR;

    /* End access to the dataset and dataspace and release resources. */
    if (H5Dclose(dataset_id) < 0)
        TEST_ERROR;
    if (H5Pclose(fapl) < 0)
        TEST_ERROR;
    if (H5Pclose(fcpl) < 0)
        TEST_ERROR;
    if (H5Sclose(dataspace_id) < 0)
        TEST_ERROR;

    /* Close the file and the library. */
    if (H5Fclose(file_id) < 0)
        TEST_ERROR;
    if (H5close() < 0)
        TEST_ERROR;

    /* Re-open the library and try to read a dataset from the file we created */
    if (H5open() < 0)
        TEST_ERROR;

    file_id = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT);
    if (file_id < 0)
        TEST_ERROR;

    dataset_id = H5Dopen2(file_id, "/dset", H5P_DEFAULT);

    /* If we can read the dataset from the file, the file has been flushed to disk
     * (if the heap or object headers weren't flushed, the file would be empty).
     */
    if (dataset_id == H5I_INVALID_HID)
        TEST_ERROR;

    if (H5Dclose(dataset_id) < 0)
        TEST_ERROR;
    if (H5Fclose(file_id) < 0)
        TEST_ERROR;

    PASSED();
    return 0;

error:
    /* Close everything we can and exit */
    H5E_BEGIN_TRY
    {
        H5Dclose(dataset_id);
        H5Sclose(dataspace_id);
        H5Pclose(fcpl);
        H5Pclose(fapl);
        H5Fclose(file_id);
    }
    H5E_END_TRY
    return 1;
}

/*-------------------------------------------------------------------------
 * Function:    rsrv_vlen
 *
 * Purpose:    Ensure that variable length datatypes properly ensure that
 *              enough file address space exists before writing.
 *        This function does this by creating a dataset containing
 *              variable length data past the limit of the file, then
 *              ensuring that an error (not an assert) was generated and
 *              that the file is readable.
 *
 * Return:    Success:    0
 *        Failure:    1
 *
 * Programmer:    James Laird
 *        Nat Furrer
 *              Thursday, July 1, 2004
 *
 * Modifications:
 *
 *-------------------------------------------------------------------------
 */
static herr_t
rsrv_vlen(void)
{
    hid_t    file_id = (-1), dataset_id = (-1), dataspace_id = (-1), type_id = (-1);
    hid_t    fapl = (-1), fcpl = (-1), mem_space_id = (-1);
    hssize_t offset[1];
    hsize_t  start[1];
    hsize_t  dims[1], count[1];
    herr_t   status;
    int      i;
    int      write_buf[20];
    char     filename[1024];
    hvl_t    vlen_data;

    TESTING("Reserved space with variable length data");

    /* Create a new file */
    fapl = h5_fileaccess();
    h5_fixname(FILENAME[2], fapl, filename, sizeof filename);

    /* Make file address space very small */
    fcpl = H5Pcreate(H5P_FILE_CREATE);
    if (fcpl < 0)
        TEST_ERROR;
    if (H5Pset_sizes(fcpl, (size_t)2, (size_t)2) < 0)
        TEST_ERROR;

    file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl, fapl);
    if (file_id < 0)
        TEST_ERROR;

    /* Create the data space for the dataset. */
    dims[0]      = 2000;
    dataspace_id = H5Screate_simple(1, dims, NULL);
    if (dataspace_id < 0)
        TEST_ERROR;

    /* Create a variable length type */
    type_id = H5Tvlen_create(H5T_NATIVE_INT);
    if (type_id < 0)
        TEST_ERROR;

    /* Create the dataset. */
    dataset_id = H5Dcreate2(file_id, "/dset", type_id, dataspace_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
    if (dataset_id < 0)
        TEST_ERROR;

    /* Create some data to write */
    for (i = 0; i < 20; i++)
        write_buf[i] = i + 1;
    vlen_data.p = write_buf;

    /* Create a memory dataspace for writing */
    dims[0]      = 1;
    mem_space_id = H5Screate_simple(1, dims, NULL);
    if (mem_space_id < 0)
        TEST_ERROR;

    /* Create a selection to write to */
    start[0] = 0;
    count[0] = 1;
    if (H5Sselect_hyperslab(dataspace_id, H5S_SELECT_SET, start, NULL, count, NULL) < 0)
        TEST_ERROR;

    for (i = 0; i < 2000; i++) {
        vlen_data.len = (i % 20) + 1;

        offset[0] = i;
        if (H5Soffset_simple(dataspace_id, offset) < 0)
            TEST_ERROR;

        H5E_BEGIN_TRY
        status = H5Dwrite(dataset_id, type_id, mem_space_id, dataspace_id, H5P_DEFAULT, &vlen_data);
        H5E_END_TRY

        if (status < 0)
            break;
    } /* end for */

    /* The loop should have broken before completing--the file should not have had
     * enough address space to hold 2000 attributes (or this test needs to be updated!).
     */
    if (i == 2000)
        TEST_ERROR;

    /* End access to the dataset and dataspace and release resources. */
    if (H5Dclose(dataset_id) < 0)
        TEST_ERROR;
    if (H5Pclose(fcpl) < 0)
        TEST_ERROR;
    if (H5Pclose(fapl) < 0)
        TEST_ERROR;
    if (H5Sclose(dataspace_id) < 0)
        TEST_ERROR;
    if (H5Tclose(type_id) < 0)
        TEST_ERROR;
    if (H5Sclose(mem_space_id) < 0)
        TEST_ERROR;

    /* Close the file and the library. */
    if (H5Fclose(file_id) < 0)
        TEST_ERROR;
    if (H5close() < 0)
        TEST_ERROR;

    /* Re-open the library and try to read a dataset from the file we created */
    if (H5open() < 0)
        TEST_ERROR;

    file_id = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT);
    if (file_id < 0)
        TEST_ERROR;

    dataset_id = H5Dopen2(file_id, "/dset", H5P_DEFAULT);

    /* If we can read the dataset from the file, the file has been flushed to disk
     * (if the heap or object headers weren't flushed, the file would be empty).
     */
    if (dataset_id == H5I_INVALID_HID)
        TEST_ERROR;

    if (H5Dclose(dataset_id) < 0)
        TEST_ERROR;
    if (H5Fclose(file_id) < 0)
        TEST_ERROR;

    PASSED();
    return 0;

error:
    /* Close everything we can and exit */
    H5E_BEGIN_TRY
    {
        H5Dclose(dataset_id);
        H5Sclose(dataspace_id);
        H5Sclose(mem_space_id);
        H5Tclose(type_id);
        H5Pclose(fcpl);
        H5Pclose(fapl);
        H5Fclose(file_id);
    }
    H5E_END_TRY
    return 1;
}
#endif /* BROKEN */

/*-------------------------------------------------------------------------
 * Function:    main
 *
 * Purpose:
 *
 * Return:    Success:
 *
 *        Failure:
 *
 * Programmer:    Nat Furrer and James Laird
 *              Thursday, July 1, 2004
 *
 * Modifications:
 *
 *-------------------------------------------------------------------------
 */
int
main(void)
{
    /* This test is currently not working properly; it should be revisited
     * when we have time.
     *
     * (Also, we should try to make this test work with all the VFDs)
     */
#ifdef BROKEN
    int         num_errs = 0;
    hid_t       fapl;
    const char *envval = NULL;

    envval = HDgetenv(HDF5_DRIVER);
    if (envval == NULL)
        envval = "nomatch";
    /* QAK: should be able to use the core driver? */
    if (HDstrcmp(envval, "core") && HDstrcmp(envval, "split") && HDstrcmp(envval, "multi") &&
        HDstrcmp(envval, "family")) {
        num_errs += rsrv_ohdr();
        num_errs += rsrv_heap();
        num_errs += rsrv_vlen();

        if (num_errs > 0)
            HDprintf("**** %d FAILURE%s! ****\n", num_errs, num_errs == 1 ? "" : "S");
        else
            HDputs("All address space reservation tests passed.");

        fapl = h5_fileaccess();
        h5_cleanup(FILENAME, fapl);
        return num_errs;
    }
    else {
        HDputs("All address space reservation tests skipped - Incompatible with current Virtual File Driver");
    }
#endif /* BROKEN */

    SKIPPED();
    return 0;
}
an class="hl opt">, H5P_DEFAULT, filename, sizeof filename); /* Create a new HDF5 file */ fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); /* Create a group, dataset, and committed datatype within the file */ /* Create the group */ grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(grp, FAIL, "H5Gcreate2"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); /* Commit the type inside the group */ dtype = H5Tcopy(H5T_NATIVE_INT); CHECK(dtype, FAIL, "H5Tcopy"); ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Tcommit2"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); /* Create the data space for the dataset. */ dims[0] = DIM0; dims[1] = DIM1; dspace = H5Screate_simple(RANK, dims, NULL); CHECK(dspace, FAIL, "H5Screate_simple"); /* Create the dataset. */ dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(dset, FAIL, "H5Dcreate2"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); /* Now make sure that H5Oopen can open all three types of objects */ grp = H5Oopen(fid, "group", H5P_DEFAULT); CHECK(grp, FAIL, "H5Oopen"); dtype = H5Oopen(fid, "group/datatype", H5P_DEFAULT); CHECK(dtype, FAIL, "H5Oopen"); /* Check that we can use the group as a valid location */ dset = H5Oopen(grp, "/dataset", H5P_DEFAULT); CHECK(dset, FAIL, "H5Oopen"); /* Make sure that each is the right kind of ID */ id_type = H5Iget_type(grp); VERIFY(id_type, H5I_GROUP, "H5Iget_type for group ID"); id_type = H5Iget_type(dtype); VERIFY(id_type, H5I_DATATYPE, "H5Iget_type for datatype ID"); id_type = H5Iget_type(dset); VERIFY(id_type, H5I_DATASET, "H5Iget_type for dataset ID"); /* Do something more complex with each of the IDs to make sure they "work" */ ret = H5Gget_info(grp, &ginfo); CHECK(ret, FAIL, "H5Gget_info"); VERIFY(ginfo.nlinks, 1, "H5Gget_info"); /* There should be one object, the datatype */ type_class = H5Tget_class(dtype); VERIFY(type_class, H5T_INTEGER, "H5Tget_class"); dspace = H5Dget_space(dset); CHECK(dspace, FAIL, "H5Dget_space"); /* Close the IDs */ ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); /* Trying to open objects with bogus names should fail gracefully */ H5E_BEGIN_TRY { grp = H5Oopen(fid, "bogus_group", H5P_DEFAULT); VERIFY(grp, FAIL, "H5Oopen"); dtype = H5Oopen(fid, "group/bogus_datatype", H5P_DEFAULT); VERIFY(dtype, FAIL, "H5Oopen"); dset = H5Oopen(fid, "/bogus_dataset", H5P_DEFAULT); VERIFY(dset, FAIL, "H5Oopen"); } H5E_END_TRY /* Close the file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); /* Trying to open an object with a bogus file ID should fail */ H5E_BEGIN_TRY { dset = H5Oopen(fid, "dataset", H5P_DEFAULT); VERIFY(dset, FAIL, "H5Oopen"); } H5E_END_TRY } /* test_h5o_open() */ /**************************************************************** ** ** test_h5o_close(): Test H5Oclose function. ** ****************************************************************/ static void test_h5o_close(void) { hid_t fid; /* HDF5 File ID */ hid_t grp, dset, dtype, dspace; /* Object identifiers */ char filename[1024]; hsize_t dims[RANK]; herr_t ret; /* Value returned from API calls */ h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); /* Create a new HDF5 file */ fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); /* Create a group, dataset, and committed datatype within the file */ /* Create the group and close it with H5Oclose */ grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(grp, FAIL, "H5Gcreate2"); VERIFY_TYPE(H5Iget_type(grp), H5I_GROUP, H5I_type_t, "%d", "H5Iget_type"); ret = H5Oclose(grp); CHECK(ret, FAIL, "H5Oclose"); /* Commit the type inside the group */ dtype = H5Tcopy(H5T_NATIVE_INT); CHECK(dtype, FAIL, "H5Tcopy"); ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Tcommit2"); ret = H5Oclose(dtype); CHECK(ret, FAIL, "H5Oclose"); /* Create the data space for the dataset. */ dims[0] = DIM0; dims[1] = DIM1; dspace = H5Screate_simple(RANK, dims, NULL); CHECK(dspace, FAIL, "H5Screate_simple"); /* Create the dataset. */ dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(dset, FAIL, "H5Dcreate2"); ret = H5Oclose(dset); CHECK(ret, FAIL, "H5Oclose"); /* Attempting to close the data space with H5Oclose should fail */ H5E_BEGIN_TRY { ret = H5Oclose(dspace); VERIFY(ret, FAIL, "H5Oclose"); } H5E_END_TRY /* Close the dataspace for real */ ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); /* Make sure that H5Oclose can close objects opened with H5Oopen */ grp = H5Oopen(fid, "group", H5P_DEFAULT); CHECK(grp, FAIL, "H5Oopen"); dtype = H5Oopen(fid, "group/datatype", H5P_DEFAULT); CHECK(dtype, FAIL, "H5Oopen"); dset = H5Oopen(fid, "dataset", H5P_DEFAULT); CHECK(dset, FAIL, "H5Oopen"); ret = H5Oclose(grp); CHECK(ret, FAIL, "H5Oclose"); ret = H5Oclose(dtype); CHECK(ret, FAIL, "H5Oclose"); ret = H5Oclose(dset); CHECK(ret, FAIL, "H5Oclose"); /* Make sure H5Oclose can close objects opened with H5*open */ grp = H5Gopen2(fid, "group", H5P_DEFAULT); CHECK(grp, FAIL, "H5Gopen2"); dtype = H5Topen2(fid, "group/datatype", H5P_DEFAULT); CHECK(dtype, FAIL, "H5Topen2"); dset = H5Dopen2(fid, "dataset", H5P_DEFAULT); CHECK(dset, FAIL, "H5Dopen2"); ret = H5Oclose(grp); CHECK(ret, FAIL, "H5Oclose"); ret = H5Oclose(dtype); CHECK(ret, FAIL, "H5Oclose"); ret = H5Oclose(dset); CHECK(ret, FAIL, "H5Oclose"); /* Close the file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); } #ifndef H5_NO_DEPRECATED_SYMBOLS /**************************************************************** ** ** test_h5o_open_by_addr(): Test H5Oopen_by_addr function. ** ****************************************************************/ static void test_h5o_open_by_addr(void) { hid_t fid; /* HDF5 File ID */ hid_t grp, dset, dtype, dspace; /* Object identifiers */ char filename[1024]; H5L_info2_t li; /* Buffer for H5Lget_info2 */ haddr_t grp_addr; /* Addresses for objects */ haddr_t dset_addr; haddr_t dtype_addr; hsize_t dims[RANK]; H5I_type_t id_type; /* Type of IDs returned from H5Oopen */ H5G_info_t ginfo; /* Group info struct */ H5T_class_t type_class; /* Class of the datatype */ herr_t ret; /* Value returned from API calls */ h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); /* Create a new HDF5 file */ fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); /* Create a group, dataset, and committed datatype within the file */ /* Create the group */ grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(grp, FAIL, "H5Gcreate2"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); /* Commit the type inside the group */ dtype = H5Tcopy(H5T_NATIVE_INT); CHECK(dtype, FAIL, "H5Tcopy"); ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Tcommit2"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); /* Create the data space for the dataset. */ dims[0] = DIM0; dims[1] = DIM1; dspace = H5Screate_simple(RANK, dims, NULL); CHECK(dspace, FAIL, "H5Screate_simple"); /* Create the dataset. */ dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(dset, FAIL, "H5Dcreate2"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); /* Get address for each object */ ret = H5Lget_info2(fid, "group", &li, H5P_DEFAULT); CHECK(ret, FAIL, "H5Lget_info2"); ret = H5VLnative_token_to_addr(fid, li.u.token, &grp_addr); CHECK(ret, FAIL, "H5VLnative_token_to_addr"); ret = H5Lget_info2(fid, "group/datatype", &li, H5P_DEFAULT); CHECK(ret, FAIL, "H5Lget_info2"); ret = H5VLnative_token_to_addr(fid, li.u.token, &dtype_addr); CHECK(ret, FAIL, "H5VLnative_token_to_addr"); ret = H5Lget_info2(fid, "dataset", &li, H5P_DEFAULT); CHECK(ret, FAIL, "H5Lget_info2"); ret = H5VLnative_token_to_addr(fid, li.u.token, &dset_addr); CHECK(ret, FAIL, "H5VLnative_token_to_addr"); /* Now make sure that H5Oopen_by_addr can open all three types of objects */ grp = H5Oopen_by_addr(fid, grp_addr); CHECK(grp, FAIL, "H5Oopen_by_addr"); dtype = H5Oopen_by_addr(fid, dtype_addr); CHECK(dtype, FAIL, "H5Oopen_by_addr"); /* Check that we can use the group ID as a valid location */ dset = H5Oopen_by_addr(grp, dset_addr); CHECK(dset, FAIL, "H5Oopen_by_addr"); /* Make sure that each is the right kind of ID */ id_type = H5Iget_type(grp); VERIFY(id_type, H5I_GROUP, "H5Iget_type for group ID"); id_type = H5Iget_type(dtype); VERIFY(id_type, H5I_DATATYPE, "H5Iget_type for datatype ID"); id_type = H5Iget_type(dset); VERIFY(id_type, H5I_DATASET, "H5Iget_type for dataset ID"); /* Do something more complex with each of the IDs to make sure they "work" */ ret = H5Gget_info(grp, &ginfo); CHECK(ret, FAIL, "H5Gget_info"); VERIFY(ginfo.nlinks, 1, "H5Gget_info"); /* There should be one object, the datatype */ type_class = H5Tget_class(dtype); VERIFY(type_class, H5T_INTEGER, "H5Tget_class"); dspace = H5Dget_space(dset); CHECK(dspace, FAIL, "H5Dget_space"); /* Close the IDs */ ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); /* Try giving some bogus values to H5O_open_by_addr. */ /* Try to open an object with a bad address */ grp_addr += 20; H5E_BEGIN_TRY { grp = H5Oopen_by_addr(fid, grp_addr); } H5E_END_TRY VERIFY(grp, FAIL, "H5Oopen_by_addr"); /* For instance, an objectno smaller than the end of the file's superblock should * trigger an error */ grp_addr = 10; H5E_BEGIN_TRY { grp = H5Oopen_by_addr(fid, grp_addr); } H5E_END_TRY VERIFY(grp, FAIL, "H5Oopen_by_addr"); /* Likewise, an objectno larger than the size of the file should fail */ grp_addr = 0; grp_addr = 1000000000; H5E_BEGIN_TRY { grp = H5Oopen_by_addr(fid, grp_addr); } H5E_END_TRY VERIFY(grp, FAIL, "H5Oopen_by_addr"); ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); /* Also, trying to open an object without a valid location should fail */ H5E_BEGIN_TRY { dtype = H5Oopen_by_addr(fid, dtype_addr); } H5E_END_TRY VERIFY(dtype, FAIL, "H5Oopen_by_addr"); } /* test_h5o_open_by_addr() */ #endif /* H5_NO_DEPRECATED_SYMBOLS */ /**************************************************************** ** ** test_h5o_open_by_token(): Test H5Oopen_by_token function. ** ****************************************************************/ static void test_h5o_open_by_token(void) { hid_t fid; /* HDF5 File ID */ hid_t grp, dset, dtype, dspace; /* Object identifiers */ char filename[1024]; H5L_info2_t li; /* Buffer for H5Lget_info */ hsize_t dims[RANK]; H5I_type_t id_type; /* Type of IDs returned from H5Oopen */ H5G_info_t ginfo; /* Group info struct */ H5T_class_t type_class; /* Class of the datatype */ herr_t ret; /* Value returned from API calls */ h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); /* Create a new HDF5 file */ fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); /* Create a group, dataset, and committed datatype within the file */ /* Create the group */ grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(grp, FAIL, "H5Gcreate2"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); /* Commit the type inside the group */ dtype = H5Tcopy(H5T_NATIVE_INT); CHECK(dtype, FAIL, "H5Tcopy"); ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Tcommit2"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); /* Create the data space for the dataset. */ dims[0] = DIM0; dims[1] = DIM1; dspace = H5Screate_simple(RANK, dims, NULL); CHECK(dspace, FAIL, "H5Screate_simple"); /* Create the dataset. */ dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(dset, FAIL, "H5Dcreate2"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); /* Make sure that H5Oopen_by_token can open all three types of objects */ ret = H5Lget_info2(fid, "group", &li, H5P_DEFAULT); CHECK(ret, FAIL, "H5Lget_info"); grp = H5Oopen_by_token(fid, li.u.token); CHECK(grp, FAIL, "H5Oopen_by_token"); ret = H5Lget_info2(fid, "group/datatype", &li, H5P_DEFAULT); CHECK(ret, FAIL, "H5Lget_info"); dtype = H5Oopen_by_token(fid, li.u.token); CHECK(dtype, FAIL, "H5Oopen_by_token"); ret = H5Lget_info2(fid, "dataset", &li, H5P_DEFAULT); CHECK(ret, FAIL, "H5Lget_info"); /* Check that we can use the group ID as a valid location */ dset = H5Oopen_by_token(grp, li.u.token); CHECK(dset, FAIL, "H5Oopen_by_token"); /* Make sure that each is the right kind of ID */ id_type = H5Iget_type(grp); VERIFY(id_type, H5I_GROUP, "H5Iget_type for group ID"); id_type = H5Iget_type(dtype); VERIFY(id_type, H5I_DATATYPE, "H5Iget_type for datatype ID"); id_type = H5Iget_type(dset); VERIFY(id_type, H5I_DATASET, "H5Iget_type for dataset ID"); /* Do something more complex with each of the IDs to make sure they "work" */ ret = H5Gget_info(grp, &ginfo); CHECK(ret, FAIL, "H5Gget_info"); VERIFY(ginfo.nlinks, 1, "H5Gget_info"); /* There should be one object, the datatype */ type_class = H5Tget_class(dtype); VERIFY(type_class, H5T_INTEGER, "H5Tget_class"); dspace = H5Dget_space(dset); CHECK(dspace, FAIL, "H5Dget_space"); /* Close the IDs */ ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); /* Try giving some bogus values to H5O_open_by_token */ /* Try opening an object using H5O_TOKEN_UNDEF (should fail) */ H5E_BEGIN_TRY { dtype = H5Oopen_by_token(fid, H5O_TOKEN_UNDEF); } H5E_END_TRY VERIFY(dtype, FAIL, "H5Oopen_by_token"); ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); /* Also, trying to open an object without a valid location (should fail) */ H5E_BEGIN_TRY { dtype = H5Oopen_by_token(fid, li.u.token); } H5E_END_TRY VERIFY(dtype, FAIL, "H5Oopen_by_token"); } /* test_h5o_open_by_token() */ /**************************************************************** ** ** test_h5o_refcount(): Test H5O refcounting functions. ** ****************************************************************/ static void test_h5o_refcount(void) { hid_t fid; /* HDF5 File ID */ hid_t grp, dset, dtype, dspace; /* Object identifiers */ char filename[1024]; H5O_info2_t oinfo; /* Object info struct */ hsize_t dims[RANK]; herr_t ret; /* Value returned from API calls */ h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); /* Create a new HDF5 file */ fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); /* Create a group, dataset, and committed datatype within the file */ /* Create the group */ grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(grp, FAIL, "H5Gcreate2"); /* Commit the type inside the group */ dtype = H5Tcopy(H5T_NATIVE_INT); CHECK(dtype, FAIL, "H5Tcopy"); ret = H5Tcommit2(fid, "datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Tcommit2"); /* Create the data space for the dataset. */ dims[0] = DIM0; dims[1] = DIM1; dspace = H5Screate_simple(RANK, dims, NULL); CHECK(dspace, FAIL, "H5Screate_simple"); /* Create the dataset. */ dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(dset, FAIL, "H5Dcreate2"); ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); /* Get ref counts for each object. They should all be 1, since each object has a hard link. */ ret = H5Oget_info_by_name3(fid, "group", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); ret = H5Oget_info_by_name3(fid, "datatype", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); ret = H5Oget_info_by_name3(fid, "dataset", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); /* Increment each object's reference count. */ ret = H5Oincr_refcount(grp); CHECK(ret, FAIL, "H5Oincr_refcount"); ret = H5Oincr_refcount(dtype); CHECK(ret, FAIL, "H5Oincr_refcount"); ret = H5Oincr_refcount(dset); CHECK(ret, FAIL, "H5Oincr_refcount"); /* Get ref counts for each object. They should all be 2 now. */ ret = H5Oget_info_by_name3(fid, "group", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); ret = H5Oget_info_by_name3(fid, "datatype", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); ret = H5Oget_info_by_name3(fid, "dataset", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); /* Decrement the reference counts and check that they decrease back to 1. */ ret = H5Odecr_refcount(grp); CHECK(ret, FAIL, "H5Odecr_refcount"); ret = H5Odecr_refcount(dtype); CHECK(ret, FAIL, "H5Odecr_refcount"); ret = H5Odecr_refcount(dset); CHECK(ret, FAIL, "H5Odecr_refcount"); ret = H5Oget_info_by_name3(fid, "group", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); ret = H5Oget_info_by_name3(fid, "datatype", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); ret = H5Oget_info_by_name3(fid, "dataset", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); /* Increment the reference counts and then close the file to make sure the increment is permanent */ ret = H5Oincr_refcount(grp); CHECK(ret, FAIL, "H5Oincr_refcount"); ret = H5Oincr_refcount(dtype); CHECK(ret, FAIL, "H5Oincr_refcount"); ret = H5Oincr_refcount(dset); CHECK(ret, FAIL, "H5Oincr_refcount"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); /* Re-open the file and check that the reference counts were really incremented */ fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fopen"); grp = H5Gopen2(fid, "group", H5P_DEFAULT); CHECK(grp, FAIL, "H5Gopen2"); dtype = H5Topen2(fid, "datatype", H5P_DEFAULT); CHECK(dtype, FAIL, "H5Topen2"); dset = H5Dopen2(fid, "dataset", H5P_DEFAULT); CHECK(dset, FAIL, "H5Dopen2"); ret = H5Oget_info_by_name3(fid, "group", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); ret = H5Oget_info_by_name3(fid, "datatype", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); ret = H5Oget_info_by_name3(fid, "dataset", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 2, "reference count in H5Oget_info_by_name3"); /* Decrement the reference counts and close the file */ ret = H5Odecr_refcount(grp); CHECK(ret, FAIL, "H5Odecr_refcount"); ret = H5Odecr_refcount(dtype); CHECK(ret, FAIL, "H5Odecr_refcount"); ret = H5Odecr_refcount(dset); CHECK(ret, FAIL, "H5Odecr_refcount"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); /* Re-open the file and check that the reference counts were really decremented */ fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fopen"); grp = H5Gopen2(fid, "group", H5P_DEFAULT); CHECK(grp, FAIL, "H5Gopen2"); dtype = H5Topen2(fid, "datatype", H5P_DEFAULT); CHECK(dtype, FAIL, "H5Topen2"); dset = H5Dopen2(fid, "dataset", H5P_DEFAULT); CHECK(dset, FAIL, "H5Dopen2"); ret = H5Oget_info_by_name3(fid, "group", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); ret = H5Oget_info_by_name3(fid, "datatype", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); ret = H5Oget_info_by_name3(fid, "dataset", &oinfo, H5O_INFO_BASIC, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oget_info_by_name3"); VERIFY(oinfo.rc, 1, "reference count in H5Oget_info_by_name3"); /* Close the IDs */ ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); /* Make sure that bogus IDs return errors properly */ H5E_BEGIN_TRY { ret = H5Oincr_refcount(grp); VERIFY(ret, FAIL, "H5Oincr_refcount"); ret = H5Oincr_refcount(dtype); VERIFY(ret, FAIL, "H5Oincr_refcount"); ret = H5Oincr_refcount(dset); VERIFY(ret, FAIL, "H5Oincr_refcount"); ret = H5Odecr_refcount(grp); VERIFY(ret, FAIL, "H5Odecr_refcount"); ret = H5Odecr_refcount(dtype); VERIFY(ret, FAIL, "H5Odecr_refcount"); ret = H5Odecr_refcount(dset); VERIFY(ret, FAIL, "H5Odecr_refcount"); } H5E_END_TRY /* Close the file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); } /* test_h5o_refcount() */ /**************************************************************** ** ** test_h5o_plist(): Test object creation properties ** ****************************************************************/ static void test_h5o_plist(void) { hid_t fid; /* HDF5 File ID */ hid_t grp, dset, dtype, dspace; /* Object identifiers */ hid_t fapl; /* File access property list */ hid_t gcpl, dcpl, tcpl; /* Object creation properties */ char filename[1024]; unsigned def_max_compact, def_min_dense; /* Default phase change parameters */ unsigned max_compact, min_dense; /* Actual phase change parameters */ herr_t ret; /* Value returned from API calls */ /* Make a FAPL that uses the "use the latest version of the format" flag */ fapl = H5Pcreate(H5P_FILE_ACCESS); CHECK(fapl, FAIL, "H5Pcreate"); /* Set the "use the latest version of the format" bounds for creating objects in the file */ ret = H5Pset_libver_bounds(fapl, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST); CHECK(ret, FAIL, "H5Pset_libver_bounds"); h5_fixname(TEST_FILENAME, fapl, filename, sizeof filename); /* Create a new HDF5 file */ fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); CHECK(fid, FAIL, "H5Fcreate"); /* Create group, dataset & named datatype creation property lists */ gcpl = H5Pcreate(H5P_GROUP_CREATE); CHECK(gcpl, FAIL, "H5Pcreate"); dcpl = H5Pcreate(H5P_DATASET_CREATE); CHECK(dcpl, FAIL, "H5Pcreate"); tcpl = H5Pcreate(H5P_DATATYPE_CREATE); CHECK(tcpl, FAIL, "H5Pcreate"); /* Retrieve default attribute phase change values */ ret = H5Pget_attr_phase_change(gcpl, &def_max_compact, &def_min_dense); CHECK(ret, FAIL, "H5Pget_attr_phase_change"); /* Set non-default attribute phase change values on each creation property list */ ret = H5Pset_attr_phase_change(gcpl, def_max_compact + 1, def_min_dense - 1); CHECK(ret, FAIL, "H5Pset_attr_phase_change"); ret = H5Pset_attr_phase_change(dcpl, def_max_compact + 1, def_min_dense - 1); CHECK(ret, FAIL, "H5Pset_attr_phase_change"); ret = H5Pset_attr_phase_change(tcpl, def_max_compact + 1, def_min_dense - 1); CHECK(ret, FAIL, "H5Pset_attr_phase_change"); /* Retrieve attribute phase change values on each creation property list and verify */ ret = H5Pget_attr_phase_change(gcpl, &max_compact, &min_dense); CHECK(ret, FAIL, "H5Pget_attr_phase_change"); VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); CHECK(ret, FAIL, "H5Pget_attr_phase_change"); VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); ret = H5Pget_attr_phase_change(tcpl, &max_compact, &min_dense); CHECK(ret, FAIL, "H5Pget_attr_phase_change"); VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); /* Create a group, dataset, and committed datatype within the file, * using the respective type of creation property lists. */ /* Create the group anonymously and link it in */ grp = H5Gcreate_anon(fid, gcpl, H5P_DEFAULT); CHECK(grp, FAIL, "H5Gcreate_anon"); ret = H5Olink(grp, fid, "group", H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Olink"); /* Commit the type inside the group anonymously and link it in */ dtype = H5Tcopy(H5T_NATIVE_INT); CHECK(dtype, FAIL, "H5Tcopy"); ret = H5Tcommit_anon(fid, dtype, tcpl, H5P_DEFAULT); CHECK(ret, FAIL, "H5Tcommit_anon"); ret = H5Olink(dtype, fid, "datatype", H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Olink"); /* Create the dataspace for the dataset. */ dspace = H5Screate(H5S_SCALAR); CHECK(dspace, FAIL, "H5Screate"); /* Create the dataset anonymously and link it in */ dset = H5Dcreate_anon(fid, H5T_NATIVE_INT, dspace, dcpl, H5P_DEFAULT); CHECK(dset, FAIL, "H5Dcreate_anon"); ret = H5Olink(dset, fid, "dataset", H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Olink"); ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); /* Close current creation property lists */ ret = H5Pclose(gcpl); CHECK(ret, FAIL, "H5Pclose"); ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); ret = H5Pclose(tcpl); CHECK(ret, FAIL, "H5Pclose"); /* Retrieve each object's creation property list */ gcpl = H5Gget_create_plist(grp); CHECK(gcpl, FAIL, "H5Gget_create_plist"); tcpl = H5Tget_create_plist(dtype); CHECK(tcpl, FAIL, "H5Tget_create_plist"); dcpl = H5Dget_create_plist(dset); CHECK(dcpl, FAIL, "H5Dget_create_plist"); /* Retrieve attribute phase change values on each creation property list and verify */ ret = H5Pget_attr_phase_change(gcpl, &max_compact, &min_dense); CHECK(ret, FAIL, "H5Pget_attr_phase_change"); VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); CHECK(ret, FAIL, "H5Pget_attr_phase_change"); VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); ret = H5Pget_attr_phase_change(tcpl, &max_compact, &min_dense); CHECK(ret, FAIL, "H5Pget_attr_phase_change"); VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); /* Close current objects */ ret = H5Pclose(gcpl); CHECK(ret, FAIL, "H5Pclose"); ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); ret = H5Pclose(tcpl); CHECK(ret, FAIL, "H5Pclose"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); /* Re-open the file and check that the object creation properties persist */ fid = H5Fopen(filename, H5F_ACC_RDONLY, fapl); CHECK(fid, FAIL, "H5Fopen"); /* Re-open objects */ grp = H5Gopen2(fid, "group", H5P_DEFAULT); CHECK(grp, FAIL, "H5Gopen2"); dtype = H5Topen2(fid, "datatype", H5P_DEFAULT); CHECK(dtype, FAIL, "H5Topen2"); dset = H5Dopen2(fid, "dataset", H5P_DEFAULT); CHECK(dset, FAIL, "H5Dopen2"); /* Retrieve each object's creation property list */ gcpl = H5Gget_create_plist(grp); CHECK(gcpl, FAIL, "H5Gget_create_plist"); tcpl = H5Tget_create_plist(dtype); CHECK(tcpl, FAIL, "H5Tget_create_plist"); dcpl = H5Dget_create_plist(dset); CHECK(dcpl, FAIL, "H5Dget_create_plist"); /* Retrieve attribute phase change values on each creation property list and verify */ ret = H5Pget_attr_phase_change(gcpl, &max_compact, &min_dense); CHECK(ret, FAIL, "H5Pget_attr_phase_change"); VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); ret = H5Pget_attr_phase_change(dcpl, &max_compact, &min_dense); CHECK(ret, FAIL, "H5Pget_attr_phase_change"); VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); ret = H5Pget_attr_phase_change(tcpl, &max_compact, &min_dense); CHECK(ret, FAIL, "H5Pget_attr_phase_change"); VERIFY(max_compact, (def_max_compact + 1), "H5Pget_attr_phase_change"); VERIFY(min_dense, (def_min_dense - 1), "H5Pget_attr_phase_change"); /* Close current objects */ ret = H5Pclose(gcpl); CHECK(ret, FAIL, "H5Pclose"); ret = H5Pclose(dcpl); CHECK(ret, FAIL, "H5Pclose"); ret = H5Pclose(tcpl); CHECK(ret, FAIL, "H5Pclose"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); /* Close the FAPL */ ret = H5Pclose(fapl); CHECK(ret, FAIL, "H5Pclose"); } /* test_h5o_plist() */ /**************************************************************** ** ** test_h5o_link(): Test creating link to object ** ****************************************************************/ static void test_h5o_link(void) { hid_t file_id = -1; hid_t group_id = -1; hid_t space_id = -1; hid_t dset_id = -1; hid_t type_id = -1; hid_t fapl_id = -1; hid_t lcpl_id = -1; char filename[1024]; hsize_t dims[2] = {TEST6_DIM1, TEST6_DIM2}; htri_t committed; /* Whether the named datatype is committed */ H5F_libver_t low, high; /* File format bounds */ int *wdata; int *rdata; int i, n; herr_t ret; /* Value returned from API calls */ h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); /* Allocate memory buffers */ /* (These are treated as 2-D buffers) */ wdata = (int *)HDmalloc((size_t)(TEST6_DIM1 * TEST6_DIM2) * sizeof(int)); CHECK_PTR(wdata, "HDmalloc"); rdata = (int *)HDmalloc((size_t)(TEST6_DIM1 * TEST6_DIM2) * sizeof(int)); CHECK_PTR(rdata, "HDmalloc"); /* Initialize the raw data */ for (i = n = 0; i < (TEST6_DIM1 * TEST6_DIM2); i++) wdata[i] = n++; /* Create the dataspace */ space_id = H5Screate_simple(2, dims, NULL); CHECK(space_id, FAIL, "H5Screate_simple"); /* Create LCPL with intermediate group creation flag set */ lcpl_id = H5Pcreate(H5P_LINK_CREATE); CHECK(lcpl_id, FAIL, "H5Pcreate"); ret = H5Pset_create_intermediate_group(lcpl_id, TRUE); CHECK(ret, FAIL, "H5Pset_create_intermediate_group"); /* Create a file access property list */ fapl_id = H5Pcreate(H5P_FILE_ACCESS); CHECK(fapl_id, FAIL, "H5Pcreate"); /* Loop through all the combinations of low/high library format bounds */ for (low = H5F_LIBVER_EARLIEST; low < H5F_LIBVER_NBOUNDS; low++) { for (high = H5F_LIBVER_EARLIEST; high < H5F_LIBVER_NBOUNDS; high++) { /* Set version bounds */ H5E_BEGIN_TRY { ret = H5Pset_libver_bounds(fapl_id, low, high); } H5E_END_TRY; if (ret < 0) /* Invalid low/high combinations */ continue; /* Create a new HDF5 file */ file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); CHECK(file_id, FAIL, "H5Fcreate"); /* Close the FAPL */ ret = H5Pclose(fapl_id); CHECK(ret, FAIL, "H5Pclose"); /* Create and commit a datatype with no name */ type_id = H5Tcopy(H5T_NATIVE_INT); CHECK(type_id, FAIL, "H5Fcreate"); ret = H5Tcommit_anon(file_id, type_id, H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Tcommit_anon"); committed = H5Tcommitted(type_id); VERIFY(committed, TRUE, "H5Tcommitted"); /* Create a dataset with no name using the committed datatype*/ dset_id = H5Dcreate_anon(file_id, type_id, space_id, H5P_DEFAULT, H5P_DEFAULT); CHECK(dset_id, FAIL, "H5Dcreate_anon"); /* Verify that we can write to and read from the dataset */ /* Write the data to the dataset */ ret = H5Dwrite(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata); CHECK(ret, FAIL, "H5Dwrite"); /* Read the data back */ ret = H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); CHECK(ret, FAIL, "H5Dread"); /* Verify the data */ for (i = 0; i < (TEST6_DIM1 * TEST6_DIM2); i++) VERIFY(wdata[i], rdata[i], "H5Dread"); /* Create a group with no name*/ group_id = H5Gcreate_anon(file_id, H5P_DEFAULT, H5P_DEFAULT); CHECK(group_id, FAIL, "H5Gcreate_anon"); /* Link nameless datatype into nameless group */ ret = H5Olink(type_id, group_id, "datatype", H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Olink"); /* Link nameless dataset into nameless group with intermediate group */ ret = H5Olink(dset_id, group_id, "inter_group/dataset", lcpl_id, H5P_DEFAULT); CHECK(ret, FAIL, "H5Olink"); /* Close IDs for dataset and datatype */ ret = H5Dclose(dset_id); CHECK(ret, FAIL, "H5Dclose"); ret = H5Tclose(type_id); CHECK(ret, FAIL, "H5Tclose"); /* Re-open datatype using new link */ type_id = H5Topen2(group_id, "datatype", H5P_DEFAULT); CHECK(type_id, FAIL, "H5Topen2"); /* Link nameless group to root group and close the group ID*/ ret = H5Olink(group_id, file_id, "/group", H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Olink"); ret = H5Gclose(group_id); CHECK(ret, FAIL, "H5Gclose"); /* Open dataset through root group and verify its data */ dset_id = H5Dopen2(file_id, "/group/inter_group/dataset", H5P_DEFAULT); CHECK(dset_id, FAIL, "H5Dopen2"); /* Read data from dataset */ ret = H5Dread(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata); CHECK(ret, FAIL, "H5Dread"); for (i = 0; i < (TEST6_DIM1 * TEST6_DIM2); i++) VERIFY(wdata[i], rdata[i], "H5Dread"); /* Close open IDs */ ret = H5Dclose(dset_id); CHECK(ret, FAIL, "H5Dclose"); ret = H5Tclose(type_id); CHECK(ret, FAIL, "H5Tclose"); ret = H5Fclose(file_id); CHECK(ret, FAIL, "H5Fclose"); } /* for high */ } /* for low */ /* Close remaining IDs */ ret = H5Sclose(space_id); CHECK(ret, FAIL, "H5Sclose"); ret = H5Pclose(lcpl_id); CHECK(ret, FAIL, "H5Pclose"); /* Release buffers */ HDfree(wdata); HDfree(rdata); } /* end test_h5o_link() */ /**************************************************************** ** ** test_h5o_comment(): Test H5Oset(get)_comment functions. ** ****************************************************************/ static void test_h5o_comment(void) { hid_t fid; /* HDF5 File ID */ hid_t grp, dset, dtype, dspace; /* Object identifiers */ hid_t attr_space, attr_id; char filename[1024]; hsize_t dims[RANK]; hsize_t attr_dims = 1; int attr_value = 5; const char *file_comment = "file comment"; const char *grp_comment = "group comment"; const char *dset_comment = "dataset comment"; const char *dtype_comment = "datatype comment"; char check_comment[64]; ssize_t comment_len = 0; ssize_t len; herr_t ret; /* Value returned from API calls */ int ret_value; h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); /* Create a new HDF5 file */ fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); /* Create an attribute for the file */ attr_space = H5Screate_simple(1, &attr_dims, NULL); CHECK(attr_space, FAIL, "H5Screate_simple"); attr_id = H5Acreate2(fid, "file attribute", H5T_NATIVE_INT, attr_space, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr_id, FAIL, "H5Acreate2"); ret = H5Awrite(attr_id, H5T_NATIVE_INT, &attr_value); CHECK(ret, FAIL, "H5Awrite"); /* Putting a comment on the file through its attribute */ ret = H5Oset_comment(attr_id, file_comment); CHECK(ret, FAIL, "H5Oset_comment"); ret = H5Sclose(attr_space); CHECK(ret, FAIL, "H5Sclose"); ret = H5Aclose(attr_id); CHECK(ret, FAIL, "H5Aclose"); /* Create a group, dataset, and committed datatype within the file */ /* Create the group */ grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(grp, FAIL, "H5Gcreate2"); /* Putting a comment on the group */ ret = H5Oset_comment(grp, grp_comment); CHECK(ret, FAIL, "H5Oset_comment"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); /* Commit the type inside the group */ dtype = H5Tcopy(H5T_NATIVE_INT); CHECK(dtype, FAIL, "H5Tcopy"); ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Tcommit2"); /* Putting a comment on the committed data type */ ret = H5Oset_comment(dtype, dtype_comment); CHECK(ret, FAIL, "H5Oset_comment"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); /* Create the data space for the dataset. */ dims[0] = DIM0; dims[1] = DIM1; dspace = H5Screate_simple(RANK, dims, NULL); CHECK(dspace, FAIL, "H5Screate_simple"); /* Create the dataset. */ dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(dset, FAIL, "H5Dcreate2"); /* Putting a comment on the dataset */ ret = H5Oset_comment(dset, dset_comment); CHECK(ret, FAIL, "H5Oset_comment"); /* Putting a comment on the dataspace. It's supposed to fail. */ H5E_BEGIN_TRY { ret = H5Oset_comment(dspace, "dataspace comment"); } H5E_END_TRY; VERIFY(ret, FAIL, "H5Oset_comment"); /* Close the file */ ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); /* Now make sure that the comments are correct all 4 types of objects */ /* Open file */ fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fopen"); /* Getting the comment on the file and verify it */ comment_len = H5Oget_comment(fid, NULL, (size_t)0); CHECK(comment_len, FAIL, "H5Oget_comment"); len = H5Oget_comment(fid, check_comment, (size_t)comment_len + 1); CHECK(len, FAIL, "H5Oget_comment"); ret_value = HDstrcmp(file_comment, check_comment); VERIFY(ret_value, 0, "H5Oget_comment"); /* Open the group */ grp = H5Gopen2(fid, "group", H5P_DEFAULT); CHECK(grp, FAIL, "H5Gopen2"); /* Getting the comment on the group and verify it */ comment_len = H5Oget_comment(grp, NULL, (size_t)0); CHECK(comment_len, FAIL, "H5Oget_comment"); len = H5Oget_comment(grp, check_comment, (size_t)comment_len + 1); CHECK(len, FAIL, "H5Oget_comment"); ret_value = HDstrcmp(grp_comment, check_comment); VERIFY(ret_value, 0, "H5Oget_comment"); /* Open the datatype */ dtype = H5Topen2(fid, "group/datatype", H5P_DEFAULT); CHECK(dtype, FAIL, "H5Topen2"); /* Getting the comment on the datatype and verify it */ comment_len = H5Oget_comment(dtype, NULL, (size_t)0); CHECK(comment_len, FAIL, "H5Oget_comment"); len = H5Oget_comment(dtype, check_comment, (size_t)comment_len + 1); CHECK(len, FAIL, "H5Oget_comment"); ret_value = HDstrcmp(dtype_comment, check_comment); VERIFY(ret_value, 0, "H5Oget_comment"); /* Open the dataset */ dset = H5Dopen2(fid, "dataset", H5P_DEFAULT); CHECK(dset, FAIL, "H5Dopen2"); /* Getting the comment on the dataset and verify it */ comment_len = H5Oget_comment(dset, NULL, (size_t)0); CHECK(comment_len, FAIL, "H5Oget_comment"); len = H5Oget_comment(dset, check_comment, (size_t)comment_len + 1); CHECK(ret, len, "H5Oget_comment"); ret_value = HDstrcmp(dset_comment, check_comment); VERIFY(ret_value, 0, "H5Oget_comment"); /* Close the IDs */ ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); /* Close the file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); } /* test_h5o_comment() */ /**************************************************************** ** ** test_h5o_comment_by_name(): Test H5Oset(get)_comment_by_name functions. ** ****************************************************************/ static void test_h5o_comment_by_name(void) { hid_t fid; /* HDF5 File ID */ hid_t grp, dset, dtype, dspace; /* Object identifiers */ hid_t attr_space, attr_id; char filename[1024]; hsize_t dims[RANK]; hsize_t attr_dims = 1; int attr_value = 5; const char *file_comment = "file comment by name"; const char *grp_comment = "group comment by name"; const char *dset_comment = "dataset comment by name"; const char *dtype_comment = "datatype comment by name"; char check_comment[64]; ssize_t comment_len = 0; ssize_t len; herr_t ret; /* Value returned from API calls */ int ret_value; h5_fixname(TEST_FILENAME, H5P_DEFAULT, filename, sizeof filename); /* Create a new HDF5 file */ fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fcreate"); /* Create an attribute for the file */ attr_space = H5Screate_simple(1, &attr_dims, NULL); CHECK(attr_space, FAIL, "H5Screate_simple"); attr_id = H5Acreate2(fid, "file attribute", H5T_NATIVE_INT, attr_space, H5P_DEFAULT, H5P_DEFAULT); CHECK(attr_id, FAIL, "H5Acreate2"); ret = H5Awrite(attr_id, H5T_NATIVE_INT, &attr_value); CHECK(ret, FAIL, "H5Awrite"); /* Putting a comment on the file through its attribute */ ret = H5Oset_comment_by_name(attr_id, ".", file_comment, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oset_comment_by_name"); ret = H5Sclose(attr_space); CHECK(ret, FAIL, "H5Sclose"); ret = H5Aclose(attr_id); CHECK(ret, FAIL, "H5Aclose"); /* Create a group, dataset, and committed datatype within the file */ /* Create the group */ grp = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(grp, FAIL, "H5Gcreate2"); /* Putting a comment on the group */ ret = H5Oset_comment_by_name(fid, "group", grp_comment, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oset_comment_by_name"); /* Commit the type inside the group */ dtype = H5Tcopy(H5T_NATIVE_INT); CHECK(dtype, FAIL, "H5Tcopy"); ret = H5Tcommit2(fid, "group/datatype", dtype, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(ret, FAIL, "H5Tcommit2"); /* Putting a comment on the committed data type */ ret = H5Oset_comment_by_name(grp, "datatype", dtype_comment, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oset_comment_by_name"); ret = H5Tclose(dtype); CHECK(ret, FAIL, "H5Tclose"); ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); /* Create the data space for the dataset. */ dims[0] = DIM0; dims[1] = DIM1; dspace = H5Screate_simple(RANK, dims, NULL); CHECK(dspace, FAIL, "H5Screate_simple"); /* Create the dataset. */ dset = H5Dcreate2(fid, "dataset", H5T_NATIVE_INT, dspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); CHECK(dset, FAIL, "H5Dcreate2"); /* Putting a comment on the dataset */ ret = H5Oset_comment_by_name(fid, "dataset", dset_comment, H5P_DEFAULT); CHECK(ret, FAIL, "H5Oset_comment_by_name"); /* Putting a comment on the dataspace. It's supposed to fail. */ H5E_BEGIN_TRY { ret = H5Oset_comment_by_name(dspace, ".", "dataspace comment", H5P_DEFAULT); } H5E_END_TRY; VERIFY(ret, FAIL, "H5Oset_comment"); /* Close the file */ ret = H5Dclose(dset); CHECK(ret, FAIL, "H5Dclose"); ret = H5Sclose(dspace); CHECK(ret, FAIL, "H5Sclose"); ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); /* Now make sure that the comments are correct all 4 types of objects */ /* Open file */ fid = H5Fopen(filename, H5F_ACC_RDONLY, H5P_DEFAULT); CHECK(fid, FAIL, "H5Fopen"); /* Getting the comment on the file and verify it */ comment_len = H5Oget_comment_by_name(fid, ".", NULL, (size_t)0, H5P_DEFAULT); CHECK(comment_len, FAIL, "H5Oget_comment_by_name"); len = H5Oget_comment_by_name(fid, ".", check_comment, (size_t)comment_len + 1, H5P_DEFAULT); CHECK(len, FAIL, "H5Oget_comment_by_name"); ret_value = HDstrcmp(file_comment, check_comment); VERIFY(ret_value, 0, "H5Oget_comment_by_name"); /* Open the group */ grp = H5Gopen2(fid, "group", H5P_DEFAULT); CHECK(grp, FAIL, "H5Gopen2"); /* Getting the comment on the group and verify it */ comment_len = H5Oget_comment_by_name(fid, "group", NULL, (size_t)0, H5P_DEFAULT); CHECK(comment_len, FAIL, "H5Oget_comment_by_name"); len = H5Oget_comment_by_name(fid, "group", check_comment, (size_t)comment_len + 1, H5P_DEFAULT); CHECK(len, FAIL, "H5Oget_comment_by_name"); ret_value = HDstrcmp(grp_comment, check_comment); VERIFY(ret_value, 0, "H5Oget_comment_by_name"); /* Getting the comment on the datatype and verify it */ comment_len = H5Oget_comment_by_name(grp, "datatype", NULL, (size_t)0, H5P_DEFAULT); CHECK(comment_len, FAIL, "H5Oget_comment_by_name"); len = H5Oget_comment_by_name(grp, "datatype", check_comment, (size_t)comment_len + 1, H5P_DEFAULT); CHECK(len, FAIL, "H5Oget_comment"); ret_value = HDstrcmp(dtype_comment, check_comment); VERIFY(ret_value, 0, "H5Oget_comment_by_name"); /* Getting the comment on the dataset and verify it */ comment_len = H5Oget_comment_by_name(fid, "dataset", NULL, (size_t)0, H5P_DEFAULT); CHECK(comment_len, FAIL, "H5Oget_comment_by_name"); len = H5Oget_comment_by_name(fid, "dataset", check_comment, (size_t)comment_len + 1, H5P_DEFAULT); CHECK(len, FAIL, "H5Oget_comment_by_name"); ret_value = HDstrcmp(dset_comment, check_comment); VERIFY(ret_value, 0, "H5Oget_comment_by_name"); /* Close the IDs */ ret = H5Gclose(grp); CHECK(ret, FAIL, "H5Gclose"); /* Close the file */ ret = H5Fclose(fid); CHECK(ret, FAIL, "H5Fclose"); } /* test_h5o_comment_by_name() */ /**************************************************************** ** ** test_h5o_getinfo_same_file(): Test that querying the object info for ** objects in the same file will return the same file "number" ** ****************************************************************/ static void test_h5o_getinfo_same_file(void) { hid_t fid1, fid2; /* HDF5 File ID */