1 /* This is part of the netCDF package.
2 Copyright 2018 University Corporation for Atmospheric Research/Unidata
3 See COPYRIGHT file for conditions of use.
4
5 Test netcdf-4 variables.
6 Ed Hartnett
7 */
8
9 #include <nc_tests.h>
10 #include "err_macros.h"
11 #include "netcdf.h"
12 #include "netcdf_f.h"
13
14 #define FILE_NAME "tst_vars2.nc"
15 #define NUM_DIMS 1
16 #define NUM_VARS 3
17 #define DIM1_LEN NC_UNLIMITED
18 #define DIM1_NAME "Hoplites_Engaged"
19 #define VAR_NAME "Battle_of_Marathon"
20 #define LOSSES_NAME "Miltiades_Losses"
21 #define NDIMS1 1
22 #define MAX_CNUM 4
23
24 int
main(int argc,char ** argv)25 main(int argc, char **argv)
26 {
27 int ncid, dimids[NUM_DIMS];
28 int varid;
29 int nvars_in, varids_in[NUM_VARS] = {0};
30 signed char fill_value = 42, fill_value_in;
31 nc_type xtype_in;
32 size_t len_in;
33 char name_in[NC_MAX_NAME + 1];
34 int attnum_in;
35 int cnum;
36 char too_long_name[NC_MAX_NAME + 2];
37
38 /* Set up a name that is too long for netCDF. */
39 memset(too_long_name, 'a', NC_MAX_NAME + 1);
40 too_long_name[NC_MAX_NAME + 1] = 0;
41
42 printf("\n*** Testing netcdf-4 variable functions, even more.\n");
43 for (cnum = 0; cnum < MAX_CNUM; cnum++)
44 {
45 int cmode = 0;
46
47 switch(cnum)
48 {
49 case 0:
50 printf("*** Testing with classic format:\n");
51 cmode = 0;
52 break;
53 case 1:
54 printf("*** Testing with 64-bit offset format:\n");
55 cmode = NC_64BIT_OFFSET;
56 break;
57 case 2:
58 printf("*** Testing with HDF5:\n");
59 cmode = NC_NETCDF4|NC_CLOBBER;
60 break;
61 case 3:
62 printf("*** Testing with HDF5, netCDF Classic Model:\n");
63 cmode = NC_CLASSIC_MODEL | NC_NETCDF4;
64 break;
65 default:
66 return 1;
67 }
68
69 #define FILE_NAME2 "tst_vars2_latefill.nc"
70 printf("**** testing simple fill value attribute creation...");
71 {
72 int schar_data = 0;
73 size_t index[1] = {0};
74 int expected_ret;
75 int dimid;
76
77 /* Determined the expected result of setting fill value
78 * late. For historical reasons this is allowed for classic
79 * and 64-bit offset formats, but should never be done. */
80 if (cmode == 0 || cmode == NC_64BIT_OFFSET)
81 expected_ret = NC_NOERR;
82 else
83 expected_ret = NC_ELATEFILL;
84
85 /* Create a netcdf-4 file with one scalar var. Add fill
86 * value. */
87 if (nc_create(FILE_NAME2, cmode, &ncid)) ERR;
88 if (nc_def_dim(ncid, VAR_NAME, TEST_VAL_42, &dimid)) ERR;
89 if (nc_def_var(ncid, VAR_NAME, NC_BYTE, 1, &dimid, &varid)) ERR;
90 if (nc_put_att_schar(ncid, varid, _FillValue, NC_BYTE, 1, &fill_value)) ERR;
91 if (nc_enddef(ncid)) ERR;
92 if (nc_put_var1(ncid, varid, index, &schar_data)) ERR;
93 if (nc_redef(ncid)) ERR;
94 if (nc_put_att_schar(ncid, varid, _FillValue, NC_BYTE, 1,
95 &fill_value) != expected_ret) ERR;
96 if (nc_close(ncid)) ERR;
97
98 /* Open the file and check. */
99 if (nc_open(FILE_NAME2, NC_WRITE, &ncid)) ERR;
100 if (nc_inq_varids(ncid, &nvars_in, varids_in)) ERR;
101 if (nvars_in != 1 || varids_in[0] != 0) ERR;
102 if (nc_inq_varname(ncid, 0, name_in)) ERR;
103 if (strcmp(name_in, VAR_NAME)) ERR;
104 if (nc_inq_att(ncid, varid, _FillValue, &xtype_in, &len_in)) ERR;
105 if (xtype_in != NC_BYTE || len_in != 1) ERR;
106 if (nc_get_att(ncid, varid, _FillValue, &fill_value_in)) ERR;
107 if (fill_value_in != fill_value) ERR;
108 if (nc_close(ncid)) ERR;
109 }
110
111 SUMMARIZE_ERR;
112 printf("**** testing simple fill value with data read...");
113 {
114 size_t start[NUM_DIMS], count[NUM_DIMS];
115 signed char data = 99, data_in;
116
117 /* Create a netcdf-4 file with one unlimited dim and one
118 * var. Add fill value. */
119 if (nc_create(FILE_NAME, cmode, &ncid)) ERR;
120 if (nc_def_dim(ncid, DIM1_NAME, DIM1_LEN, &dimids[0])) ERR;
121 if (nc_def_var(ncid, VAR_NAME, NC_BYTE, NUM_DIMS, dimids, &varid)) ERR;
122 if (nc_put_att_schar(ncid, varid, _FillValue, NC_BYTE, 1, &fill_value)) ERR;
123 if (nc_enddef(ncid)) ERR;
124
125 /* Write the second record. */
126 start[0] = 1;
127 count[0] = 1;
128 if (nc_put_vara_schar(ncid, varid, start, count, &data)) ERR;
129
130 /* Read the first record, it should be the fill value. */
131 start[0] = 0;
132 if (nc_get_vara_schar(ncid, varid, start, count, &data_in)) ERR;
133 if (data_in != fill_value) ERR;
134
135 /* Read the second record, it should be the value we just wrote
136 * there. */
137 start[0] = 1;
138 if (nc_get_vara_schar(ncid, varid, start, count, &data_in)) ERR;
139 if (data_in != data) ERR;
140
141 /* Close up. */
142 if (nc_close(ncid)) ERR;
143
144 /* Open the file and check. */
145 if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
146
147 /* This will not work because file was opened read-only. */
148 if (nc_rename_var(ncid, 0, "something_very_new") != NC_EPERM) ERR;
149
150 /* Check metadata. */
151 if (nc_inq_varids(ncid, &nvars_in, varids_in)) ERR;
152 if (nvars_in != 1 || varids_in[0] != 0) ERR;
153 if (nc_inq_varname(ncid, 0, name_in)) ERR;
154 if (strcmp(name_in, VAR_NAME)) ERR;
155
156 /* Check fill value att. */
157 if (nc_inq_att(ncid, varid, _FillValue, &xtype_in, &len_in)) ERR;
158 if (xtype_in != NC_BYTE || len_in != 1) ERR;
159 if (nc_get_att(ncid, varid, _FillValue, &fill_value_in)) ERR;
160 if (fill_value_in != fill_value) ERR;
161
162 /* Read the first record, it should be the fill value. */
163 start[0] = 0;
164 if (nc_get_vara_schar(ncid, varid, start, count, &data_in)) ERR;
165 if (data_in != fill_value) ERR;
166
167 /* Read the second record, it should be the value we just wrote
168 * there. */
169 start[0] = 1;
170 if (nc_get_vara_schar(ncid, varid, start, count, &data_in)) ERR;
171 if (data_in != data) ERR;
172
173 if (nc_close(ncid)) ERR;
174 }
175
176 SUMMARIZE_ERR;
177 printf("**** testing fill value with one other attribute...");
178
179 {
180 int losses_value = 192, losses_value_in;
181
182 /* Create a netcdf-4 file with one dim and one var. Add another
183 * attribute, then fill value. */
184 if (nc_create(FILE_NAME, cmode, &ncid)) ERR;
185 if (nc_def_dim(ncid, DIM1_NAME, DIM1_LEN, &dimids[0])) ERR;
186 if (nc_def_var(ncid, VAR_NAME, NC_BYTE, NUM_DIMS, dimids, &varid)) ERR;
187 if (nc_put_att_int(ncid, varid, LOSSES_NAME, NC_INT, 1, &losses_value)) ERR;
188 if (nc_put_att_schar(ncid, varid, _FillValue, NC_BYTE, 1, &fill_value)) ERR;
189 if (nc_close(ncid)) ERR;
190
191 /* Open the file and check. */
192 if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
193 if (nc_inq_att(ncid, 0, LOSSES_NAME, &xtype_in, &len_in)) ERR;
194 if (xtype_in != NC_INT || len_in != 1) ERR;
195 if (nc_get_att(ncid, 0, LOSSES_NAME, &losses_value_in)) ERR;
196 if (losses_value_in != losses_value) ERR;
197 if (nc_inq_att(ncid, 0, _FillValue, &xtype_in, &len_in)) ERR;
198 if (xtype_in != NC_BYTE || len_in != 1) ERR;
199 if (nc_get_att(ncid, 0, _FillValue, &fill_value_in)) ERR;
200 if (fill_value_in != fill_value) ERR;
201 if (nc_inq_attid(ncid, 0, LOSSES_NAME, &attnum_in)) ERR;
202 if (attnum_in != 0) ERR;
203 if (nc_inq_attid(ncid, 0, _FillValue, &attnum_in)) ERR;
204 if (attnum_in != 1) ERR;
205 if (nc_close(ncid)) ERR;
206 }
207
208 SUMMARIZE_ERR;
209 printf("**** testing fill value with three other attributes...");
210 {
211 #define NUM_LEADERS 3
212 char leader[NUM_LEADERS][NC_MAX_NAME + 1] = {"hair_length_of_strategoi",
213 "hair_length_of_Miltiades",
214 "hair_length_of_Darius_I"};
215 short hair_length[NUM_LEADERS] = {3, 11, 4};
216 short short_in;
217 int a;
218
219 /* Create a netcdf file with one dim and one var. Add 3
220 * attributes, then fill value. */
221 if (nc_create(FILE_NAME, cmode, &ncid)) ERR;
222 if (nc_def_dim(ncid, DIM1_NAME, DIM1_LEN, &dimids[0])) ERR;
223 if (nc_def_var(ncid, VAR_NAME, NC_BYTE, NUM_DIMS, dimids, &varid)) ERR;
224 for (a = 0; a < NUM_LEADERS; a++)
225 if (nc_put_att_short(ncid, varid, leader[a], NC_SHORT, 1, &hair_length[a])) ERR;
226 if (nc_put_att_schar(ncid, varid, _FillValue, NC_BYTE, 1, &fill_value)) ERR;
227 if (nc_close(ncid)) ERR;
228
229 /* Open the file. */
230 if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
231
232 /* Check our three hair-related attributes. */
233 for (a = 0; a < NUM_LEADERS; a++)
234 {
235 if (nc_inq_att(ncid, 0, leader[a], &xtype_in, &len_in)) ERR;
236 if (xtype_in != NC_SHORT || len_in != 1) ERR;
237 if (nc_get_att(ncid, 0, leader[a], &short_in)) ERR;
238 if (short_in != hair_length[a]) ERR;
239 if (nc_inq_attid(ncid, 0, leader[a], &attnum_in)) ERR;
240 if (attnum_in != a) ERR;
241 }
242
243 /* Check our fill value attribute. */
244 if (nc_inq_att(ncid, 0, _FillValue, &xtype_in, &len_in)) ERR;
245 if (xtype_in != NC_BYTE || len_in != 1) ERR;
246 if (nc_get_att(ncid, 0, _FillValue, &fill_value_in)) ERR;
247 if (fill_value_in != fill_value) ERR;
248
249 if (nc_close(ncid)) ERR;
250 }
251
252 SUMMARIZE_ERR;
253 printf("**** testing fill value with simple example...");
254 {
255 /* Dims stuff. */
256 #define NDIMS 3
257 #define VAR_DIMS 3
258 #define DIM_A "dim1"
259 #define DIM_A_LEN 4
260 #define DIM_B "dim2"
261 #define DIM_B_LEN 3
262 #define DIM_C "dim3"
263 #define DIM_C_LEN NC_UNLIMITED
264
265 /* Var stuff. */
266 #define CXX_VAR_NAME "P"
267
268 /* Att stuff. */
269 #define NUM_ATTS 4
270 #define LONG_NAME "long_name"
271 #define PRES_MAX_WIND "pressure at maximum wind"
272 #define UNITS "units"
273 #define HECTOPASCALS "hectopascals"
274
275 int dimid[NDIMS], var_dimids[VAR_DIMS] = {2, 1, 0};
276 float fill_value = -9999.0f;
277 char long_name[] = PRES_MAX_WIND;
278
279 if (nc_create(FILE_NAME, cmode, &ncid)) ERR;
280
281 /* Create dims. */
282 if (nc_def_dim(ncid, DIM_A, DIM_A_LEN, &dimid[0])) ERR;
283 if (nc_def_dim (ncid, DIM_B, DIM_B_LEN, &dimid[1])) ERR;
284 if (nc_def_dim(ncid, DIM_C, DIM_C_LEN, &dimid[2])) ERR;
285
286 /* Create var. */
287 if (nc_def_var(ncid, CXX_VAR_NAME, NC_FLOAT, VAR_DIMS,
288 var_dimids, &varid)) ERR;
289 if (varid) ERR;
290
291 if (nc_put_att(ncid, varid, LONG_NAME, NC_CHAR, strlen(long_name) + 1,
292 long_name)) ERR;
293 if (nc_put_att(ncid, varid, UNITS, NC_CHAR, strlen(UNITS) + 1,
294 UNITS)) ERR;
295
296 /* Check to ensure the atts have their expected attnums. */
297 if (nc_inq_attid(ncid, 0, LONG_NAME, &attnum_in)) ERR;
298 if (attnum_in != 0) ERR;
299 if (nc_inq_attid(ncid, 0, UNITS, &attnum_in)) ERR;
300 if (attnum_in != 1) ERR;
301
302 /* Now add a fill value. This will acutually cause HDF5 to
303 * destroy the dataset and recreate it, recreating also the
304 * three attributes that are attached to it. */
305 if (nc_put_att(ncid, varid, _FillValue, NC_FLOAT,
306 1, &fill_value)) ERR;
307
308 /* Check to ensure the atts have their expected attnums. */
309 if (nc_inq_attid(ncid, 0, LONG_NAME, &attnum_in)) ERR;
310 if (attnum_in != 0) ERR;
311 if (nc_inq_attid(ncid, 0, UNITS, &attnum_in)) ERR;
312 if (attnum_in != 1) ERR;
313
314 if (nc_close(ncid)) ERR;
315
316 /* Open the file and check. */
317 if (nc_open(FILE_NAME, 0, &ncid)) ERR;
318 if (nc_inq_attid(ncid, 0, LONG_NAME, &attnum_in)) ERR;
319 if (attnum_in != 0) ERR;
320 if (nc_inq_attid(ncid, 0, UNITS, &attnum_in)) ERR;
321 if (attnum_in != 1) ERR;
322 if (nc_inq_attid(ncid, 0, _FillValue, &attnum_in)) ERR;
323 if (attnum_in != 2) ERR;
324
325 if (nc_close(ncid)) ERR;
326 }
327 SUMMARIZE_ERR;
328
329 #ifndef NO_NETCDF_2
330 /* The following test is an attempt to recreate a problem occurring
331 in the cxx tests. The file is created in c++ in nctsts.cpp. */
332 printf("**** testing fill value with example from cxx tests in v2 api...");
333 {
334 /* Dims stuff. */
335 #define NDIMS_1 4
336 #define VAR_DIMS 3
337 #define LAT "lat"
338 #define LAT_LEN 4
339 #define LON "lon"
340 #define LON_LEN 3
341 #define FRTIMED "frtimed"
342 #define FRTIMED_LEN NC_UNLIMITED
343 #define TIMELEN "timelen"
344 #define TIMELEN_LEN 20
345
346 /* Var stuff. */
347 #define CXX_VAR_NAME "P"
348
349 /* Att stuff. */
350 #define NUM_ATTS 4
351 #define LONG_NAME "long_name"
352 #define UNITS "units"
353
354 int dimid[NDIMS_1], var_dimids[VAR_DIMS] = {2, 0, 1};
355 float fill_value = -9999.0f;
356 char long_name[] = PRES_MAX_WIND;
357 int i;
358
359 ncid = nccreate(FILE_NAME, NC_NETCDF4);
360
361 /* Create dims. */
362 dimid[0] = ncdimdef(ncid, LAT, LAT_LEN);
363 dimid[1] = ncdimdef(ncid, LON, LON_LEN);
364 dimid[2] = ncdimdef(ncid, FRTIMED, FRTIMED_LEN);
365 dimid[3] = ncdimdef(ncid, TIMELEN, TIMELEN_LEN);
366
367 /* Just check our dimids to see that they are correct. */
368 for (i = 0; i < NDIMS_1; i++)
369 if (dimid[i] != i) ERR;
370
371 /* Create var. */
372 varid = ncvardef(ncid, CXX_VAR_NAME, NC_FLOAT, VAR_DIMS, var_dimids);
373 if (varid) ERR;
374
375 /* Add three atts to the var, long_name, units, and
376 * valid_range. */
377 if (nc_put_att(ncid, varid, LONG_NAME, NC_CHAR, strlen(long_name) + 1,
378 long_name)) ERR;
379 if (nc_put_att(ncid, varid, UNITS, NC_CHAR, strlen(UNITS) + 1,
380 UNITS)) ERR;
381
382 /* Check to ensure the atts have their expected attnums. */
383 if (nc_inq_attid(ncid, 0, LONG_NAME, &attnum_in)) ERR;
384 if (attnum_in != 0) ERR;
385 if (nc_inq_attid(ncid, 0, UNITS, &attnum_in)) ERR;
386 if (attnum_in != 1) ERR;
387
388 /* Now add a fill value. This will acutually cause HDF5 to
389 * destroy the dataset and recreate it, recreating also the
390 * three attributes that are attached to it. */
391 ncattput(ncid, varid, _FillValue, NC_FLOAT, 1, &fill_value);
392
393 /* Check to ensure the atts have their expected attnums. */
394 if (nc_inq_attid(ncid, 0, LONG_NAME, &attnum_in)) ERR;
395 if (attnum_in != 0) ERR;
396 if (nc_inq_attid(ncid, 0, UNITS, &attnum_in)) ERR;
397 if (attnum_in != 1) ERR;
398 if (nc_inq_attid(ncid, 0, _FillValue, &attnum_in)) ERR;
399 if (attnum_in != 2) ERR;
400
401 ncclose(ncid);
402
403 /* Open the file and check. */
404 ncid = ncopen(FILE_NAME, 0);
405 if (nc_inq_attid(ncid, 0, LONG_NAME, &attnum_in)) ERR;
406 if (attnum_in != 0) ERR;
407 if (nc_inq_attid(ncid, 0, UNITS, &attnum_in)) ERR;
408 if (attnum_in != 1) ERR;
409 if (nc_inq_attid(ncid, 0, _FillValue, &attnum_in)) ERR;
410 if (attnum_in != 2) ERR;
411 ncclose(ncid);
412 }
413 SUMMARIZE_ERR;
414 #endif /* NO_NETCDF_2 */
415 }
416
417 printf("**** testing create order varids...");
418
419 #define UNITS "units"
420 #define DIMNAME "x"
421 #define VARNAME "data"
422 {
423 /* This test contributed by Jeff Whitaker of NOAA - Thanks Jeff! */
424 int ncid, dimid, varid, xvarid;
425 char units[] = "zlotys";
426
427 if (nc_create(FILE_NAME, NC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
428 if (nc_def_dim(ncid, DIMNAME, 1, &dimid)) ERR;
429 if (nc_enddef(ncid)) ERR;
430 if (nc_redef(ncid)) ERR;
431
432 /* Check that these netCDF-4 things will fail on this classic
433 * model file. */
434 if (nc_def_var(ncid, DIMNAME, NC_UINT, 1, &dimid, &xvarid) != NC_ESTRICTNC3) ERR;
435 if (nc_def_var(ncid, DIMNAME, NC_INT, NC_MAX_VAR_DIMS + 1, &dimid,
436 &xvarid) != NC_EMAXDIMS) ERR;
437 if (nc_enddef(ncid)) ERR;
438 if (nc_def_var(ncid, DIMNAME, NC_INT, 1, &dimid, &xvarid) != NC_ENOTINDEFINE) ERR;
439 if (nc_redef(ncid)) ERR;
440
441 /* Define the variable for the test. */
442 if (nc_def_var(ncid, DIMNAME, NC_INT, 1, &dimid, &xvarid)) ERR;
443 if (nc_put_att_text(ncid, xvarid, UNITS, strlen(units), units)) ERR;
444 if (nc_def_var(ncid, VARNAME, NC_INT, 1, &dimid, &varid)) ERR;
445 if (nc_close(ncid)) ERR;
446
447 if (nc_open(FILE_NAME, 0, &ncid)) ERR;
448 if (nc_close(ncid)) ERR;
449 }
450
451 SUMMARIZE_ERR;
452 #define RANK_wind 1
453 printf("**** testing simple variable renaming...");
454 {
455 /* This test contributed by Jeff Whitaker of NOAA - Thanks Jeff! */
456 int ncid, lat_dim, time_dim, lon_dim, wind_id;
457 size_t lat_len = 73, time_len = 10, lon_len = 145;
458 int cdf_goober[1];
459
460 /* if (nc_set_default_format(NC_FORMAT_NETCDF4, NULL)) ERR;*/
461 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
462
463 /* define dimensions */
464 if (nc_def_dim(ncid, "a", lon_len, &lon_dim)) ERR;
465 if (nc_def_dim(ncid, "b", lat_len, &lat_dim)) ERR;
466 if (nc_def_dim(ncid, "c", time_len, &time_dim)) ERR;
467
468 if (nc_put_att_text(ncid, NC_GLOBAL, "a", 3, "bar")) ERR;
469 cdf_goober[0] = 2;
470 if (nc_put_att_int(ncid, NC_GLOBAL, "b", NC_INT, 1, cdf_goober)) ERR;
471
472 /* define variables */
473 if (nc_def_var(ncid, "aa", NC_FLOAT, RANK_wind, &lon_dim, &wind_id)) ERR;
474 if (nc_close(ncid)) ERR;
475
476 if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
477
478 /* These won't work. */
479 if (nc_rename_var(ncid + TEST_VAL_42, 0, "az") != NC_EBADID) ERR;
480 if (nc_rename_var(ncid + MILLION, 0, "az") != NC_EBADID) ERR;
481
482 /* Rename the var. */
483 if (nc_rename_var(ncid, 0, "az")) ERR;
484 if (nc_close(ncid)) ERR;
485 }
486
487 SUMMARIZE_ERR;
488 printf("**** testing dimension and variable renaming...");
489 {
490 /* This test based on code contributed by Jeff Whitaker of NOAA
491 * - Thanks Jeff! */
492 int ncid, lat_dim, time_dim, lon_dim, wind_id, temp2_id;
493 size_t lat_len = 73, time_len = 10, lon_len = 145;
494 int wind_dims[RANK_wind], wind_slobber[1], cdf_goober[1];
495
496 if (nc_create(FILE_NAME, NC_NETCDF4|NC_CLASSIC_MODEL, &ncid)) ERR;
497
498 /* define dimensions */
499 if (nc_def_dim(ncid, "lon", lon_len, &lon_dim)) ERR;
500 if (nc_def_dim(ncid, "lat", lat_len, &lat_dim)) ERR;
501 if (nc_def_dim(ncid, "time", time_len, &time_dim)) ERR;
502
503 if (nc_put_att_text(ncid, NC_GLOBAL, "foo", 3, "bar")) ERR;
504 cdf_goober[0] = 2;
505 if (nc_put_att_int(ncid, NC_GLOBAL, "goober", NC_INT, 1, cdf_goober)) ERR;
506
507 /* define variables */
508 wind_dims[0] = lon_dim;
509 if (nc_def_var(ncid, "temp", NC_FLOAT, RANK_wind, wind_dims, &wind_id)) ERR;
510 if (nc_def_var(ncid, "temp2", NC_FLOAT, RANK_wind, wind_dims, &temp2_id)) ERR;
511
512 if (nc_put_att_text(ncid, wind_id, "bar", 3, "foo")) ERR;
513 wind_slobber[0] = 3;
514 if (nc_put_att_int(ncid, wind_id, "slobber", NC_INT, 1, wind_slobber)) ERR;
515 if (nc_close(ncid)) ERR;
516
517 /* re-open dataset*/
518 if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
519 if (nc_inq_dimid(ncid, "lon", &lon_dim)) ERR;
520
521 /* THese won't work due to bad params. */
522 if (nc_rename_dim(ncid + MILLION, lon_dim, "longitude") != NC_EBADID) ERR;
523 if (nc_rename_dim(ncid + TEST_VAL_42, lon_dim, "longitude") != NC_EBADID) ERR;
524 if (nc_rename_dim(ncid, lon_dim, NULL) != NC_EINVAL) ERR;
525
526 /* rename dimension */
527 if (nc_rename_dim(ncid, lon_dim, "longitude")) ERR;
528
529 /* These will fail due to bad params. */
530 if (nc_inq_varid(ncid + MILLION, "temp", &wind_id) != NC_EBADID) ERR;
531 if (nc_inq_varid(ncid + TEST_VAL_42, "temp", &wind_id) != NC_EBADID) ERR;
532 if (nc_inq_varid(ncid, NULL, &wind_id) != NC_EINVAL) ERR;
533 if (nc_inq_varid(ncid, "not_a_real_name", &wind_id) != NC_ENOTVAR) ERR;
534 if (nc_inq_varid(ncid, BAD_NAME, &wind_id) != NC_ENOTVAR) ERR;
535 if (nc_inq_varid(ncid, too_long_name, &wind_id) != NC_EMAXNAME) ERR;
536
537 /* Now get the variable ID. */
538 if (nc_inq_varid(ncid, "temp", &wind_id)) ERR;
539
540 /* THis also works, pointlessly. */
541 if (nc_inq_varid(ncid, "temp", NULL)) ERR;
542
543 /* These won't work due to bad parameters. */
544 if (nc_rename_var(ncid + MILLION, wind_id, "wind") != NC_EBADID) ERR;
545 if (nc_rename_var(ncid, wind_id + TEST_VAL_42, "wind") != NC_ENOTVAR) ERR;
546 if (nc_rename_var(ncid, -TEST_VAL_42, "wind") != NC_ENOTVAR) ERR;
547 if (nc_rename_var(ncid, wind_id, BAD_NAME) != NC_EBADNAME) ERR;
548 if (nc_rename_var(ncid, wind_id, too_long_name) != NC_EMAXNAME) ERR;
549 if (nc_rename_var(ncid, wind_id, "temp2") != NC_ENAMEINUSE) ERR;
550 if (nc_rename_var(ncid, wind_id, "windy") != NC_ENOTINDEFINE) ERR;
551 if (nc_rename_var(ncid, wind_id, NULL) != NC_EINVAL) ERR;
552
553 /* rename variable */
554 if (nc_rename_var(ncid, wind_id, "wind")) ERR;
555
556 /* Enter define mode and rename it to something longer. */
557 if (nc_redef(ncid)) ERR;
558 if (nc_rename_var(ncid, wind_id, "windy")) ERR;
559 if (nc_inq_varid(ncid, "windy", &wind_id)) ERR;
560 if (nc_close(ncid)) ERR;
561
562 /* Try again without classic. */
563 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
564
565 /* define dimension */
566 if (nc_def_dim(ncid, "lon", lon_len, &lon_dim)) ERR;
567
568 /* define variable */
569 wind_dims[0] = lon_dim;
570 if (nc_def_var(ncid, "temp", NC_FLOAT, RANK_wind, wind_dims, &wind_id)) ERR;
571 if (nc_enddef(ncid)) ERR;
572 if (nc_rename_var(ncid, wind_id, "windy")) ERR;
573 if (nc_close(ncid)) ERR;
574
575 }
576 SUMMARIZE_ERR;
577
578 #ifndef NO_NETCDF_2
579 #define VAR_DIMS2 2
580 printf("*** testing 2D array of NC_FLOAT with v2 API...");
581 {
582 int dimid[VAR_DIMS2];
583 int ndims, nvars, natts, recdim;
584
585 ncid = nccreate(FILE_NAME, NC_NETCDF4);
586
587 /* Create dims. */
588 dimid[0] = ncdimdef(ncid, LAT, LAT_LEN);
589 dimid[1] = ncdimdef(ncid, LON, LON_LEN);
590
591 /* Create var. */
592 varid = ncvardef(ncid, CXX_VAR_NAME, NC_FLOAT, VAR_DIMS2, dimid);
593 if (varid != 0) ERR;
594
595 ncclose(ncid);
596
597 /* Open the file and check. */
598 ncid = ncopen(FILE_NAME, 0);
599 ncinquire (ncid, &ndims, &nvars, &natts, &recdim);
600 if (nvars != 1 || ndims != 2 || natts != 0 || recdim != -1) ERR;
601 ncclose(ncid);
602 }
603 SUMMARIZE_ERR;
604 #endif /* NO_NETCDF_2 */
605
606 #define NDIMS 3
607 #define NNAMES 4
608 #define NLINES 13
609 printf("**** testing funny names for netCDF-4...");
610 {
611 int ncid, wind_id;
612 size_t len[NDIMS] = {7, 3, 1};
613 int dimids[NDIMS], dimids_in[NDIMS], ndims_in;
614 char funny_name[NNAMES][NC_MAX_NAME] = {"\a\t", "\f\n", "\r\v", "\b"};
615 char serious_name[NNAMES][NC_MAX_NAME] = {"name1", "name2", "name3", "name4"};
616 char name_in[NC_MAX_NAME + 1];
617 char *speech[NLINES] = {"who would fardels bear, ",
618 "To grunt and sweat under a weary life, ",
619 "But that the dread of something after death, ",
620 "The undiscover'd country from whose bourn ",
621 "No traveller returns, puzzles the will ",
622 "And makes us rather bear those ills we have ",
623 "Than fly to others that we know not of? ",
624 "Thus conscience does make cowards of us all; ",
625 "And thus the native hue of resolution ",
626 "Is sicklied o'er with the pale cast of thought, ",
627 "And enterprises of great pith and moment ",
628 "With this regard their currents turn awry, ",
629 "And lose the name of action."};
630 char *speech_in[NLINES];
631 int i;
632 unsigned short nlines = NLINES;
633 unsigned int nlines_in;
634
635 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
636
637 /* Define dimensions. Funny names are rejected, serious names work. */
638 for (i = 0; i < NDIMS; i++)
639 if (nc_def_dim(ncid, funny_name[i], len[i], &dimids[i]) != NC_EBADNAME) ERR;
640 for (i = 0; i < NDIMS; i++)
641 if (nc_def_dim(ncid, serious_name[i], len[i], &dimids[i])) ERR;
642
643 /* Write some global atts. Funny names are rejected, serious names work. */
644 if (nc_put_att_string(ncid, NC_GLOBAL, funny_name[0], NLINES,
645 (const char **)speech) != NC_EBADNAME) ERR;
646 if (nc_put_att_ushort(ncid, NC_GLOBAL, funny_name[1], NC_UINT, 1, &nlines) != NC_EBADNAME) ERR;
647 if (nc_put_att_string(ncid, NC_GLOBAL, serious_name[0], NLINES,
648 (const char **)speech)) ERR;
649 if (nc_put_att_ushort(ncid, NC_GLOBAL, serious_name[1], NC_UINT, 1, &nlines)) ERR;
650
651 /* Define variables. Funny name fails, seriousness wins the day! */
652 if (nc_def_var(ncid, funny_name[3], NC_INT64, NDIMS, dimids, &wind_id) != NC_EBADNAME) ERR;
653 if (nc_def_var(ncid, serious_name[3], NC_INT64, NDIMS, dimids, &wind_id)) ERR;
654
655 if (nc_close(ncid)) ERR;
656
657 /* Open the file and check. */
658 if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
659 if (nc_inq_dimids(ncid, &ndims_in, dimids_in, 0)) ERR;
660 if (ndims_in != NDIMS) ERR;
661 for (i = 0; i < NDIMS; i++)
662 {
663 if (dimids_in[i] != i) ERR;
664 if (nc_inq_dimname(ncid, i, name_in)) ERR;
665 if (strcmp(name_in, serious_name[i])) ERR;
666 }
667
668 if (nc_get_att_string(ncid, NC_GLOBAL, serious_name[0], (char **)speech_in)) ERR;
669 for (i = 0; i < NLINES; i++)
670 if (strcmp(speech_in[i], speech[i])) ERR;
671 if (nc_get_att_uint(ncid, NC_GLOBAL, serious_name[1], &nlines_in)) ERR;
672 if (nlines_in != NLINES) ERR;
673 if (nc_free_string(NLINES, (char **)speech_in)) ERR;
674 if (nc_inq_varname(ncid, 0, name_in)) ERR;
675 if (strcmp(name_in, serious_name[3])) ERR;
676 if (nc_close(ncid)) ERR;
677 }
678 SUMMARIZE_ERR;
679 printf("**** testing endianness...");
680
681 #define NDIMS4 1
682 #define DIM4_NAME "Joe"
683 #define VAR_NAME4 "Ed"
684 #define DIM4_LEN 10
685 {
686 int dimids[NDIMS4], dimids_in[NDIMS4];
687 int varid, varid1;
688 int ndims, nvars, natts, unlimdimid;
689 nc_type xtype_in;
690 char name_in[NC_MAX_NAME + 1];
691 int data[DIM4_LEN], data_in[DIM4_LEN];
692 int endian_in;
693 int i;
694
695 for (i = 0; i < DIM4_LEN; i++)
696 data[i] = i;
697
698 /* Create a netcdf-4 file with one dim and one var. */
699 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
700 if (nc_def_dim(ncid, DIM4_NAME, DIM4_LEN, &dimids[0])) ERR;
701 if (dimids[0] != 0) ERR;
702 if (nc_def_var(ncid, VAR_NAME4, NC_INT, NDIMS4, dimids, &varid)) ERR;
703 if (nc_def_var_endian(ncid, varid, NC_ENDIAN_BIG)) ERR;
704 if (varid != 0) ERR;
705 if (nc_put_var_int(ncid, varid, data)) ERR;
706
707 /* Check stuff. */
708 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
709 if (ndims != NDIMS4 || nvars != 1 || natts != 0 ||
710 unlimdimid != -1) ERR;
711 if (nc_inq_varids(ncid, &nvars, varids_in)) ERR;
712 if (nvars != 1) ERR;
713 if (varids_in[0] != 0) ERR;
714
715 /* Test some bad parameter values. */
716 if (nc_inq_var(ncid + MILLION, 0, name_in, &xtype_in, &ndims,
717 dimids_in, &natts) != NC_EBADID) ERR;
718 if (nc_inq_var(ncid + TEST_VAL_42, 0, name_in, &xtype_in, &ndims,
719 dimids_in, &natts) != NC_EBADID) ERR;
720 if (nc_inq_var(ncid, -TEST_VAL_42, name_in, &xtype_in, &ndims,
721 dimids_in, &natts) != NC_ENOTVAR) ERR;
722 if (nc_inq_var(ncid, 1, name_in, &xtype_in, &ndims,
723 dimids_in, &natts) != NC_ENOTVAR) ERR;
724 if (nc_inq_var(ncid, TEST_VAL_42, name_in, &xtype_in, &ndims,
725 dimids_in, &natts) != NC_ENOTVAR) ERR;
726
727 /* Now pass correct parameters. */
728 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims,
729 dimids_in, &natts)) ERR;
730 if (strcmp(name_in, VAR_NAME4) || xtype_in != NC_INT ||
731 ndims != 1 || natts != 0 || dimids_in[0] != 0) ERR;
732 if (nc_inq_var_endian(ncid, 0, &endian_in)) ERR;
733 if (endian_in != NC_ENDIAN_BIG) ERR;
734
735 /* This also works, uselessly. */
736 if (nc_inq_var(ncid, 0, name_in, NULL, NULL, NULL, NULL)) ERR;
737
738 if (nc_close(ncid)) ERR;
739
740 /* Open the file and check the same stuff. */
741 if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
742
743 /* This won't work. */
744 if (nc_def_var(ncid, "this_wont_work", NC_BYTE, NDIMS4, dimids,
745 &varid1) != NC_EPERM) ERR;
746
747 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
748 if (ndims != NDIMS4 || nvars != 1 || natts != 0 ||
749 unlimdimid != -1) ERR;
750 if (nc_inq_varids(ncid, &nvars, varids_in)) ERR;
751 if (nvars != 1) ERR;
752 if (varids_in[0] != 0) ERR;
753 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims,
754 dimids_in, &natts)) ERR;
755 if (strcmp(name_in, VAR_NAME4) || xtype_in != NC_INT ||
756 ndims != 1 || natts != 0 || dimids_in[0] != 0) ERR;
757 if (nc_inq_var_endian(ncid, 0, &endian_in)) ERR;
758 if (endian_in != NC_ENDIAN_BIG) ERR;
759 if (nc_get_var_int(ncid, varid, data_in)) ERR;
760 for (i = 0; i < DIM4_LEN; i++)
761 if (data[i] != data_in[i]) ERR;
762
763 if (nc_close(ncid)) ERR;
764 }
765
766 SUMMARIZE_ERR;
767 printf("**** testing chunking and the chunk cache...");
768 {
769 #define NDIMS5 1
770 #define DIM5_NAME "D5"
771 #define VAR_NAME5 "V5"
772 #define VAR_NAME5_1 "V5_1"
773 #define VAR_NAME5_2 "V5_2"
774 #define VAR_NAME5_3 "V5_3"
775 #define VAR_NAME5_4 "V5_4"
776 #define DIM5_LEN 1000
777 #define CACHE_SIZE 32000000
778 #define CACHE_NELEMS 1009
779 #define CACHE_PREEMPTION .75
780 #define CACHE_SIZE2 64000000
781 #define CACHE_NELEMS2 2000
782 #define CACHE_PREEMPTION2 .50
783 #define NVAR4 5
784
785 int dimids[NDIMS5], dimids_in[NDIMS5];
786 int varid, varid1, varid2, varid3, varid4;
787 int varids_in4[NVAR4];
788 int ndims, nvars, natts, unlimdimid;
789 nc_type xtype_in;
790 char name_in[NC_MAX_NAME + 1];
791 int data[DIM5_LEN], data_in[DIM5_LEN];
792 size_t chunksize[NDIMS5] = {5};
793 size_t bad_chunksize[NDIMS5] = {-5}; /* Converted to large pos number since size_t is unsigned. */
794 size_t large_chunksize[NDIMS5] = {(size_t)NC_MAX_INT + (size_t)1}; /* Too big for inq_var_chunking_ints(). */
795 size_t chunksize_in[NDIMS5];
796 int chunksize_int[NDIMS5];
797 int chunksize_int_in[NDIMS5];
798 int storage_in;
799 size_t cache_size_in, cache_nelems_in;
800 float cache_preemption_in;
801 int cache_size_int_in, cache_nelems_int_in;
802 int cache_preemption_int_in;
803 int cache_size_int_default, cache_nelems_int_default;
804 int cache_preemption_int_default;
805 int i, d;
806
807 for (i = 0; i < DIM5_LEN; i++)
808 data[i] = i;
809
810 /* Create a netcdf-4 file with one dim and one var. */
811 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
812 if (nc_def_dim(ncid, DIM5_NAME, DIM5_LEN, &dimids[0])) ERR;
813 if (dimids[0] != 0) ERR;
814
815 /* Define the variable. */
816 if (nc_def_var(ncid, VAR_NAME5, NC_INT, NDIMS5, dimids, &varid)) ERR;
817
818 /* These will fail due to bad parameters. */
819 if (nc_def_var_chunking(ncid + MILLION, varid, NC_CHUNKED,
820 chunksize) != NC_EBADID) ERR;
821 if (nc_def_var_chunking(ncid + TEST_VAL_42, varid, NC_CHUNKED,
822 chunksize) != NC_EBADID) ERR;
823 if (nc_def_var_chunking(ncid, varid + TEST_VAL_42, NC_CHUNKED,
824 chunksize) != NC_ENOTVAR) ERR;
825 if (nc_def_var_chunking(ncid, varid + 1, NC_CHUNKED,
826 chunksize) != NC_ENOTVAR) ERR;
827 if (nc_def_var_chunking(ncid, -1, NC_CHUNKED,
828 chunksize) != NC_ENOTVAR) ERR;
829 if (nc_def_var_chunking(ncid, varid, NC_CHUNKED, bad_chunksize) !=
830 NC_EBADCHUNK) ERR;
831
832 /* Define the chunking. */
833 if (nc_def_var_chunking(ncid, varid, NC_CHUNKED, chunksize)) ERR;
834
835 /* Try to set var cache with bad parameters. They will be
836 * rejected. */
837 if (nc_set_var_chunk_cache(ncid + MILLION, varid, CACHE_SIZE, CACHE_NELEMS,
838 CACHE_PREEMPTION) != NC_EBADID) ERR;
839 if (nc_set_var_chunk_cache(ncid + 1, varid, CACHE_SIZE, CACHE_NELEMS,
840 CACHE_PREEMPTION) != NC_EBADID) ERR;
841 if (nc_set_var_chunk_cache(ncid, varid + TEST_VAL_42, CACHE_SIZE, CACHE_NELEMS,
842 CACHE_PREEMPTION) != NC_ENOTVAR) ERR;
843 if (nc_set_var_chunk_cache(ncid, -TEST_VAL_42, CACHE_SIZE, CACHE_NELEMS,
844 CACHE_PREEMPTION) != NC_ENOTVAR) ERR;
845 if (nc_set_var_chunk_cache(ncid, varid + 1, CACHE_SIZE, CACHE_NELEMS,
846 CACHE_PREEMPTION) != NC_ENOTVAR) ERR;
847 if (nc_set_var_chunk_cache(ncid, varid, CACHE_SIZE, CACHE_NELEMS,
848 CACHE_PREEMPTION + TEST_VAL_42) != NC_EINVAL) ERR;
849 if (nc_set_var_chunk_cache(ncid, varid, CACHE_SIZE, CACHE_NELEMS,
850 CACHE_PREEMPTION - TEST_VAL_42) != NC_EINVAL) ERR;
851
852 /* Set the cache. */
853 if (nc_set_var_chunk_cache(ncid, varid, CACHE_SIZE, CACHE_NELEMS, CACHE_PREEMPTION)) ERR;
854 if (nc_put_var_int(ncid, varid, data)) ERR;
855
856 /* Check stuff. */
857 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
858 if (ndims != NDIMS5 || nvars != 1 || natts != 0 ||
859 unlimdimid != -1) ERR;
860 if (nc_inq_varids(ncid, &nvars, varids_in4)) ERR;
861 if (nvars != 1) ERR;
862 if (varids_in4[0] != 0) ERR;
863 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims, dimids_in, &natts)) ERR;
864 if (strcmp(name_in, VAR_NAME5) || xtype_in != NC_INT || ndims != 1 || natts != 0 ||
865 dimids_in[0] != 0) ERR;
866 if (nc_inq_var_chunking(ncid, 0, &storage_in, chunksize_in)) ERR;
867 for (d = 0; d < NDIMS5; d++)
868 if (chunksize[d] != chunksize_in[d]) ERR;
869 if (storage_in != NC_CHUNKED) ERR;
870 if (nc_get_var_int(ncid, varid, data_in)) ERR;
871 for (i = 0; i < DIM5_LEN; i++)
872 if (data[i] != data_in[i])
873 ERR_RET;
874
875 /* These will not work due to bad parameters. */
876 if (nc_inq_var_chunking_ints(ncid + MILLION, 0, &storage_in,
877 chunksize_int_in) != NC_EBADID) ERR;
878 if (nc_inq_var_chunking_ints(ncid + TEST_VAL_42, 0, &storage_in,
879 chunksize_int_in) != NC_EBADID) ERR;
880 if (nc_inq_var_chunking_ints(ncid, -1, &storage_in,
881 chunksize_int_in) != NC_ENOTVAR) ERR;
882 if (nc_inq_var_chunking_ints(ncid, varid + 1, &storage_in,
883 chunksize_int_in) != NC_ENOTVAR) ERR;
884 if (nc_inq_var_chunking_ints(ncid, varid + TEST_VAL_42, &storage_in,
885 chunksize_int_in) != NC_ENOTVAR) ERR;
886
887 /* Now check with the fortran versions of the var_chunking. */
888 if (nc_inq_var_chunking_ints(ncid, 0, &storage_in, chunksize_int_in)) ERR;
889 if (storage_in != NC_CHUNKED) ERR;
890 for (d = 0; d < NDIMS5; d++)
891 if (chunksize_int_in[d] != chunksize[d]) ERR;
892 for (d = 0; d < NDIMS5; d++)
893 chunksize_int[d] = chunksize[d] * 2;
894 if (nc_inq_var_chunking_ints(ncid, 0, &storage_in, NULL)) ERR;
895 if (storage_in != NC_CHUNKED) ERR;
896
897 /* Check that some bad parameter values are rejected properly. */
898 if (nc_def_var_chunking_ints(ncid + MILLION, varid, NC_CHUNKED,
899 chunksize_int) != NC_EBADID) ERR;
900 if (nc_def_var_chunking_ints(ncid + TEST_VAL_42, varid, NC_CHUNKED,
901 chunksize_int) != NC_EBADID) ERR;
902 if (nc_def_var_chunking_ints(ncid, -1, NC_CHUNKED,
903 chunksize_int) != NC_ENOTVAR) ERR;
904 if (nc_def_var_chunking_ints(ncid, varid + 1, NC_CHUNKED,
905 chunksize_int) != NC_ENOTVAR) ERR;
906 if (nc_def_var_chunking_ints(ncid, varid + TEST_VAL_42, NC_CHUNKED,
907 chunksize_int) != NC_ENOTVAR) ERR;
908
909 if (nc_def_var_chunking_ints(ncid, varid, NC_CHUNKED, chunksize_int) != NC_ELATEDEF) ERR;
910 if (nc_redef(ncid)) ERR;
911 if (nc_def_var(ncid, VAR_NAME5_1, NC_INT, NDIMS5, dimids, &varid1)) ERR;
912 if (nc_def_var(ncid, VAR_NAME5_2, NC_INT, 0, NULL, &varid2)) ERR;
913 if (nc_def_var(ncid, VAR_NAME5_3, NC_INT, 0, NULL, &varid3)) ERR;
914 if (nc_def_var(ncid, VAR_NAME5_4, NC_INT, NDIMS5, dimids, &varid4)) ERR;
915 if (nc_def_var_chunking(ncid, varid2, NC_CHUNKED, chunksize) != NC_EINVAL) ERR;
916 if (nc_def_var_chunking(ncid, varid3, NC_CONTIGUOUS, NULL)) ERR;
917 if (nc_def_var_chunking(ncid, varid4, NC_CHUNKED, large_chunksize) != NC_EBADCHUNK) ERR;
918 if (nc_def_var_chunking_ints(ncid, varid2, NC_CHUNKED, chunksize_int) != NC_EINVAL) ERR;
919 if (nc_def_var_chunking_ints(ncid, varid1, NC_CHUNKED, chunksize_int)) ERR;
920 if (nc_inq_var_chunking_ints(ncid, varid2, &storage_in, NULL)) ERR;
921 if (storage_in != NC_CONTIGUOUS) ERR;
922 if (nc_inq_var_chunking_ints(ncid, varid1, NULL, chunksize_int_in)) ERR;
923 for (d = 0; d < NDIMS5; d++)
924 if (chunksize_int_in[d] != chunksize[d] * 2) ERR;
925 if (nc_inq_var_chunking_ints(ncid, varid1, &storage_in, NULL)) ERR;
926 if (storage_in != NC_CHUNKED) ERR;
927 if (nc_inq_var_chunking_ints(ncid, varid3, &storage_in, NULL)) ERR;
928 if (storage_in != NC_CONTIGUOUS) ERR;
929 if (nc_inq_var_chunking_ints(ncid, varid3, &storage_in, chunksize_int_in)) ERR;
930 if (storage_in != NC_CONTIGUOUS) ERR;
931
932 /* Check that some bad parameter values are rejected properly. */
933 if (nc_get_var_chunk_cache(ncid + MILLION, varid, &cache_size_in, &cache_nelems_in,
934 &cache_preemption_in) != NC_EBADID) ERR;
935 if (nc_get_var_chunk_cache(ncid + 1, -TEST_VAL_42, &cache_size_in, &cache_nelems_in,
936 &cache_preemption_in) != NC_EBADID) ERR;
937 if (nc_get_var_chunk_cache(ncid, varid + TEST_VAL_42, &cache_size_in, &cache_nelems_in,
938 &cache_preemption_in) != NC_ENOTVAR) ERR;
939 if (nc_get_var_chunk_cache(ncid, varid4 + 1, &cache_size_in, &cache_nelems_in,
940 &cache_preemption_in) != NC_ENOTVAR) ERR;
941 if (nc_get_var_chunk_cache(ncid, -TEST_VAL_42, &cache_size_in, &cache_nelems_in,
942 &cache_preemption_in) != NC_ENOTVAR) ERR;
943
944 /* Get the var chunk cache settings. */
945 if (nc_get_var_chunk_cache(ncid, varid, &cache_size_in, &cache_nelems_in,
946 &cache_preemption_in)) ERR;
947 if (cache_size_in != CACHE_SIZE || cache_nelems_in != CACHE_NELEMS ||
948 cache_preemption_in != CACHE_PREEMPTION) ERR;
949 /* THis should also work, pointlessly. */
950 if (nc_get_var_chunk_cache(ncid, varid, NULL, NULL, NULL)) ERR;
951
952 /* Check the _int version of this function, used by the F77 API. */
953 if (nc_get_var_chunk_cache_ints(ncid, varid, &cache_size_int_in, &cache_nelems_int_in,
954 &cache_preemption_int_in)) ERR;
955 if (cache_size_int_in != CACHE_SIZE / MEGABYTE) ERR;
956 if (cache_nelems_int_in != CACHE_NELEMS) ERR;
957 if (cache_preemption_int_in != (int)(CACHE_PREEMPTION * 100)) ERR;
958 /* THis should also work, pointlessly. */
959 if (nc_get_var_chunk_cache_ints(ncid, varid, NULL, NULL, NULL)) ERR;
960
961 if (nc_close(ncid)) ERR;
962
963 /* Open the file and check the same stuff. */
964 if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
965
966 /* Check stuff. */
967 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
968 if (ndims != NDIMS5 || nvars != NVAR4 || natts != 0 ||
969 unlimdimid != -1) ERR;
970 if (nc_inq_varids(ncid, &nvars, varids_in4)) ERR;
971 if (nvars != NVAR4) ERR;
972 if (varids_in4[0] != 0 || varids_in4[1] != 1) ERR;
973 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims, dimids_in, &natts)) ERR;
974 if (strcmp(name_in, VAR_NAME5) || xtype_in != NC_INT || ndims != 1 || natts != 0 ||
975 dimids_in[0] != 0) ERR;
976 if (nc_inq_var_chunking(ncid, 0, &storage_in, chunksize_in)) ERR;
977 for (d = 0; d < NDIMS5; d++)
978 if (chunksize[d] != chunksize_in[d]) ERR;
979 if (storage_in != NC_CHUNKED) ERR;
980 if (nc_get_var_int(ncid, varid, data_in)) ERR;
981 for (i = 0; i < DIM5_LEN; i++)
982 if (data[i] != data_in[i])
983 ERR_RET;
984
985 /* Use the _int function to change the var chunk cache settings. */
986 if (nc_set_var_chunk_cache_ints(ncid, varid, CACHE_SIZE2 / MEGABYTE, CACHE_NELEMS2,
987 (int)(CACHE_PREEMPTION2 * 100))) ERR;
988
989 /* These will fail due to bad ncid and group ID. */
990 if (nc_get_var_chunk_cache_ints(ncid + MILLION, varid, &cache_size_int_in, &cache_nelems_int_in,
991 &cache_preemption_int_in) != NC_EBADID) ERR;
992 if (nc_get_var_chunk_cache_ints(ncid + TEST_VAL_42, varid, &cache_size_int_in, &cache_nelems_int_in,
993 &cache_preemption_int_in) != NC_EBADID) ERR;
994
995 /* Now get the settings. */
996 if (nc_get_var_chunk_cache_ints(ncid, varid, &cache_size_int_in, &cache_nelems_int_in,
997 &cache_preemption_int_in)) ERR;
998 if (cache_size_int_in != CACHE_SIZE2 / MEGABYTE || cache_nelems_int_in != CACHE_NELEMS2 ||
999 cache_preemption_int_in != (int)(CACHE_PREEMPTION2 * 100)) ERR;
1000
1001 /* Passing negative values to the _int function causes them to
1002 * be ignored and a default setting used. Set all to negative to
1003 * get defaults.. */
1004 if (nc_set_var_chunk_cache_ints(ncid, varid, -CACHE_SIZE / MEGABYTE, -CACHE_NELEMS2,
1005 -(int)(CACHE_PREEMPTION2 * 100))) ERR;
1006 if (nc_get_var_chunk_cache_ints(ncid, varid, &cache_size_int_default, &cache_nelems_int_default,
1007 &cache_preemption_int_default)) ERR;
1008
1009 /* Now set the size only. */
1010 if (nc_set_var_chunk_cache_ints(ncid, varid, CACHE_SIZE / MEGABYTE, -CACHE_NELEMS2,
1011 -(int)(CACHE_PREEMPTION2 * 100))) ERR;
1012 if (nc_get_var_chunk_cache_ints(ncid, varid, &cache_size_int_in, &cache_nelems_int_in,
1013 &cache_preemption_int_in)) ERR;
1014 if (cache_size_int_in != CACHE_SIZE / MEGABYTE || cache_nelems_int_in != cache_nelems_int_default ||
1015 cache_preemption_int_in != cache_preemption_int_default) ERR;
1016 /* Now set the nelems only. */
1017 if (nc_set_var_chunk_cache_ints(ncid, varid, -CACHE_SIZE / MEGABYTE, CACHE_NELEMS,
1018 -(int)(CACHE_PREEMPTION2 * 100))) ERR;
1019 if (nc_get_var_chunk_cache_ints(ncid, varid, &cache_size_int_in, &cache_nelems_int_in,
1020 &cache_preemption_int_in)) ERR;
1021 if (cache_size_int_in != cache_size_int_default || cache_nelems_int_in != CACHE_NELEMS ||
1022 cache_preemption_int_in != cache_preemption_int_default) ERR;
1023 /* Now set the preemption only. */
1024 if (nc_set_var_chunk_cache_ints(ncid, varid, -CACHE_SIZE / MEGABYTE, -CACHE_NELEMS,
1025 (int)(CACHE_PREEMPTION2 * 100))) ERR;
1026 if (nc_get_var_chunk_cache_ints(ncid, varid, &cache_size_int_in, &cache_nelems_int_in,
1027 &cache_preemption_int_in)) ERR;
1028 if (cache_size_int_in != cache_size_int_default || cache_nelems_int_in != cache_nelems_int_default ||
1029 cache_preemption_int_in != (int)(CACHE_PREEMPTION2 * 100)) ERR;
1030
1031 if (nc_close(ncid)) ERR;
1032 }
1033
1034 SUMMARIZE_ERR;
1035 printf("**** testing netCDF-4 functions on netCDF-3 files...");
1036 {
1037 int dimids[NDIMS5], dimids_in[NDIMS5];
1038 int varid;
1039 int ndims, nvars, natts, unlimdimid;
1040 nc_type xtype_in;
1041 char name_in[NC_MAX_NAME + 1];
1042 int data[DIM5_LEN], data_in[DIM5_LEN];
1043 size_t chunksize[NDIMS5] = {5};
1044 size_t chunksize_in[NDIMS5];
1045 int storage_in;
1046 size_t cache_size_in, cache_nelems_in;
1047 float cache_preemption_in;
1048 int i;
1049
1050 for (i = 0; i < DIM5_LEN; i++)
1051 data[i] = i;
1052
1053 /* Create a netcdf classic file with one dim and one var. */
1054 if (nc_create(FILE_NAME, 0, &ncid)) ERR;
1055 if (nc_def_dim(ncid, DIM5_NAME, DIM5_LEN, &dimids[0])) ERR;
1056 if (dimids[0] != 0) ERR;
1057 if (nc_def_var(ncid, VAR_NAME5, NC_INT, NDIMS5, dimids, &varid)) ERR;
1058
1059 /* These will return error. */
1060 if (nc_def_var_chunking(ncid, varid, NC_CHUNKED, chunksize) != NC_ENOTNC4) ERR;
1061 if (nc_set_var_chunk_cache(ncid, varid, CACHE_SIZE, CACHE_NELEMS,
1062 CACHE_PREEMPTION) != NC_ENOTNC4) ERR;
1063
1064 if (nc_enddef(ncid)) ERR;
1065 if (nc_put_var_int(ncid, varid, data)) ERR;
1066
1067 /* Check stuff. */
1068 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
1069 if (ndims != NDIMS5 || nvars != 1 || natts != 0 ||
1070 unlimdimid != -1) ERR;
1071 if (nc_inq_varids(ncid, &nvars, varids_in)) ERR;
1072 if (nvars != 1) ERR;
1073 if (varids_in[0] != 0) ERR;
1074 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims, dimids_in, &natts)) ERR;
1075 if (strcmp(name_in, VAR_NAME5) || xtype_in != NC_INT || ndims != 1 || natts != 0 ||
1076 dimids_in[0] != 0) ERR;
1077
1078 /* This call fails. */
1079 if (nc_get_var_chunk_cache(ncid, varid, &cache_size_in, &cache_nelems_in,
1080 &cache_preemption_in) != NC_ENOTNC4) ERR;
1081
1082 /* This call passes but does nothing. */
1083 if (nc_inq_var_chunking(ncid, 0, &storage_in, chunksize_in)) ERR;
1084
1085 if (nc_get_var_int(ncid, varid, data_in)) ERR;
1086 for (i = 0; i < DIM5_LEN; i++)
1087 if (data[i] != data_in[i])
1088 ERR_RET;
1089
1090 if (nc_close(ncid)) ERR;
1091
1092 /* Open the file and check the same stuff. */
1093 if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
1094
1095 /* Check stuff. */
1096 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
1097 if (ndims != NDIMS5 || nvars != 1 || natts != 0 ||
1098 unlimdimid != -1) ERR;
1099 if (nc_inq_varids(ncid, &nvars, varids_in)) ERR;
1100 if (nvars != 1) ERR;
1101 if (varids_in[0] != 0) ERR;
1102 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims, dimids_in, &natts)) ERR;
1103 if (strcmp(name_in, VAR_NAME5) || xtype_in != NC_INT || ndims != 1 || natts != 0 ||
1104 dimids_in[0] != 0) ERR;
1105
1106 /* This call fails. */
1107 if (nc_get_var_chunk_cache(ncid, varid, &cache_size_in, &cache_nelems_in,
1108 &cache_preemption_in) != NC_ENOTNC4) ERR;
1109
1110 /* This call passes but does nothing. */
1111 if (nc_inq_var_chunking(ncid, 0, &storage_in, chunksize_in)) ERR;
1112
1113 if (nc_get_var_int(ncid, varid, data_in)) ERR;
1114 for (i = 0; i < DIM5_LEN; i++)
1115 if (data[i] != data_in[i])
1116 ERR_RET;
1117 if (nc_close(ncid)) ERR;
1118 }
1119
1120 SUMMARIZE_ERR;
1121 printf("**** testing contiguous storage...");
1122 {
1123 #define DIM6_NAME "D5"
1124 #define VAR_NAME6 "V5"
1125 #define DIM6_LEN 100
1126
1127 int dimids[NDIMS1], dimids_in[NDIMS1];
1128 int varid;
1129 int ndims, nvars, natts, unlimdimid;
1130 nc_type xtype_in;
1131 char name_in[NC_MAX_NAME + 1];
1132 int data[DIM6_LEN], data_in[DIM6_LEN];
1133 size_t chunksize_in[NDIMS1];
1134 int storage_in;
1135 int i;
1136
1137 for (i = 0; i < DIM6_LEN; i++)
1138 data[i] = i;
1139
1140 /* Create a netcdf-4 file with one dim and one var. */
1141 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
1142 if (nc_def_dim(ncid, DIM6_NAME, DIM6_LEN, &dimids[0])) ERR;
1143 if (dimids[0] != 0) ERR;
1144 if (nc_def_var(ncid, VAR_NAME6, NC_INT, NDIMS1, dimids, &varid)) ERR;
1145 if (nc_def_var_chunking(ncid, varid, NC_CONTIGUOUS, NULL)) ERR;
1146 if (nc_put_var_int(ncid, varid, data)) ERR;
1147
1148 /* Check stuff. */
1149 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
1150 if (ndims != NDIMS1 || nvars != 1 || natts != 0 ||
1151 unlimdimid != -1) ERR;
1152 if (nc_inq_varids(ncid, &nvars, varids_in)) ERR;
1153 if (nvars != 1) ERR;
1154 if (varids_in[0] != 0) ERR;
1155 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims, dimids_in, &natts)) ERR;
1156 if (strcmp(name_in, VAR_NAME6) || xtype_in != NC_INT || ndims != 1 || natts != 0 ||
1157 dimids_in[0] != 0) ERR;
1158 if (nc_inq_var_chunking(ncid, 0, &storage_in, chunksize_in)) ERR;
1159 if (storage_in != NC_CONTIGUOUS) ERR;
1160 if (nc_get_var_int(ncid, varid, data_in)) ERR;
1161 for (i = 0; i < DIM6_LEN; i++)
1162 if (data_in[i] != data[i])
1163 ERR_RET;
1164 if (nc_close(ncid)) ERR;
1165
1166 /* Open the file and check the same stuff. */
1167 if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
1168
1169 /* Check stuff. */
1170 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
1171 if (ndims != NDIMS1 || nvars != 1 || natts != 0 ||
1172 unlimdimid != -1) ERR;
1173 if (nc_inq_varids(ncid, &nvars, varids_in)) ERR;
1174 if (nvars != 1) ERR;
1175 if (varids_in[0] != 0) ERR;
1176 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims, dimids_in, &natts)) ERR;
1177 if (strcmp(name_in, VAR_NAME6) || xtype_in != NC_INT || ndims != 1 || natts != 0 ||
1178 dimids_in[0] != 0) ERR;
1179 if (nc_inq_var_chunking(ncid, 0, &storage_in, chunksize_in)) ERR;
1180 if (storage_in != NC_CONTIGUOUS) ERR;
1181 if (nc_get_var_int(ncid, varid, data_in)) ERR;
1182 for (i = 0; i < DIM6_LEN; i++)
1183 if (data[i] != data_in[i])
1184 ERR_RET;
1185 if (nc_close(ncid)) ERR;
1186 }
1187
1188 SUMMARIZE_ERR;
1189 printf("**** testing extreme numbers dude...");
1190 {
1191 #define VAR_NAME7 "V5"
1192 #define DIM6_LEN 100
1193
1194 int varid;
1195 int ndims, nvars, natts, unlimdimid;
1196 nc_type xtype_in;
1197 char name_in[NC_MAX_NAME + 1];
1198 /* unsigned long long data = 9223372036854775807ull, data_in;*/
1199 unsigned long long data = 9223372036854775817ull, data_in;
1200
1201 /* Create a netcdf-4 file with scalar var. */
1202 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
1203 if (nc_def_var(ncid, VAR_NAME7, NC_UINT64, 0, NULL, &varid)) ERR;
1204 if (nc_put_var_ulonglong(ncid, varid, &data)) ERR;
1205
1206 /* Check stuff. */
1207 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
1208 if (ndims != 0 || nvars != 1 || natts != 0 || unlimdimid != -1) ERR;
1209 if (nc_inq_varids(ncid, &nvars, varids_in)) ERR;
1210 if (nvars != 1 || varids_in[0] != 0) ERR;
1211 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims, NULL, &natts)) ERR;
1212 if (strcmp(name_in, VAR_NAME7) || xtype_in != NC_UINT64 || ndims != 0 || natts != 0) ERR;
1213 if (nc_get_var_ulonglong(ncid, varid, &data_in)) ERR;
1214 if (data_in != data) ERR;
1215 if (nc_close(ncid)) ERR;
1216
1217 /* Open the file and check the same stuff. */
1218 if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
1219 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
1220 if (ndims != 0 || nvars != 1 || natts != 0 || unlimdimid != -1) ERR;
1221 if (nc_inq_varids(ncid, &nvars, varids_in)) ERR;
1222 if (nvars != 1 || varids_in[0] != 0) ERR;
1223 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims, NULL, &natts)) ERR;
1224 if (strcmp(name_in, VAR_NAME7) || xtype_in != NC_UINT64 || ndims != 0 || natts != 0) ERR;
1225 if (nc_get_var_ulonglong(ncid, varid, &data_in)) ERR;
1226 if (data_in != data) ERR;
1227 if (nc_close(ncid)) ERR;
1228 }
1229
1230 SUMMARIZE_ERR;
1231 printf("**** testing error codes for name clashes...");
1232 {
1233 #define GENERIC_NAME "bob"
1234 int ncid, varid, numgrps, ntypes;
1235
1236 /* Create a netcdf-4 file with one var. */
1237 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
1238 if (nc_def_var(ncid, GENERIC_NAME, NC_BYTE, 0, NULL, &varid)) ERR;
1239
1240 /* These don'e work, because the name is already in use. Make
1241 * sure the correct error is returned. */
1242 if (nc_def_grp(ncid, GENERIC_NAME, NULL) != NC_ENAMEINUSE) ERR;
1243 if (nc_def_opaque(ncid, 1, GENERIC_NAME, NULL) != NC_ENAMEINUSE) ERR;
1244
1245 /* Close it. */
1246 if (nc_close(ncid)) ERR;
1247
1248 /* Open the file and check. */
1249 if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
1250 if (nc_inq_varids(ncid, &nvars_in, varids_in)) ERR;
1251 if (nvars_in != 1 || varids_in[0] != 0) ERR;
1252 if (nc_inq_varname(ncid, 0, name_in)) ERR;
1253 if (strcmp(name_in, GENERIC_NAME)) ERR;
1254 if (nc_inq_grps(ncid, &numgrps, NULL)) ERR;
1255 if (numgrps) ERR;
1256 if (nc_inq_typeids(ncid, &ntypes, NULL)) ERR;
1257 if (ntypes) ERR;
1258 if (nc_close(ncid)) ERR;
1259 }
1260
1261 SUMMARIZE_ERR;
1262 printf("**** testing error codes for name clashes some more...");
1263
1264 {
1265 #define GENERIC_NAME "bob"
1266 int ncid, varid, numgrps, ntypes;
1267
1268 /* Create a netcdf-4 file with one type. */
1269 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
1270 if (nc_def_opaque(ncid, 1, GENERIC_NAME, NULL)) ERR;
1271
1272 /* These don'e work, because the name is already in use. Make
1273 * sure the correct error is returned. */
1274 if (nc_def_grp(ncid, GENERIC_NAME, NULL) != NC_ENAMEINUSE) ERR;
1275 if (nc_def_var(ncid, GENERIC_NAME, NC_BYTE, 0, NULL, &varid) != NC_ENAMEINUSE) ERR;
1276
1277 /* Close it. */
1278 if (nc_close(ncid)) ERR;
1279
1280 /* Open the file and check. */
1281 if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
1282 if (nc_inq_varids(ncid, &nvars_in, varids_in)) ERR;
1283 if (nvars_in) ERR;
1284 if (nc_inq_grps(ncid, &numgrps, NULL)) ERR;
1285 if (numgrps) ERR;
1286 if (nc_inq_typeids(ncid, &ntypes, NULL)) ERR;
1287 if (ntypes != 1) ERR;
1288 if (nc_close(ncid)) ERR;
1289 }
1290 SUMMARIZE_ERR;
1291 printf("**** testing error codes for name clashes even more...");
1292
1293 {
1294 #define GENERIC_NAME "bob"
1295 int ncid, varid, numgrps, ntypes;
1296
1297 /* Create a netcdf-4 file with one group. */
1298 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
1299 if (nc_def_grp(ncid, GENERIC_NAME, NULL)) ERR;
1300
1301 /* These don'e work, because the name is already in use. Make
1302 * sure the correct error is returned. */
1303 if (nc_def_opaque(ncid, 1, GENERIC_NAME, NULL) != NC_ENAMEINUSE) ERR;
1304 if (nc_def_var(ncid, GENERIC_NAME, NC_BYTE, 0, NULL, &varid) != NC_ENAMEINUSE) ERR;
1305
1306 /* Close it. */
1307 if (nc_close(ncid)) ERR;
1308
1309 /* Open the file and check. */
1310 if (nc_open(FILE_NAME, NC_WRITE, &ncid)) ERR;
1311 if (nc_inq_varids(ncid, &nvars_in, varids_in)) ERR;
1312 if (nvars_in) ERR;
1313 if (nc_inq_grps(ncid, &numgrps, NULL)) ERR;
1314 if (numgrps != 1) ERR;
1315 if (nc_inq_typeids(ncid, &ntypes, NULL)) ERR;
1316 if (ntypes) ERR;
1317 if (nc_close(ncid)) ERR;
1318 }
1319 SUMMARIZE_ERR;
1320 printf("**** testing error code for too-large chunks...");
1321 {
1322 #define NDIMS17 2
1323 #define DIM17_NAME "personality"
1324 #define DIM17_NAME_2 "good_looks"
1325 #define VAR_NAME17 "ed"
1326 #define DIM17_LEN 2147483644 /* max dimension size - 2GB - 4. */
1327 #define DIM17_2_LEN 1000
1328
1329 int dimids[NDIMS17], dimids_in[NDIMS17];
1330 int varid;
1331 int ndims, nvars, natts, unlimdimid;
1332 nc_type xtype_in;
1333 char name_in[NC_MAX_NAME + 1];
1334 size_t chunksize[NDIMS17] = {5, 5};
1335 size_t bad_chunksize[NDIMS17] = {5, DIM17_LEN};
1336 size_t chunksize_in[NDIMS17];
1337 int storage_in;
1338 int d;
1339
1340 /* Create a netcdf-4 file with two dims and one var. */
1341 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
1342 if (nc_def_dim(ncid, DIM17_NAME, DIM17_LEN, &dimids[0])) ERR;
1343 if (nc_def_dim(ncid, DIM17_NAME_2, DIM17_2_LEN, &dimids[1])) ERR;
1344 if (dimids[0] != 0 || dimids[1] != 1) ERR;
1345 if (nc_def_var(ncid, VAR_NAME17, NC_UINT64, NDIMS17, dimids, &varid)) ERR;
1346 if (nc_def_var_chunking(ncid, varid, NC_CHUNKED, bad_chunksize) != NC_EBADCHUNK) ERR;
1347 if (nc_def_var_chunking(ncid, varid, NC_CHUNKED, chunksize)) ERR;
1348
1349 /* Check stuff. */
1350 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
1351 if (ndims != NDIMS17 || nvars != 1 || natts != 0 ||
1352 unlimdimid != -1) ERR;
1353 if (nc_inq_varids(ncid, &nvars, varids_in)) ERR;
1354 if (nvars != 1) ERR;
1355 if (varids_in[0] != 0) ERR;
1356 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims, dimids_in, &natts)) ERR;
1357 if (strcmp(name_in, VAR_NAME17) || xtype_in != NC_UINT64 || ndims != 2 || natts != 0 ||
1358 dimids_in[0] != 0 || dimids_in[1] != 1) ERR;
1359 if (nc_inq_var_chunking(ncid, 0, &storage_in, chunksize_in)) ERR;
1360 for (d = 0; d < NDIMS17; d++)
1361 if (chunksize[d] != chunksize_in[d]) ERR;
1362 if (storage_in != NC_CHUNKED) ERR;
1363 if (nc_close(ncid)) ERR;
1364
1365 /* Open the file and check the same stuff. */
1366 if (nc_open(FILE_NAME, NC_NOWRITE, &ncid)) ERR;
1367
1368 /* Check stuff. */
1369 if (nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid)) ERR;
1370 if (ndims != NDIMS17 || nvars != 1 || natts != 0 ||
1371 unlimdimid != -1) ERR;
1372 if (nc_inq_varids(ncid, &nvars, varids_in)) ERR;
1373 if (nvars != 1) ERR;
1374 if (varids_in[0] != 0) ERR;
1375 if (nc_inq_var(ncid, 0, name_in, &xtype_in, &ndims, dimids_in, &natts)) ERR;
1376 if (strcmp(name_in, VAR_NAME17) || xtype_in != NC_UINT64 || ndims != 2 || natts != 0 ||
1377 dimids_in[0] != 0 || dimids_in[1] != 1) ERR;
1378 if (nc_inq_var_chunking(ncid, 0, &storage_in, chunksize_in)) ERR;
1379 for (d = 0; d < NDIMS17; d++)
1380 if (chunksize[d] != chunksize_in[d]) ERR;
1381 if (storage_in != NC_CHUNKED) ERR;
1382 if (nc_close(ncid)) ERR;
1383 }
1384 SUMMARIZE_ERR;
1385 #define DIM8_NAME "num_monkeys"
1386 #define DIM9_NAME "num_coconuts"
1387 #define DIM9_LEN 10
1388 #define VAR_NAME8 "John_Clayton"
1389 #define VAR_NAME9 "Lord_Greystoke"
1390 #define VAR_NAME10 "Jane_Porter"
1391 printf("**** testing that contiguous storage can't be turned on for vars with unlimited dims or filters...");
1392 {
1393 int ncid;
1394 int dimids[NDIMS1];
1395 int varid, varid2;
1396 size_t chunksize_in[NDIMS1];
1397 int storage_in;
1398
1399 /* Create a netcdf-4 file with one dim and some vars. */
1400 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
1401 if (nc_def_dim(ncid, DIM8_NAME, NC_UNLIMITED, &dimids[0])) ERR;
1402 if (nc_def_var(ncid, VAR_NAME8, NC_INT, NDIMS1, dimids, &varid)) ERR;
1403 if (nc_def_dim(ncid, DIM9_NAME, DIM9_LEN, &dimids[0])) ERR;
1404 if (nc_def_var(ncid, VAR_NAME9, NC_INT, NDIMS1, dimids, &varid2)) ERR;
1405
1406 /* These will fail due to bad parameters. */
1407 if (nc_def_var_deflate(ncid, varid2, 0, 1,
1408 NC_MIN_DEFLATE_LEVEL - 1) != NC_EINVAL) ERR;
1409 if (nc_def_var_deflate(ncid, varid2, 0, 1,
1410 NC_MAX_DEFLATE_LEVEL + 1) != NC_EINVAL) ERR;
1411
1412 /* This will work. */
1413 if (nc_def_var_deflate(ncid, varid2, 0, 1, 4)) ERR;
1414
1415 /* This won't work because of the umlimited dimension. */
1416 if (nc_def_var_chunking(ncid, varid, NC_CONTIGUOUS, NULL) != NC_EINVAL) ERR;
1417
1418 /* This won't work because of the deflate filter. */
1419 if (nc_def_var_chunking(ncid, varid2, NC_CONTIGUOUS, NULL) != NC_EINVAL) ERR;
1420
1421 /* Storage must be chunked because of unlimited dimension and
1422 * the deflate filter. */
1423 if (nc_inq_var_chunking(ncid, varid, &storage_in, chunksize_in)) ERR;
1424 if (storage_in != NC_CHUNKED) ERR;
1425 if (nc_inq_var_chunking(ncid, varid2, &storage_in, chunksize_in)) ERR;
1426 if (storage_in != NC_CHUNKED) ERR;
1427 if (nc_close(ncid)) ERR;
1428
1429 }
1430 SUMMARIZE_ERR;
1431 printf("**** testing error conditions on nc_def_var functions...");
1432 {
1433 int ncid;
1434 int dimids[NDIMS1];
1435 int bad_dimids[NDIMS1] = {42};
1436 int varid;
1437 int varid_scalar;
1438 int num_models = 2;
1439 int m;
1440 int mode = NC_NETCDF4;
1441
1442 /* Test without and with classic model. */
1443 for (m = 0; m < num_models; m++)
1444 {
1445 int contiguous_in;
1446 size_t chunksizes_in[NDIMS1];
1447 int shuffle_in, deflate_in, deflate_level_in;
1448
1449 if (m)
1450 mode |= NC_CLASSIC_MODEL;
1451
1452 /* Create a netcdf-4 file. */
1453 if (nc_create(FILE_NAME, mode, &ncid)) ERR;
1454 if (nc_def_dim(ncid, DIM8_NAME, TEST_VAL_42, &dimids[0])) ERR;
1455
1456 /* This won't work. */
1457 if (nc_def_var(ncid, VAR_NAME8, NC_INT, NDIMS1, bad_dimids,
1458 &varid) != NC_EBADDIM) ERR;
1459
1460 /* This will work. */
1461 if (nc_def_var(ncid, VAR_NAME8, NC_INT, NDIMS1, dimids, &varid)) ERR;
1462 if (nc_def_var(ncid, VAR_NAME10, NC_INT, 0, NULL, &varid_scalar)) ERR;
1463
1464 /* Set the var to contiguous. */
1465 if (nc_def_var_chunking(ncid, varid, NC_CONTIGUOUS, NULL)) ERR;
1466
1467 /* Now defalte will change the var to chunked. */
1468 if (nc_def_var_deflate(ncid, varid, 0, 1, 4)) ERR;
1469 if (nc_inq_var_chunking(ncid, varid, &contiguous_in, chunksizes_in)) ERR;
1470 if (contiguous_in) ERR;
1471
1472 /* Now I can't turn contiguous on, because deflate is on. */
1473 if (nc_def_var_chunking(ncid, varid, NC_CONTIGUOUS, NULL) != NC_EINVAL) ERR;
1474
1475 /* Turn off deflation. */
1476 if (nc_def_var_deflate(ncid, varid, 0, 0, 0)) ERR;
1477 if (nc_inq_var_deflate(ncid, varid, &shuffle_in, &deflate_in, &deflate_level_in)) ERR;
1478 if (shuffle_in || deflate_in) ERR;
1479 if (nc_inq_var_deflate(ncid, varid, NULL, NULL, NULL)) ERR;
1480
1481 /* Deflate fails for scalar. */
1482 if (nc_def_var_deflate(ncid, varid_scalar, 0, 1, 4) != NC_EINVAL) ERR;
1483 if (nc_inq_var_deflate(ncid, varid, &shuffle_in, &deflate_in, &deflate_level_in)) ERR;
1484 if (shuffle_in || deflate_in) ERR;
1485
1486 /* Turn on shuffle. */
1487 if (nc_def_var_deflate(ncid, varid, 1, 0, 0)) ERR;
1488
1489 /* Now I can't turn contiguous on, because shuffle is on. */
1490 if (nc_def_var_chunking(ncid, varid, NC_CONTIGUOUS, NULL) != NC_EINVAL) ERR;
1491
1492 /* Turn off shuffle. */
1493 if (nc_def_var_deflate(ncid, varid, 0, 0, 0)) ERR;
1494
1495 /* Turn on fletcher32. */
1496 if (nc_def_var_fletcher32(ncid, varid, 1)) ERR;
1497
1498 /* Now I can't turn contiguous on, because fletcher32 is on. */
1499 if (nc_def_var_chunking(ncid, varid, NC_CONTIGUOUS, NULL) != NC_EINVAL) ERR;
1500
1501 /* Turn off fletcher32. */
1502 if (nc_def_var_fletcher32(ncid, varid, 0)) ERR;
1503
1504 /* Now I can make it contiguous again. */
1505 if (nc_def_var_chunking(ncid, varid, NC_CONTIGUOUS, NULL)) ERR;
1506 if (nc_close(ncid)) ERR;
1507 }
1508 }
1509 SUMMARIZE_ERR;
1510 #define DIM8_NAME "num_monkeys"
1511 #define DIM9_NAME "num_coconuts"
1512 #define DIM9_LEN 10
1513 #define VAR_NAME8 "John_Clayton"
1514 #define VAR_NAME9 "Lord_Greystoke"
1515 printf("**** testing that contiguous storage can't be turned on for vars with unlimited dims or filters...");
1516 {
1517 int ncid;
1518 int dimids[NDIMS1];
1519 int varid, varid2;
1520 size_t chunksize_in[NDIMS1];
1521 int storage_in;
1522
1523 /* Create a netcdf-4 file with one dim and some vars. */
1524 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
1525 if (nc_def_dim(ncid, DIM8_NAME, NC_UNLIMITED, &dimids[0])) ERR;
1526 if (nc_def_var(ncid, VAR_NAME8, NC_INT, NDIMS1, dimids, &varid)) ERR;
1527 if (nc_def_dim(ncid, DIM9_NAME, DIM9_LEN, &dimids[0])) ERR;
1528 if (nc_def_var(ncid, VAR_NAME9, NC_INT, NDIMS1, dimids, &varid2)) ERR;
1529 if (nc_def_var_deflate(ncid, varid2, 0, 1, 4)) ERR;
1530
1531 /* This won't work because of the umlimited dimension. */
1532 if (nc_def_var_chunking(ncid, varid, NC_CONTIGUOUS, NULL) != NC_EINVAL) ERR;
1533
1534 /* This won't work because of the deflate filter. */
1535 if (nc_def_var_chunking(ncid, varid2, NC_CONTIGUOUS, NULL) != NC_EINVAL) ERR;
1536
1537 /* Storage must be chunked because of unlimited dimension and
1538 * the deflate filter. */
1539 if (nc_inq_var_chunking(ncid, varid, &storage_in, chunksize_in)) ERR;
1540 if (storage_in != NC_CHUNKED) ERR;
1541 if (nc_inq_var_chunking(ncid, varid2, &storage_in, chunksize_in)) ERR;
1542 if (storage_in != NC_CHUNKED) ERR;
1543 if (nc_close(ncid)) ERR;
1544
1545 }
1546 SUMMARIZE_ERR;
1547 #define DIM10_NAME "num_monkeys"
1548 #define DIM11_NAME "num_hats"
1549 #define VAR_NAME11 "Silly_Sally"
1550 #define NDIM2 2
1551 printf("**** testing very large chunksizes...");
1552 {
1553 int ncid;
1554 int dimid[NDIM2];
1555 int varid;
1556 size_t chunksize[NDIM2] = {1, (size_t)NC_MAX_INT + (size_t)1};
1557 size_t chunksize_in[NDIM2];
1558 int chunksize_int_in[NDIM2];
1559 int storage_in;
1560
1561 /* Create a netcdf-4 file. */
1562 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
1563 if (nc_def_dim(ncid, DIM10_NAME, NC_UNLIMITED, &dimid[0])) ERR;
1564 if (nc_def_dim(ncid, DIM11_NAME, NC_UNLIMITED, &dimid[1])) ERR;
1565 if (nc_def_var(ncid, VAR_NAME11, NC_BYTE, NDIM2, dimid, &varid)) ERR;
1566 if (nc_inq_var_chunking(ncid, varid, &storage_in, chunksize_in)) ERR;
1567 if (storage_in != NC_CHUNKED) ERR;
1568
1569 /* Set a large chunksize. */
1570 if (nc_def_var_chunking(ncid, varid, NC_CHUNKED, chunksize)) ERR;
1571 if (nc_inq_var_chunking(ncid, varid, &storage_in, chunksize_in)) ERR;
1572 if (storage_in != NC_CHUNKED) ERR;
1573 if (chunksize_in[0] != chunksize[0] || chunksize_in[1] != chunksize[1]) ERR;
1574 if (nc_inq_var_chunking_ints(ncid, varid, &storage_in, chunksize_int_in) != NC_ERANGE) ERR;
1575
1576 /* Close the file. */
1577 if (nc_close(ncid)) ERR;
1578
1579 }
1580 SUMMARIZE_ERR;
1581 #define DIM10_NAME "num_monkeys"
1582 #define DIM11_NAME "num_hats"
1583 #define VAR_NAME11 "Silly_Sally"
1584 #define NDIM2 2
1585 printf("**** testing deflate_level value when deflate is not in use...");
1586 {
1587 int ncid;
1588 int dimid[NDIM2];
1589 int varid;
1590 int deflate_in, deflate_level_in = 99;
1591
1592 /* Create a netcdf-4 file. */
1593 if (nc_create(FILE_NAME, NC_NETCDF4, &ncid)) ERR;
1594 if (nc_def_dim(ncid, DIM10_NAME, NC_UNLIMITED, &dimid[0])) ERR;
1595 if (nc_def_dim(ncid, DIM11_NAME, NC_UNLIMITED, &dimid[1])) ERR;
1596 if (nc_def_var(ncid, VAR_NAME11, NC_BYTE, NDIM2, dimid, &varid)) ERR;
1597
1598 /* Check the deflate_level. */
1599 if (nc_inq_var_deflate(ncid, varid, NULL, &deflate_in, &deflate_level_in)) ERR;
1600 if (deflate_in || deflate_level_in) ERR;
1601
1602 /* Close the file. */
1603 if (nc_close(ncid)) ERR;
1604
1605 }
1606 SUMMARIZE_ERR;
1607 FINAL_RESULTS;
1608 }
1609