1/* This is part of the netCDF package. Copyright 2005 University
2   Corporation for Atmospheric Research/Unidata See COPYRIGHT file for
3   conditions of use. See www.unidata.ucar.edu for more info.
4
5   Test small files.
6
7   $Id: tst_small.c,v 1.15 2008/10/20 01:48:08 ed Exp $
8*/
9
10#include <nc_tests.h>
11#include "err_macros.h"
12#include <netcdf.h>
13
14/* Derived from tst_small.c */
15
16/* Test everything for classic using in-memory files */
17
18#define NCFILENAME "tst_diskless3.nc"
19
20#define ATT_NAME "Atom"
21#define MAX_LEN 7
22
23#define VAR_NAME2 "var2"
24#define NUM_VARS 2
25
26#define ONE_DIM 1
27#define MAX_RECS 10
28
29#define DIM1_NAME "Time"
30#define DIM2_NAME "DataStrLen"
31#define VAR_NAME "Times"
32#define STR_LEN 19
33#define NUM_VALS 2
34#define NDIMS 2
35#define TITLE " OUTPUT FROM WRF V2.0.3.1 MODEL"
36#define ATT_NAME2 "TITLE"
37
38static int status = NC_NOERR;
39
40/* Control flags  */
41static int persistusenetcdf4mmapdiskless;
42
43static int diskmode;
44
45/* Test a diskless file with two record vars, which grow, and has
46 * attributes added. */
47static int
48test_two_growing_with_att(const char *testfile)
49{
50   int nciddimidvarid[NUM_VARS];
51   char data[MAX_RECS], data_in;
52   char att_name[NC_MAX_NAME + 1];
53   size_t start[ONE_DIM], count[ONE_DIM], index[ONE_DIM], len_in;
54   int vr;
55
56   /* Create a file with one ulimited dimensions, and one var. */
57   if((status=nc_create(testfileNC_CLOBBER, &ncid))) ERRSTAT(status);
58   if((status=nc_def_dim(ncidDIM1_NAMENC_UNLIMITED, &dimid))) ERRSTAT(status);
59   if((status=nc_def_var(ncidVAR_NAMENC_CHAR, 1, &dimid, &varid[0]))) ERRSTAT(status);
60   if((status=nc_def_var(ncidVAR_NAME2NC_CHAR, 1, &dimid, &varid[1]))) ERRSTAT(status);
61   if((status=nc_close(ncid))) ERRSTAT(status);
62
63   /* Create some phoney data. */
64   for (data[0] = 'a', r = 1; r < MAX_RECSr++)
65      data[r] = data[r - 1] + 1;
66
67   /* Normally one would not close and reopen the file for each
68    * record, nor add an attribute each time I add a record, but I am
69    * giving the library a little work-out here... */
70   for (r = 0; r < MAX_RECSr++)
71   {
72      /* Write one record of var data, a single character. */
73      if((status=nc_open(testfileNC_WRITE, &ncid))) ERRSTAT(status);
74      count[0] = 1;
75      start[0] = r;
76      sprintf(att_name, "a_%d", data[r]);
77      for (v = 0; v < NUM_VARSv++)
78      {
79  if((status=nc_put_vara_text(ncidvarid[v], startcount, &data[r]))) ERRSTAT(status);
80  if((status=nc_redef(ncid))) ERRSTAT(status);
81  if((status=nc_put_att_text(ncidvarid[v], att_name, 1, &data[r]))) ERRSTAT(status);
82  if((status=nc_enddef(ncid))) ERRSTAT(status);
83      }
84      if((status=nc_close(ncid))) ERRSTAT(status);
85
86      /* Reopen the file and check it. */
87      if((status=nc_open(testfilediskmode|NC_WRITE, &ncid))) ERRSTAT(status);
88      if((status=nc_inq_dimlen(ncid, 0, &len_in))) ERRSTAT(status);
89      if (len_in != r + 1) ERR;
90      index[0] = r;
91      for (v = 0; v < NUM_VARSv++)
92      {
93  if((status=nc_get_var1_text(ncidvarid[v], index, &data_in))) ERRSTAT(status);
94  if (data_in != data[r]) ERR;
95      }
96      if((status=nc_close(ncid))) ERRSTAT(status);
97   } /* Next record. */
98   return 0;
99}
100
101#if 0
102/* Test a diskless file with one var and one att. */
103static int
104test_one_with_att(const char *testfile)
105{
106   int nciddimidvarid;
107   char data = 'h', data_in;
108   int ndimsnvarsnattsunlimdimid;
109   size_t start[NDIMS], count[NDIMS];
110
111   /* Create a file with one ulimited dimensions, and one var. */
112   if((status=nc_create(testfileNC_CLOBBER, &ncid))) ERRSTAT(status);
113   if((status=nc_def_dim(ncidDIM1_NAMENC_UNLIMITED, &dimid))) ERRSTAT(status);
114   if((status=nc_def_var(ncidVAR_NAMENC_CHAR, 1, &dimid, &varid))) ERRSTAT(status);
115   if((status=nc_put_att_text(ncidNC_GLOBALATT_NAME, 1, &data))) ERRSTAT(status);
116   if((status=nc_enddef(ncid))) ERRSTAT(status);
117
118   /* Write one record of var data, a single character. */
119   count[0] = 1;
120   start[0] = 0;
121   if((status=nc_put_vara_text(ncidvaridstartcount, &data))) ERRSTAT(status);
122
123   /* We're done! */
124   if((status=nc_close(ncid))) ERRSTAT(status);
125
126   /* Reopen the file and check it. */
127   if((status=nc_open(testfilediskmode|NC_WRITE, &ncid))) ERRSTAT(status);
128   if((status=nc_inq(ncid, &ndims, &nvars, &natts, &unlimdimid))) ERRSTAT(status);
129   if (ndims != 1 && nvars != 1 && natts != 0 && unlimdimid != 0) ERRSTAT(status);
130   if((status=nc_get_var_text(ncidvarid, &data_in))) ERRSTAT(status);
131   if (data_in != dataERRSTAT(status);
132   if((status=nc_get_att_text(ncidNC_GLOBALATT_NAME, &data_in))) ERRSTAT(status);
133   if (data_in != dataERRSTAT(status);
134   if((status=nc_close(ncid))) ERRSTAT(status);
135   return 0;
136}
137#endif
138
139int
140main(int argc, char **argv)
141{
142    int i;
143
144    /* Set defaults */
145    persist = 0;
146    usenetcdf4 = 0;
147    mmap = 0;
148    diskless = 0;
149    diskmode = 0;
150
151    for(i=1;i<argc;i++) {
152 if(strcmp(argv[i],"diskless")==0) diskless=1;
153 else if(strcmp(argv[i],"mmap")==0) mmap=1;
154 /* ignore anything not recognized */
155    }
156
157    if(diskless)
158        diskmode |= NC_DISKLESS;
159    if(diskless && mmap)
160        diskmode |= NC_MMAP;
161
162    printf("\n*** Testing diskless file: create/modify %s",
163     diskless?"in-memory":"in-file");
164    if(diskless && mmap)
165        printf("+mmap");
166    printf(" %s\n",NCFILENAME);
167
168    /* case NC_FORMAT_CLASSIC: only test this format */
169    nc_set_default_format(NC_FORMAT_CLASSICNULL);
170
171    printf("*** testing diskless file with two growing record "
172      "variables, with attributes added...");
173    test_two_growing_with_att(NCFILENAME);
174    SUMMARIZE_ERR;
175
176   FINAL_RESULTS;
177}


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