1/** \file \internal
2Basic diskless API tests.
3
4Copyright 2011, UCAR/Unidata. See COPYRIGHT file for copying and
5redistribution conditions.
6*/
7
8#undef DDBG
9
10#include <config.h>
11#include <nc_tests.h>
12#include "err_macros.h"
13#include <stdio.h>
14#include <stdlib.h>
15#include <netcdf.h>
16
17#define FLAGS4 (NC_DISKLESS|NC_NETCDF4|NC_CLASSIC_MODEL)
18#define FLAGS3 (NC_DISKLESS)
19
20#define PERSIST (NC_WRITE)
21
22#define RESISTOR "resistor_value"
23#define CAPACITOR "capacitor_value"
24#define NUM555 "number_of_555_timer_chips"
25
26#ifdef DDBG
27#undef ERR
28void fail(int line) {
29    fflush(stdout);
30    fprintf(stderr,"\nline=%d\n",line);
31    fflush(stderr);
32    exit(1);
33}
34#define ERR fail(__LINE__)
35#endif
36
37/* Control flags  */
38static int flagspersistusenetcdf4mmap;
39
40static void
41removefile(int persist,  char* filename)
42{
43    if(persist) {
44 if(remove(filename) != 0) {
45     if(errno != ENOENT) {
46 fprintf(stderr,"Could not remove file: %s: %d\n",filename,errno);
47 perror("");
48 exit(1);
49     }
50 }
51    }
52}
53
54int
55main(int argc, char **argv)
56{
57    int i;
58    char* filename = "tst_diskless.nc";
59
60    /* Set defaults */
61    persist = 0;
62    usenetcdf4 = 0;
63    mmap = 0;
64
65    for(i=1;i<argc;i++) {
66 if(strcmp(argv[i],"netcdf4")==0) usenetcdf4=1;
67 else if(strcmp(argv[i],"persist")==0) persist=1;
68 else if(strcmp(argv[i],"mmap")==0) mmap=1;
69 /* ignore anything not recognized */
70    }
71
72#ifndef USE_NETCDF4
73    usenetcdf4 = 0;
74#endif
75
76    if(mmap)
77 usenetcdf4 = 0;
78
79    flags = usenetcdf4?FLAGS4:FLAGS3;
80    if(persistflags |= PERSIST;
81    if(mmapflags |= NC_MMAP;
82
83printf("\n*** Testing the diskless API.\n");
84printf("*** testing diskless file with scalar vars...");
85{
86    int ncidvarid0varid1varid2;
87    int ndims_innvars_innatts_inunlimdimid_in;
88    char name_in[NC_MAX_NAME + 1];
89    nc_type type_in;
90    float float_data = 3.14, float_data_in;
91    int int_data = 42, int_data_in;
92    short short_data = 2, short_data_in;
93
94    removefile(persist,filename);
95
96    /* Create a netCDF file (which exists only in memory). */
97    if (nc_create(filenameflags, &ncid)) ERR;
98
99    /* Create some variables. */
100    if (nc_def_var(ncidRESISTORNC_INT, 0, NULL, &varid0)) ERR;
101    if (nc_def_var(ncidCAPACITORNC_FLOAT, 0, NULL, &varid1)) ERR;
102    if (nc_def_var(ncidNUM555NC_SHORT, 0, NULL, &varid2)) ERR;
103    if (nc_enddef(ncid)) ERR;
104
105    /* Write some data to this file. */
106    if (nc_put_vara_int(ncidvarid0NULLNULL, &int_data)) ERR;
107    if (nc_put_vara_float(ncidvarid1NULLNULL, &float_data)) ERR;
108    if (nc_put_vara_short(ncidvarid2NULLNULL, &short_data)) ERR;
109
110    /* Now check the phony file. */
111    if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
112    if (ndims_in != 0 || nvars_in != 3 || natts_in != 0 || unlimdimid_in != -1) ERR;
113
114    /* Check variables. */
115    if (nc_inq_var(ncidvarid0name_in, &type_in, &ndims_inNULL, &natts_in)) ERR;
116    if (strcmp(name_inRESISTOR) || type_in != NC_INT || ndims_in != 0 ||
117    natts_in != 0) ERR;
118    if (nc_inq_var(ncidvarid1name_in, &type_in, &ndims_inNULL, &natts_in)) ERR;
119    if (strcmp(name_inCAPACITOR) || type_in != NC_FLOAT || ndims_in != 0 ||
120    natts_in != 0) ERR;
121    if (nc_inq_var(ncidvarid2name_in, &type_in, &ndims_inNULL, &natts_in)) ERR;
122    if (strcmp(name_inNUM555) || type_in != NC_SHORT || natts_in != 0) ERR;
123
124    /* Read my absolutely crucial data. */
125    if (nc_get_vara_int(ncidvarid0NULLNULL, &int_data_in)) ERR;
126    if (int_data_in != int_dataERR;
127    if (nc_get_vara_float(ncidvarid1NULLNULL, &float_data_in)) ERR;
128    if (float_data_in != float_dataERR;
129    if (nc_get_vara_short(ncidvarid2NULLNULL, &short_data_in)) ERR;
130    if (short_data_in != short_dataERR;
131
132    /* Close the file. */
133    if (nc_close(ncid))
134      abort(); /* ERR; */
135    }
136    SUMMARIZE_ERR;
137
138    if(!usenetcdf4 && persist) {
139        int ncidvarid0varid1varid2;
140        float float_data = 3.14, float_data_in;
141        int int_data = 42, int_data_in;
142        short short_data = 2, short_data_in;
143
144        printf("*** testing diskless open of previously created file...");
145
146        if (nc_open(filenameflags, &ncid)) ERR;
147
148 /* Read and compare */
149        if (nc_inq_varid(ncidRESISTOR, &varid0)) ERR;
150        if (nc_inq_varid(ncidCAPACITOR, &varid1)) ERR;
151        if (nc_inq_varid(ncidNUM555, &varid2)) ERR;
152
153        if (nc_get_vara_int(ncidvarid0NULLNULL, &int_data_in)) ERR;
154        if (int_data_in != int_dataERR;
155        if (nc_get_vara_float(ncidvarid1NULLNULL, &float_data_in)) ERR;
156        if (float_data_in != float_dataERR;
157        if (nc_get_vara_short(ncidvarid2NULLNULL, &short_data_in)) ERR;
158        if (short_data_in != short_dataERR;
159
160 nc_close(ncid);
161    }
162    SUMMARIZE_ERR;
163
164    printf("*** testing creation of simple diskless file...");
165    {
166    #define NDIMS 2
167    #define DIM0_NAME "Fun"
168    #define DIM1_NAME "Money"
169    #define DIM1_LEN 200
170    #define ATT0_NAME "home"
171    #define ATT0_TEXT "earthship"
172    #define VAR0_NAME "nightlife"
173    #define VAR1_NAME "time"
174    #define VAR2_NAME "taxi_distance"
175
176    int nciddimid[NDIMS], dimid_in[NDIMS], varid0varid1varid2;
177    int ndims_innvars_innatts_inunlimdimid_in;
178    char name_in[NC_MAX_NAME + 1], att0_in[NC_MAX_NAME + 1];
179    nc_type type_in;
180    size_t len_in;
181    short short_data[DIM1_LEN];
182    size_t start[1] = {0};
183    size_t count[1] = {DIM1_LEN};
184    int i;
185    float float_data = 42.22, float_data_in;
186
187    /* This is some really important data that I want to save. */
188    for (i = 0; i < DIM1_LENi++)
189    short_data[i] = i;
190
191    removefile(persist,filename);
192
193    /* Create a netCDF file (which exists only in memory). I am
194    * confident that the world-famous netCDF format is the way to
195    * store my data! */
196    if (nc_create(filenameflags, &ncid)) ERR;
197
198    /* Create some atts. They will help document my data forever. */
199    if (nc_put_att_text(ncidNC_GLOBALATT0_NAME,
200    sizeof(ATT0_TEXT) + 1, ATT0_TEXT)) ERR;
201
202    /* Create dimensions: money is limited, but fun is not! */
203    if (nc_def_dim(ncidDIM0_NAMENC_UNLIMITED, &dimid[0])) ERR;
204    if (nc_def_dim(ncidDIM1_NAMEDIM1_LEN, &dimid[1])) ERR;
205
206    /* Create some variables. The data they hold must persist
207    * through the ages. */
208    if (nc_def_var(ncidVAR0_NAMENC_INTNDIMSdimid, &varid0)) ERR;
209    if (nc_def_var(ncidVAR1_NAMENC_FLOAT, 0, NULL, &varid1)) ERR;
210    if (nc_def_var(ncidVAR2_NAMENC_SHORT, 1, &dimid[1], &varid2)) ERR;
211    if (nc_enddef(ncid)) ERR;
212
213    /* Write some data to this file. I'm glad I'm saving this
214    * important data in such a safe format! */
215    if (nc_put_vara_float(ncidvarid1NULLNULL, &float_data)) ERR;
216    if (nc_put_vara_short(ncidvarid2startcountshort_data)) ERR;
217
218    /* Now check the phony file. Is my data safe? */
219    if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
220    if (ndims_in != 2 || nvars_in != 3 || natts_in != 1 || unlimdimid_in != 0) ERR;
221
222    /* Check attributes - they will be needed by future generations
223    * of scientists to understand my data. */
224    if (nc_get_att_text(ncidNC_GLOBALATT0_NAMEatt0_in)) ERR;
225    if (strcmp(att0_inATT0_TEXT)) ERR;
226
227    /* Check dimensions. */
228    if (nc_inq_dim(nciddimid[0], name_in, &len_in)) ERR;
229    if (strcmp(name_inDIM0_NAME) || len_in != 0) ERR;
230    if (nc_inq_dim(nciddimid[1], name_in, &len_in)) ERR;
231    if (strcmp(name_inDIM1_NAME) || len_in != DIM1_LENERR;
232
233    /* Check variables. */
234    if (nc_inq_var(ncidvarid0name_in, &type_in, &ndims_indimid_in, &natts_in)) ERR;
235    if (strcmp(name_inVAR0_NAME) || type_in != NC_INT || ndims_in != NDIMS ||
236    dimid_in[0] != 0 || dimid_in[1] != 1 || natts_in != 0) ERR;
237    if (nc_inq_var(ncidvarid1name_in, &type_in, &ndims_indimid_in, &natts_in)) ERR;
238    if (strcmp(name_inVAR1_NAME) || type_in != NC_FLOAT || ndims_in != 0 ||
239    natts_in != 0) ERR;
240    if (nc_inq_var(ncidvarid2name_in, &type_in, &ndims_indimid_in, &natts_in)) ERR;
241    if (strcmp(name_inVAR2_NAME) || type_in != NC_SHORT || ndims_in != 1 ||
242    dimid_in[0] != 1 || natts_in != 0) ERR;
243
244    /* Read my absolutely crucial data. */
245    if (nc_get_vara_float(ncidvarid1NULLNULL, &float_data_in)) ERR;
246    if (float_data_in != float_dataERR;
247
248    /* Close the file, losing all information. Hey! What kind of
249    * storage format is this, anyway? */
250    if (nc_close(ncid))
251      abort(); /* ERR; */
252    }
253    SUMMARIZE_ERR;
254    printf("*** testing diskless file with scalar vars and type conversion...");
255    {
256    #define DUNE "dune"
257    #define STAR_TREK "capacitor_value"
258    #define STAR_WARS "number_of_555_timer_chips"
259
260    int ncidvarid0varid1varid2;
261    int ndims_innvars_innatts_inunlimdimid_in;
262    char name_in[NC_MAX_NAME + 1];
263    nc_type type_in;
264    float float_data = 3.14, float_data_in;
265    int int_data = 42, int_data_in;
266    short short_data = 2, short_data_in;
267
268    removefile(persist,filename);
269
270    /* Create a netCDF file (which exists only in memory). */
271    if (nc_create(filenameflags, &ncid)) ERR;
272
273    /* Create some variables. */
274    if (nc_def_var(ncidDUNENC_INT, 0, NULL, &varid0)) ERR;
275    if (nc_def_var(ncidSTAR_TREKNC_FLOAT, 0, NULL, &varid1)) ERR;
276    if (nc_def_var(ncidSTAR_WARSNC_SHORT, 0, NULL, &varid2)) ERR;
277    if (nc_enddef(ncid)) ERR;
278
279    /* Write some data to this file. */
280    if (nc_put_vara_int(ncidvarid0NULLNULL, &int_data)) ERR;
281    if (nc_put_vara_float(ncidvarid1NULLNULL, &float_data)) ERR;
282    if (nc_put_vara_short(ncidvarid2NULLNULL, &short_data)) ERR;
283
284    /* Now check the phony file. */
285    if (nc_inq(ncid, &ndims_in, &nvars_in, &natts_in, &unlimdimid_in)) ERR;
286    if (ndims_in != 0 || nvars_in != 3 || natts_in != 0 || unlimdimid_in != -1) ERR;
287
288    /* Check variables. */
289    if (nc_inq_var(ncidvarid0name_in, &type_in, &ndims_inNULL, &natts_in)) ERR;
290    if (strcmp(name_inDUNE) || type_in != NC_INT || ndims_in != 0 ||
291    natts_in != 0) ERR;
292    if (nc_inq_var(ncidvarid1name_in, &type_in, &ndims_inNULL, &natts_in)) ERR;
293    if (strcmp(name_inSTAR_TREK) || type_in != NC_FLOAT || ndims_in != 0 ||
294
295    natts_in != 0) ERR;
296    if (nc_inq_var(ncidvarid2name_in, &type_in, &ndims_inNULL, &natts_in)) ERR;
297    if (strcmp(name_inSTAR_WARS) || type_in != NC_SHORT || natts_in != 0) ERR;
298
299    /* Read my absolutely crucial data. */
300    if (nc_get_vara_int(ncidvarid0NULLNULL, &int_data_in)) ERR;
301    if (int_data_in != int_dataERR;
302    if (nc_get_vara_float(ncidvarid1NULLNULL, &float_data_in)) ERR;
303    if (float_data_in != float_dataERR;
304    if (nc_get_vara_short(ncidvarid2NULLNULL, &short_data_in)) ERR;
305    if (short_data_in != short_dataERR;
306
307    /* Close the file. */
308    if (nc_close(ncid))
309      abort(); /* ERR; */
310    }
311    SUMMARIZE_ERR;
312    FINAL_RESULTS;
313
314    /* Unnecessary exit(0), FINAL_RESULTS returns. */
315    /* exit(0); */
316}


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