1/* This is part of the netCDF package.
2   Copyright 2005 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Test HDF5 file code. These are not intended to be exhaustive tests,
6   but they use HDF5 the same way that netCDF-4 does, so if these
7   tests don't work, than netCDF-4 won't work either.
8*/
9
10#include "h5_err_macros.h"
11#include <hdf5.h>
12#include <H5DSpublic.h>
13
14#define FILE_NAME "tst_h_files.h5"
15#define GRP_NAME "Dectectives"
16#define STR_LEN 255
17
18int
19main()
20{
21   printf("\n*** Checking HDF5 file functions.\n");
22   printf("*** Checking HDF5 file creates and opens...");
23#define OPAQUE_SIZE 20
24#define OPAQUE_NAME "type"
25#define ATT_NAME "att_name"
26#define DIM_LEN 3
27   {
28      hid_t fileidaccess_plisttypeidspaceidattidfapl_idgrpid;
29      hsize_t dims[1]; /* netcdf attributes always 1-D. */
30      unsigned char data[DIM_LEN][OPAQUE_SIZE];
31      hsize_t num_obji;
32      int obj_class;
33      char obj_name[STR_LEN + 1];
34      H5T_class_t class;
35      size_t type_size;
36      int jk;
37      hid_t tmp1;
38
39      H5open();
40
41      /* Initialize some data. */
42      for (j = 0; j < DIM_LENj++)
43  for (k = 0; k < OPAQUE_SIZEk++)
44     data[j][k] = 42;
45
46      /* Set the access list so that closes will fail if something is
47       * still open in the file. */
48      tmp1 = H5P_FILE_ACCESS;
49      if ((access_plist = H5Pcreate(tmp1)) < 0) ERR;
50      if (H5Pset_fclose_degree(access_plistH5F_CLOSE_SEMI)) ERR;
51
52      /* Create file. */
53      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
54       access_plist)) < 0) ERR;
55      /* Add an opaque type. */
56      if ((typeid = H5Tcreate(H5T_OPAQUEOPAQUE_SIZE)) < 0) ERR;
57      if (H5Tcommit(fileidOPAQUE_NAMEtypeid) < 0) ERR;
58
59      /* Add attribute of this type. */
60      dims[0] = 3;
61      if ((spaceid = H5Screate_simple(1, dimsNULL)) < 0) ERR;
62      if ((attid = H5Acreate(fileidATT_NAMEtypeidspaceid,
63      H5P_DEFAULT)) < 0) ERR;
64      if (H5Awrite(attidtypeiddata) < 0) ERR;
65
66      if (H5Aclose(attid) < 0) ERR;
67      if (H5Sclose(spaceid) < 0) ERR;
68      if (H5Tclose(typeid) < 0) ERR;
69      if (H5Fclose(fileid) < 0) ERR;
70      if (H5Pclose(access_plist) < 0) ERR;
71
72      if (H5Eset_auto(NULLNULL) < 0) ERR;
73
74      /* Reopen the file. */
75      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
76      /*if (H5Pset_fclose_degree(fapl_id, H5F_CLOSE_SEMI)) ERR;*/
77      if (H5Pset_fclose_degree(fapl_idH5F_CLOSE_STRONG)) ERR;
78      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYfapl_id)) < 0) ERR;
79      if ((grpid = H5Gopen(fileid, "/")) < 0) ERR;
80
81      if (H5Gget_num_objs(grpid, &num_obj) < 0) ERR;
82      for (i = 0; i < num_obji++)
83      {
84  if ((obj_class = H5Gget_objtype_by_idx(grpidi)) < 0) ERR;
85  if (H5Gget_objname_by_idx(grpidiobj_name,
86    STR_LEN) < 0) ERR;
87  if (obj_class != H5G_TYPEERR;
88  if ((typeid = H5Topen(grpidobj_name)) < 0) ERR;
89  if ((class = H5Tget_class(typeid)) < 0) ERR;
90  if (class != H5T_OPAQUEERR;
91  if (!(H5Tget_size(typeid))) ERR;
92      }
93
94      /* Close everything. */
95      if (H5Pclose(fapl_id)) ERR;
96      if (H5Gclose(grpid) < 0) ERR;
97      /*if (H5Tclose(typeid) < 0) ERR;*/
98      if (H5Fclose(fileid) < 0) ERR;
99
100      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
101      if (H5Pset_fclose_degree(fapl_idH5F_CLOSE_SEMI)) ERR;
102      if ((fileid = H5Fopen(FILE_NAME, 0, fapl_id)) < 0) ERR;
103      if (H5Fclose(fileid) < 0) ERR;
104
105   }
106   SUMMARIZE_ERR;
107
108   printf("*** Checking HDF5 file creates and opens some more...");
109   {
110      int objs;
111      hid_t fileidfileid2grpidaccess_plist;
112
113      /* Set the access list so that closes will fail if something is
114       * still open in the file. */
115      if ((access_plist = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
116      if (H5Pset_fclose_degree(access_plistH5F_CLOSE_SEMI)) ERR;
117
118      /* Create file and create group. */
119      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
120       access_plist)) < 0) ERR;
121      if ((grpid = H5Gcreate(fileidGRP_NAME, 0)) < 0) ERR;
122
123      /* How many open objects are there? */
124      if ((objs = H5Fget_obj_count(fileidH5F_OBJ_ALL)) < 0) ERR;
125      if (objs != 2) ERR;
126      if ((objs = H5Fget_obj_count(fileidH5F_OBJ_GROUP)) < 0) ERR;
127      if (objs != 1) ERR;
128
129      /* Turn off HDF5 error messages. */
130      if (H5Eset_auto(NULLNULL) < 0) ERR;
131
132      /* This H5Fclose should fail, because I didn't close the group. */
133      if (H5Fclose(fileid) >= 0) ERR;
134
135      /* Now close the group first, and then the file. */
136      if (H5Gclose(grpid) < 0 ||
137   H5Fclose(fileid) < 0) ERR;
138
139      /* Now create the file again, to make sure that it really is not
140       * just mearly dead, but really most sincerely dead. */
141      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
142       access_plist)) < 0) ERR;
143      if (H5Fclose(fileid) < 0) ERR;
144
145      /* Confirm that the same file can be opened twice at the same time,
146       * for read only access. */
147      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYH5P_DEFAULT)) < 0) ERR;
148      if ((fileid2 = H5Fopen(FILE_NAMEH5F_ACC_RDONLYH5P_DEFAULT)) < 0) ERR;
149      if (H5Fclose(fileid) < 0) ERR;
150      if (H5Fclose(fileid2) < 0) ERR;
151
152      /* Once open for read only access, the file can't be opened again
153       * for write access. */
154      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYH5P_DEFAULT)) < 0) ERR;
155      if (H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT) >= 0) ERR;
156      if (H5Fclose(fileid) < 0) ERR;
157
158      /* But you can open the file for read/write access, and then open
159       * it again for read only access. */
160      if ((fileid2 = H5Fopen(FILE_NAMEH5F_ACC_RDWRH5P_DEFAULT)) < 0) ERR;
161      if ((fileid = H5Fopen(FILE_NAMEH5F_ACC_RDONLYH5P_DEFAULT)) < 0) ERR;
162      if (H5Fclose(fileid) < 0) ERR;
163      if (H5Fclose(fileid2) < 0) ERR;
164   }
165   SUMMARIZE_ERR;
166
167   printf("*** Creating file...");
168   {
169#define VAR_NAME "HALs_memory"
170#define NDIMS 1
171#define DIM1_LEN 40000
172#define SC 10000 /* slice count. */
173#define MILLION 1000000
174
175      hid_t fileidwrite_spaceiddatasetidmem_spaceid;
176      hsize_t start[NDIMS], count[NDIMS];
177      hsize_t dims[1];
178      int *data;
179      int num_steps;
180      int is;
181
182      /* We will write the same slice of random data over and over to
183       * fill the file. */
184      if (!(data = malloc(SC * sizeof(int))))
185  ERR_RET;
186      for (i = 0; i < SCi++)
187  data[i] = rand();
188
189      /* Create file. */
190      if ((fileid = H5Fcreate(FILE_NAMEH5F_ACC_TRUNCH5P_DEFAULT,
191       H5P_DEFAULT)) < 0) ERR;
192
193      /* Create a space to deal with one slice in memory. */
194      dims[0] = SC;
195      if ((mem_spaceid = H5Screate_simple(NDIMSdimsNULL)) < 0) ERR;
196
197      /* Create a space to write all slices. */
198      dims[0] = DIM1_LEN;
199      if ((write_spaceid = H5Screate_simple(NDIMSdimsNULL)) < 0) ERR;
200
201      /* Create dataset. */
202      if ((datasetid = H5Dcreate1(fileidVAR_NAMEH5T_NATIVE_INT,
203   write_spaceidH5P_DEFAULT)) < 0) ERR;
204
205      /* Write the data in num_step steps. */
206      num_steps = DIM1_LEN/SC;
207      count[0] = SC;
208      for (s = 0; s < num_stepss++)
209      {
210  /* Select hyperslab for write of one slice. */
211  start[0] = s * SC;
212  if (H5Sselect_hyperslab(write_spaceidH5S_SELECT_SET,
213  startNULLcountNULL) < 0) ERR;
214
215  if (H5Dwrite(datasetidH5T_NATIVE_INTmem_spaceidwrite_spaceid,
216       H5P_DEFAULTdata) < 0) ERR;
217      }
218
219      /* Close. */
220      free(data);
221      if (H5Dclose(datasetid) < 0 ||
222   H5Sclose(write_spaceid) < 0 ||
223   H5Sclose(mem_spaceid) < 0 ||
224   H5Fclose(fileid) < 0)
225  ERR;
226   }
227   SUMMARIZE_ERR;
228#ifdef LARGE_FILE_TESTS
229
230#define NDIMS2 2
231#define DIM1 2048
232#define DIM2 2097153 /* DIM1*DIM2*sizeof(char)   > 2**32 */
233#define DIM_WITHOUT_VARIABLE "This is a netCDF dimension but not a netCDF variable."
234#define VAR_NAME2 "var"
235#define MAX_DIMS 255
236
237   printf("*** large file test for HDF5...");
238   {
239      hid_t fapl_idfcpl_idfileidgrpidspaceiddatasetid;
240      hid_t dim1_dimscaleiddim2_dimscaleidplistiddatasetid2file_spaceid;
241      hid_t mem_spaceidxfer_plistidnative_typeid;
242      hsize_t *chunksizedims[1], maxdims[1], *dimsize, *maxdimsize;
243      hsize_t fdims[MAX_DIMS], fmaxdims[MAX_DIMS];
244      hsize_t start[MAX_DIMS],  count[MAX_DIMS];
245      char file_name[STR_LEN + 1];
246      char dimscale_wo_var[STR_LEN];
247      void *bufr;
248      void *fillp;
249
250      sprintf(file_name, "%s/%s", TEMP_LARGEFILE_NAME);
251
252      /* Create file access and create property lists. */
253      if ((fapl_id = H5Pcreate(H5P_FILE_ACCESS)) < 0) ERR;
254      if ((fcpl_id = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
255
256      /* Set latest_format in access propertly list. This ensures that
257       * the latest, greatest, HDF5 versions are used in the file. */
258      if (H5Pset_libver_bounds(fapl_idH5F_LIBVER_LATESTH5F_LIBVER_LATEST) < 0) ERR;
259
260      /* Set H5P_CRT_ORDER_TRACKED in the creation property list. This
261       * turns on HDF5 creation ordering in the file. */
262      if (H5Pset_link_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
263        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
264      if (H5Pset_attr_creation_order(fcpl_id, (H5P_CRT_ORDER_TRACKED |
265        H5P_CRT_ORDER_INDEXED)) < 0) ERR;
266
267      /* Create the file. */
268      if ((fileid = H5Fcreate(file_nameH5F_ACC_TRUNCfcpl_idfapl_id)) < 0) ERR;
269
270      /* Open the root group. */
271      if ((grpid = H5Gopen2(fileid, "/", H5P_DEFAULT)) < 0) ERR;
272
273      /* Set up the dataset creation property list for the two dimensions. */
274/*      if (H5Pset_chunk(plistid, 1, chunksize) < 0) ERR;*/
275
276      /* Create the dim1 dimscale. */
277      if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
278      dims[0] = DIM1;
279      maxdims[0] = DIM1;
280      if ((spaceid = H5Screate_simple(1, dimsmaxdims)) < 0) ERR;
281      if (H5Pset_attr_creation_order(plistidH5P_CRT_ORDER_TRACKED|
282      H5P_CRT_ORDER_INDEXED) < 0) ERR;
283      if ((dim1_dimscaleid = H5Dcreate(grpid, "dim1", H5T_IEEE_F32BE,
284       spaceidplistid)) < 0) ERR;
285      if (H5Sclose(spaceid) < 0) ERR;
286      if (H5Pclose(plistid) < 0) ERR;
287      sprintf(dimscale_wo_var, "%s%10d", DIM_WITHOUT_VARIABLEDIM1);
288      if (H5DSset_scale(dim1_dimscaleiddimscale_wo_var) < 0) ERR;
289
290      /* Create the dim2 dimscale. */
291      if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
292      dims[0] = DIM2;
293      maxdims[0] = DIM2;
294      if ((spaceid = H5Screate_simple(1, dimsmaxdims)) < 0) ERR;
295      if (H5Pset_attr_creation_order(plistidH5P_CRT_ORDER_TRACKED|
296      H5P_CRT_ORDER_INDEXED) < 0) ERR;
297      if ((dim2_dimscaleid = H5Dcreate(grpid, "dim2", H5T_IEEE_F32BE,
298       spaceidplistid)) < 0) ERR;
299      if (H5Sclose(spaceid) < 0) ERR;
300      if (H5Pclose(plistid) < 0) ERR;
301      sprintf(dimscale_wo_var, "%s%10d", DIM_WITHOUT_VARIABLEDIM2);
302      if (H5DSset_scale(dim2_dimscaleiddimscale_wo_var) < 0) ERR;
303
304      /* Now create the 2D dataset. */
305      if ((plistid = H5Pcreate(H5P_DATASET_CREATE)) < 0) ERR;
306      if (!(fillp = malloc(1))) ERR;
307#define FILL_BYTE 255
308      *(signed char *)fillp = FILL_BYTE;
309      if (H5Pset_fill_value(plistidH5T_NATIVE_SCHARfillp) < 0) ERR;
310      if (!(chunksize = malloc(NDIMS2 * sizeof(hsize_t)))) ERR;
311      chunksize[0] = 1024;
312      chunksize[1] = 1048576;
313      if (H5Pset_chunk(plistidNDIMS2chunksize) < 0) ERR;
314      if (!(dimsize = malloc(NDIMS2 * sizeof(hsize_t)))) ERR;
315      if (!(maxdimsize = malloc(NDIMS2 * sizeof(hsize_t)))) ERR;
316      dimsize[0] = 2048;
317      dimsize[1] = 2097153;
318      maxdimsize[0] = 2048;
319      maxdimsize[1] = 2097153;
320      if ((spaceid = H5Screate_simple(NDIMS2dimsizemaxdimsize)) < 0) ERR;
321      if (H5Pset_attr_creation_order(plistidH5P_CRT_ORDER_TRACKED|
322      H5P_CRT_ORDER_INDEXED) < 0) ERR;
323      if ((datasetid = H5Dcreate(grpidVAR_NAME2H5T_NATIVE_SCHARspaceidplistid)) < 0)
324
325      free(fillp);
326      free(chunksize);
327      free(dimsize);
328      free(maxdimsize);
329      if (H5Pclose(plistid) < 0) ERR;
330      if (H5Sclose(spaceid) < 0) ERR;
331
332      if (H5DSattach_scale(datasetiddim1_dimscaleid, 0) < 0) ERR;
333      if (H5DSattach_scale(datasetiddim2_dimscaleid, 1) < 0) ERR;
334      H5Fflush(fileidH5F_SCOPE_GLOBAL);
335
336      /* Read a slice of data. */
337      if ((file_spaceid = H5Dget_space(datasetid)) < 0) ERR;
338      if (H5Sget_simple_extent_dims(file_spaceidfdimsfmaxdims) < 0) ERR;
339      if (H5Sget_simple_extent_type(file_spaceid) == H5S_SCALARERR;
340      start[0] = 0;
341      start[1] = 0;
342      count[0] = 1;
343      count[1] = 2097153;
344      if (H5Sselect_hyperslab(file_spaceidH5S_SELECT_SETstartNULLcountNULL) < 0) ERR;
345      if ((mem_spaceid = H5Screate_simple(NDIMS2countNULL)) < 0) ERR;
346      if ((xfer_plistid = H5Pcreate(H5P_DATASET_XFER)) < 0) ERR;
347      if ((native_typeid = H5Tget_native_type(H5T_NATIVE_SCHARH5T_DIR_DEFAULT)) < 0) ERR;
348      if (!(bufr = malloc(DIM2))) ERR;
349      if (H5Dwrite(datasetidnative_typeidmem_spaceidfile_spaceidxfer_plistidbufr) < 0) ERR;
350      free(bufr);
351      if (H5Tclose(native_typeid) < 0) ERR;
352
353      /* Close down the show. */
354      if (H5Pclose(fapl_id) < 0) ERR;
355      if (H5Pclose(fcpl_id) < 0) ERR;
356      if (H5Dclose(dim1_dimscaleid) < 0) ERR;
357      if (H5Dclose(dim2_dimscaleid) < 0) ERR;
358      if (H5Dclose(datasetid) < 0) ERR;
359      if (H5Gclose(grpid) < 0) ERR;
360      if (H5Fclose(fileid) < 0) ERR;
361
362/*       /\* Reopen the file and check it. *\/ */
363/*       if ((fileid = H5Fopen(file_name, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) ERR; */
364/*       if (H5Gget_num_objs(fileid, &num_obj) < 0) ERR; */
365/*       if (num_obj) ERR; */
366/*       if (H5Fclose(fileid) < 0) ERR; */
367
368      /* Delete the huge data file we created. */
369      (void) remove(file_name);
370   }
371   SUMMARIZE_ERR;
372#endif /* LARGE_FILE_TESTS */
373
374   FINAL_RESULTS;
375}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed