1 /*
2  *  Copyright (C) 2003, Northwestern University and Argonne National Laboratory
3  *  See COPYRIGHT notice in top-level directory.
4  *
5  *  $Id: nc_test.c 2744 2016-12-28 16:25:22Z wkliao $
6  */
7 
8 #include <libgen.h> /* basename() */
9 #include <unistd.h>
10 #include "tests.h"
11 
12 /*
13  * Test driver for netCDF-3 interface.  This program performs tests against
14  * the netCDF-3 specification for all user-level functions in an
15  * implementation of the netCDF library.
16  *
17  * Unless invoked with "-r" (read_only) option, must be invoked from a
18  * directory in which the invoker has write permission.
19  *
20  * Files:
21  * The read-only tests read files:
22  *     test.nc (see below)
23  *     test_get.c (used merely as an example of a non-netCDF file)
24  *
25  * The write tests
26  *     read test.nc (see below)
27  *     write scratch.nc (deleted after each test)
28  *
29  * The file test.nc is created by running nc_test with the -c (create) option.
30  * It is described by the following global variables.
31  */
32 
33 
34 /*
35  * global variables (defined by function init_gvars) describing file test.nc
36  */
37 char dim_name[NDIMS][3];
38 MPI_Offset dim_len[NDIMS];
39 char var_name[NVARS][2+MAX_RANK];
40 nc_type var_type[NVARS];
41 int var_rank[NVARS];
42 int var_dimid[NVARS][MAX_RANK];
43 MPI_Offset var_shape[NVARS][MAX_RANK];
44 MPI_Offset var_nels[NVARS];
45 int  var_natts[NVARS];
46 char att_name[NVARS][MAX_NATTS][2];
47 char gatt_name[NGATTS][3];
48 nc_type att_type[NVARS][NGATTS];
49 nc_type gatt_type[NGATTS];
50 MPI_Offset att_len[NVARS][MAX_NATTS];
51 MPI_Offset gatt_len[NGATTS];
52 
53 /*
54  * command-line options
55  */
56 static int  create_file;	/* if 1, create file test.nc */
57 int  read_only;		/* if 1, don't try to change files */
58 int  verbose;		/* if 1, print details of tests */
59 int  max_nmpt;		/* max. number of messages per test */
60 
61 /*
62  * Misc. global variables
63  */
64 int  nfails;		/* number of failures in specific test */
65 char testfile[128];
66 char scratch[128];
67 MPI_Comm comm = MPI_COMM_WORLD; /* mpi communicator for parallel-netcdf */
68 MPI_Info info;
69 
70 static void
usage(char * progname)71 usage(char *progname)
72 {
73     error("%s [-c | -hrv -n <MAX_NMPT>]\n", progname);
74     error("   [-h] Print help\n" );
75     error("   [-c] Create file test.nc (Do not do tests)\n" );
76     error("   [-r] Just do read-only tests\n" );
77     error("   [-v] Verbose mode\n" );
78     error("   [-2] (with -c) create file with CDF-2 format\n" );
79     error("   [-n <MAX_NMPT>] max. number of messages per test (Default: 8)\n");
80     error("   [-d directory] directory for storing input/output files\n");
81 }
82 
83 #define NC_CHECK_AND_PRINT                                               \
84     nfailsTotal += nfails;                                               \
85     if (verbose) print( "*** Testing %-30s ... ",func_name);             \
86     if (nfails == 0 && verbose) {                                        \
87         if (noks > 0) printf("%4d good comparisons. ok", noks);          \
88         printf("\n");                                                    \
89     }                                                                    \
90     if (nfails > 0) {                                                    \
91         print("\n\t### %d FAILURES TESTING %s! Stop ... ###\n",          \
92               nfails,func_name);                                         \
93         goto fn_exit;                                                    \
94     }
95 
96 #define NC_TEST(func) {                                                  \
97     int noks;                                                            \
98     char func_name[64];                                                  \
99     nfails = 0;                                                          \
100     sprintf(func_name, "test_%s",#func);                                 \
101     noks = test_ ## func();                                              \
102     NC_CHECK_AND_PRINT                                                   \
103 }
104 
105 #define NC_TEST1(func, arg) {                                            \
106     int noks;                                                            \
107     char func_name[64];                                                  \
108     sprintf(func_name, "test_%s",#func);                                 \
109     noks = test_ ## func(arg);                                           \
110     NC_CHECK_AND_PRINT                                                   \
111 }
112 
113 #define NC_TEST2(func, arg1, arg2) {                                     \
114     int noks;                                                            \
115     char func_name[64];                                                  \
116     sprintf(func_name, "test_%s",#func);                                 \
117     noks = test_ ## func(arg1, arg2);                                    \
118     NC_CHECK_AND_PRINT                                                   \
119 }
120 
121 #if 1		/* both CRAY MPP and OSF/1 Alpha systems need this */
122 #include <signal.h>
123 #endif /* T90 */
124 
125 int
main(int argc,char * argv[])126 main(int argc, char *argv[])
127 {
128     extern char *optarg;
129     int cdf_format, c;
130     int numGatts, numTypes, numVars;
131     int nfailsTotal = 0;        /* total number of failures */
132 
133 #if 1		/* both CRAY MPP and OSF/1 Alpha systems need this */
134 	/*
135 	 * Some of the extreme test assignments in this program trigger
136          * floating point exceptions on CRAY T90
137 	 */
138 	(void) signal(SIGFPE, SIG_IGN);
139 #endif
140 
141     MPI_Init(&argc, &argv);
142 
143     cdf_format = 1; 	/* 1: CDF-1, 2: CDF-2 5: CDF-5 */
144     create_file = 0;            /* file test.nc will normally already exist */
145     read_only = 0;               /* assume may write in test dir as default */
146     verbose = 0;
147     max_nmpt = 8;
148     strcpy(testfile, "test.nc");    /* read-only testfile */
149     strcpy(scratch, "scratch.nc");  /* writable scratch file */
150 
151     while ((c = getopt(argc, argv, "c25hrvn:d:")) != EOF)
152       switch(c) {
153 	case 'c':		/* Create file test.nc */
154 	  create_file = 1;
155 	  break;
156 	case 'r':		/* just perform read-only tests */
157 	  read_only = 1;
158 	  break;
159 	case 'v':		/* verbose mode */
160 	  verbose = 1;
161 	  break;
162 	case 'n':		/* verbose mode */
163 	  max_nmpt = (int)strtol(optarg,NULL,10);
164 	  break;
165 	case '2':
166 	  cdf_format = 2;
167 	  break;
168 	case '5':
169 	  cdf_format = 5;
170 	case 'd':
171           sprintf(testfile, "%s/test.nc", optarg);
172           sprintf(scratch, "%s/scratch.nc", optarg);
173 	  break;
174 	case 'h':
175 	case '?':
176 	  usage(argv[0]);
177 	  return 1;
178       }
179 
180     MPI_Info_create(&info);
181     /* MPI_Info_set(info, "romio_pvfs2_posix_write", "enable"); */
182 
183     numGatts = 6;
184     numVars  = 136;
185     numTypes = 6;
186     if (cdf_format == 5) {
187         numGatts = NGATTS;
188         numVars  = NVARS;
189         numTypes = NTYPES;
190     }
191 
192     if (cdf_format == 2)
193         ncmpi_set_default_format(NC_FORMAT_CDF2, NULL);
194     else if (cdf_format == 5)
195         ncmpi_set_default_format(NC_FORMAT_CDF5, NULL);
196     else
197         ncmpi_set_default_format(NC_FORMAT_CLASSIC, NULL);
198 
199     /* Initialize global variables defining test file */
200     init_gvars(numGatts, numTypes, numVars);
201 
202     if ( create_file ) {
203 	write_file(testfile, numGatts, numVars);
204         MPI_Info_free(&info);
205 	MPI_Finalize();
206 	return nfailsTotal > 0;
207     }
208 
209     /* delete any existing scratch netCDF file */
210     if ( ! read_only ) {
211         if (access(scratch, F_OK) == 0)
212             unlink(scratch);
213     }
214 
215     char *cmd_str = (char*)malloc(strlen(argv[0]) + 256);
216     sprintf(cmd_str, "*** TESTING C   %s for format CDF-%d ", basename(argv[0]), cdf_format);
217     printf("%-66s ------ ",cmd_str);
218     free(cmd_str);
219 
220     /* Test read-only functions, using pregenerated test-file */
221     NC_TEST(ncmpi_strerror);
222     NC_TEST(ncmpi_open);
223     NC_TEST(ncmpi_close);
224     NC_TEST2(ncmpi_inq, numGatts, numVars);
225     NC_TEST(ncmpi_inq_dimid);
226     NC_TEST(ncmpi_inq_dim);
227     NC_TEST(ncmpi_inq_dimlen);
228     NC_TEST(ncmpi_inq_dimname);
229     NC_TEST1(ncmpi_inq_varid, numVars);
230     NC_TEST1(ncmpi_inq_var, numVars);
231     NC_TEST1(ncmpi_inq_natts, numGatts);
232     NC_TEST(ncmpi_inq_ndims);
233     NC_TEST1(ncmpi_inq_nvars, numVars);
234     NC_TEST(ncmpi_inq_unlimdim);
235     NC_TEST1(ncmpi_inq_vardimid, numVars);
236     NC_TEST1(ncmpi_inq_varname, numVars);
237     NC_TEST2(ncmpi_inq_varnatts, numGatts, numVars);
238     NC_TEST1(ncmpi_inq_varndims, numVars);
239     NC_TEST1(ncmpi_inq_vartype, numVars);
240     NC_TEST1(ncmpi_get_var_text, numVars);
241     NC_TEST1(ncmpi_get_var_schar, numVars);
242     NC_TEST1(ncmpi_get_var_short, numVars);
243     NC_TEST1(ncmpi_get_var_int, numVars);
244     NC_TEST1(ncmpi_get_var_long, numVars);
245     NC_TEST1(ncmpi_get_var_float, numVars);
246     NC_TEST1(ncmpi_get_var_double, numVars);
247     NC_TEST1(ncmpi_get_var_uchar, numVars);
248     NC_TEST1(ncmpi_get_var_ushort, numVars);
249     NC_TEST1(ncmpi_get_var_uint, numVars);
250     NC_TEST1(ncmpi_get_var_longlong, numVars);
251     NC_TEST1(ncmpi_get_var_ulonglong, numVars);
252     NC_TEST1(ncmpi_get_var1_text, numVars);
253     NC_TEST1(ncmpi_get_var1_schar, numVars);
254     NC_TEST1(ncmpi_get_var1_short, numVars);
255     NC_TEST1(ncmpi_get_var1_int, numVars);
256     NC_TEST1(ncmpi_get_var1_long, numVars);
257     NC_TEST1(ncmpi_get_var1_float, numVars);
258     NC_TEST1(ncmpi_get_var1_double, numVars);
259     NC_TEST1(ncmpi_get_var1_uchar, numVars);
260     NC_TEST1(ncmpi_get_var1_ushort, numVars);
261     NC_TEST1(ncmpi_get_var1_uint, numVars);
262     NC_TEST1(ncmpi_get_var1_longlong, numVars);
263     NC_TEST1(ncmpi_get_var1_ulonglong, numVars);
264     NC_TEST1(ncmpi_get_var1, numVars);
265     NC_TEST1(ncmpi_get_vara_text, numVars);
266     NC_TEST1(ncmpi_get_vara_schar, numVars);
267     NC_TEST1(ncmpi_get_vara_short, numVars);
268     NC_TEST1(ncmpi_get_vara_int, numVars);
269     NC_TEST1(ncmpi_get_vara_long, numVars);
270     NC_TEST1(ncmpi_get_vara_float, numVars);
271     NC_TEST1(ncmpi_get_vara_double, numVars);
272     NC_TEST1(ncmpi_get_vara_uchar, numVars);
273     NC_TEST1(ncmpi_get_vara_ushort, numVars);
274     NC_TEST1(ncmpi_get_vara_uint, numVars);
275     NC_TEST1(ncmpi_get_vara_longlong, numVars);
276     NC_TEST1(ncmpi_get_vara_ulonglong, numVars);
277     NC_TEST1(ncmpi_get_vara, numVars);
278     NC_TEST1(ncmpi_get_vars_text, numVars);
279     NC_TEST1(ncmpi_get_vars_schar, numVars);
280     NC_TEST1(ncmpi_get_vars_short, numVars);
281     NC_TEST1(ncmpi_get_vars_int, numVars);
282     NC_TEST1(ncmpi_get_vars_long, numVars);
283     NC_TEST1(ncmpi_get_vars_float, numVars);
284     NC_TEST1(ncmpi_get_vars_double, numVars);
285     NC_TEST1(ncmpi_get_vars_uchar, numVars);
286     NC_TEST1(ncmpi_get_vars_ushort, numVars);
287     NC_TEST1(ncmpi_get_vars_uint, numVars);
288     NC_TEST1(ncmpi_get_vars_longlong, numVars);
289     NC_TEST1(ncmpi_get_vars_ulonglong, numVars);
290     NC_TEST1(ncmpi_get_vars, numVars);
291     NC_TEST1(ncmpi_get_varm_text, numVars);
292     NC_TEST1(ncmpi_get_varm_schar, numVars);
293     NC_TEST1(ncmpi_get_varm_short, numVars);
294     NC_TEST1(ncmpi_get_varm_int, numVars);
295     NC_TEST1(ncmpi_get_varm_long, numVars);
296     NC_TEST1(ncmpi_get_varm_float, numVars);
297     NC_TEST1(ncmpi_get_varm_double, numVars);
298     NC_TEST1(ncmpi_get_varm_uchar, numVars);
299     NC_TEST1(ncmpi_get_varm_ushort, numVars);
300     NC_TEST1(ncmpi_get_varm_uint, numVars);
301     NC_TEST1(ncmpi_get_varm_longlong, numVars);
302     NC_TEST1(ncmpi_get_varm_ulonglong, numVars);
303     NC_TEST1(ncmpi_get_varm, numVars);
304     NC_TEST2(ncmpi_get_att_text, numGatts, numVars);
305     NC_TEST2(ncmpi_get_att_schar, numGatts, numVars);
306     NC_TEST2(ncmpi_get_att_short, numGatts, numVars);
307     NC_TEST2(ncmpi_get_att_int, numGatts, numVars);
308     NC_TEST2(ncmpi_get_att_long, numGatts, numVars);
309     NC_TEST2(ncmpi_get_att_float, numGatts, numVars);
310     NC_TEST2(ncmpi_get_att_double, numGatts, numVars);
311     NC_TEST2(ncmpi_get_att_uchar, numGatts, numVars);
312     NC_TEST2(ncmpi_get_att_ushort, numGatts, numVars);
313     NC_TEST2(ncmpi_get_att_uint, numGatts, numVars);
314     NC_TEST2(ncmpi_get_att_longlong, numGatts, numVars);
315     NC_TEST2(ncmpi_get_att_ulonglong, numGatts, numVars);
316     NC_TEST2(ncmpi_get_att,     numGatts, numVars);
317     NC_TEST2(ncmpi_inq_att,     numGatts, numVars);
318     NC_TEST2(ncmpi_inq_attname, numGatts, numVars);
319     NC_TEST2(ncmpi_inq_attid,   numGatts, numVars);
320     NC_TEST2(ncmpi_inq_attlen,  numGatts, numVars);
321     NC_TEST2(ncmpi_inq_atttype, numGatts, numVars);
322 
323     /* nonblocking I/O */
324     NC_TEST1(ncmpi_iget_var_text, numVars);
325     NC_TEST1(ncmpi_iget_var_schar, numVars);
326     NC_TEST1(ncmpi_iget_var_short, numVars);
327     NC_TEST1(ncmpi_iget_var_int, numVars);
328     NC_TEST1(ncmpi_iget_var_long, numVars);
329     NC_TEST1(ncmpi_iget_var_float, numVars);
330     NC_TEST1(ncmpi_iget_var_double, numVars);
331     NC_TEST1(ncmpi_iget_var_uchar, numVars);
332     NC_TEST1(ncmpi_iget_var_ushort, numVars);
333     NC_TEST1(ncmpi_iget_var_uint, numVars);
334     NC_TEST1(ncmpi_iget_var_longlong, numVars);
335     NC_TEST1(ncmpi_iget_var_ulonglong, numVars);
336     NC_TEST1(ncmpi_iget_var, numVars);
337     NC_TEST1(ncmpi_iget_var1_text, numVars);
338     NC_TEST1(ncmpi_iget_var1_schar, numVars);
339     NC_TEST1(ncmpi_iget_var1_short, numVars);
340     NC_TEST1(ncmpi_iget_var1_int, numVars);
341     NC_TEST1(ncmpi_iget_var1_long, numVars);
342     NC_TEST1(ncmpi_iget_var1_float, numVars);
343     NC_TEST1(ncmpi_iget_var1_double, numVars);
344     NC_TEST1(ncmpi_iget_var1_uchar, numVars);
345     NC_TEST1(ncmpi_iget_var1_ushort, numVars);
346     NC_TEST1(ncmpi_iget_var1_uint, numVars);
347     NC_TEST1(ncmpi_iget_var1_longlong, numVars);
348     NC_TEST1(ncmpi_iget_var1_ulonglong, numVars);
349     NC_TEST1(ncmpi_iget_var1, numVars);
350     NC_TEST1(ncmpi_iget_vara_text, numVars);
351     NC_TEST1(ncmpi_iget_vara_schar, numVars);
352     NC_TEST1(ncmpi_iget_vara_short, numVars);
353     NC_TEST1(ncmpi_iget_vara_int, numVars);
354     NC_TEST1(ncmpi_iget_vara_long, numVars);
355     NC_TEST1(ncmpi_iget_vara_float, numVars);
356     NC_TEST1(ncmpi_iget_vara_double, numVars);
357     NC_TEST1(ncmpi_iget_vara_uchar, numVars);
358     NC_TEST1(ncmpi_iget_vara_ushort, numVars);
359     NC_TEST1(ncmpi_iget_vara_uint, numVars);
360     NC_TEST1(ncmpi_iget_vara_longlong, numVars);
361     NC_TEST1(ncmpi_iget_vara_ulonglong, numVars);
362     NC_TEST1(ncmpi_iget_vara, numVars);
363     NC_TEST1(ncmpi_iget_vars_text, numVars);
364     NC_TEST1(ncmpi_iget_vars_schar, numVars);
365     NC_TEST1(ncmpi_iget_vars_short, numVars);
366     NC_TEST1(ncmpi_iget_vars_int, numVars);
367     NC_TEST1(ncmpi_iget_vars_long, numVars);
368     NC_TEST1(ncmpi_iget_vars_float, numVars);
369     NC_TEST1(ncmpi_iget_vars_double, numVars);
370     NC_TEST1(ncmpi_iget_vars_uchar, numVars);
371     NC_TEST1(ncmpi_iget_vars_ushort, numVars);
372     NC_TEST1(ncmpi_iget_vars_uint, numVars);
373     NC_TEST1(ncmpi_iget_vars_longlong, numVars);
374     NC_TEST1(ncmpi_iget_vars_ulonglong, numVars);
375     NC_TEST1(ncmpi_iget_vars, numVars);
376     NC_TEST1(ncmpi_iget_varm_text, numVars);
377     NC_TEST1(ncmpi_iget_varm_schar, numVars);
378     NC_TEST1(ncmpi_iget_varm_short, numVars);
379     NC_TEST1(ncmpi_iget_varm_int, numVars);
380     NC_TEST1(ncmpi_iget_varm_long, numVars);
381     NC_TEST1(ncmpi_iget_varm_float, numVars);
382     NC_TEST1(ncmpi_iget_varm_double, numVars);
383     NC_TEST1(ncmpi_iget_varm_uchar, numVars);
384     NC_TEST1(ncmpi_iget_varm_ushort, numVars);
385     NC_TEST1(ncmpi_iget_varm_uint, numVars);
386     NC_TEST1(ncmpi_iget_varm_longlong, numVars);
387     NC_TEST1(ncmpi_iget_varm_ulonglong, numVars);
388     NC_TEST1(ncmpi_iget_varm, numVars);
389 
390 	/* Test write functions */
391     if (! read_only) {
392 	NC_TEST(ncmpi_create);
393 	NC_TEST2(ncmpi_redef, numGatts, numVars);
394 	/* NC_TEST(ncmpi_enddef);  redundant, as it calls test_ncmpi_redef() */
395 	NC_TEST2(ncmpi_sync, numGatts, numVars);
396 	NC_TEST2(ncmpi_abort, numGatts, numVars);
397 	NC_TEST1(ncmpi_def_dim, numVars);
398 	NC_TEST(ncmpi_rename_dim);
399 	NC_TEST1(ncmpi_def_var, numVars);
400 	NC_TEST1(ncmpi_put_var_text, numVars);
401 	NC_TEST1(ncmpi_put_var_schar, numVars);
402 	NC_TEST1(ncmpi_put_var_short, numVars);
403 	NC_TEST1(ncmpi_put_var_int, numVars);
404 	NC_TEST1(ncmpi_put_var_long, numVars);
405 	NC_TEST1(ncmpi_put_var_float, numVars);
406 	NC_TEST1(ncmpi_put_var_double, numVars);
407 	NC_TEST1(ncmpi_put_var_uchar, numVars);
408 	NC_TEST1(ncmpi_put_var_ushort, numVars);
409 	NC_TEST1(ncmpi_put_var_uint, numVars);
410 	NC_TEST1(ncmpi_put_var_longlong, numVars);
411 	NC_TEST1(ncmpi_put_var_ulonglong, numVars);
412 	NC_TEST1(ncmpi_put_var1_text, numVars);
413 	NC_TEST1(ncmpi_put_var1_schar, numVars);
414 	NC_TEST1(ncmpi_put_var1_short, numVars);
415 	NC_TEST1(ncmpi_put_var1_int, numVars);
416 	NC_TEST1(ncmpi_put_var1_long, numVars);
417 	NC_TEST1(ncmpi_put_var1_float, numVars);
418 	NC_TEST1(ncmpi_put_var1_double, numVars);
419 	NC_TEST1(ncmpi_put_var1_uchar, numVars);
420 	NC_TEST1(ncmpi_put_var1_ushort, numVars);
421 	NC_TEST1(ncmpi_put_var1_uint, numVars);
422 	NC_TEST1(ncmpi_put_var1_longlong, numVars);
423 	NC_TEST1(ncmpi_put_var1_ulonglong, numVars);
424 	NC_TEST1(ncmpi_put_var1, numVars);
425 	NC_TEST1(ncmpi_put_vara_text, numVars);
426 	NC_TEST1(ncmpi_put_vara_schar, numVars);
427 	NC_TEST1(ncmpi_put_vara_short, numVars);
428 	NC_TEST1(ncmpi_put_vara_int, numVars);
429 	NC_TEST1(ncmpi_put_vara_long, numVars);
430 	NC_TEST1(ncmpi_put_vara_float, numVars);
431 	NC_TEST1(ncmpi_put_vara_double, numVars);
432 	NC_TEST1(ncmpi_put_vara_uchar, numVars);
433 	NC_TEST1(ncmpi_put_vara_ushort, numVars);
434 	NC_TEST1(ncmpi_put_vara_uint, numVars);
435 	NC_TEST1(ncmpi_put_vara_longlong, numVars);
436 	NC_TEST1(ncmpi_put_vara_ulonglong, numVars);
437 	NC_TEST1(ncmpi_put_vara, numVars);
438 	NC_TEST1(ncmpi_put_vars_text, numVars);
439 	NC_TEST1(ncmpi_put_vars_schar, numVars);
440 	NC_TEST1(ncmpi_put_vars_short, numVars);
441 	NC_TEST1(ncmpi_put_vars_int, numVars);
442 	NC_TEST1(ncmpi_put_vars_long, numVars);
443 	NC_TEST1(ncmpi_put_vars_float, numVars);
444 	NC_TEST1(ncmpi_put_vars_double, numVars);
445 	NC_TEST1(ncmpi_put_vars_uchar, numVars);
446 	NC_TEST1(ncmpi_put_vars_ushort, numVars);
447 	NC_TEST1(ncmpi_put_vars_uint, numVars);
448 	NC_TEST1(ncmpi_put_vars_longlong, numVars);
449 	NC_TEST1(ncmpi_put_vars_ulonglong, numVars);
450 	NC_TEST1(ncmpi_put_vars, numVars);
451 	NC_TEST1(ncmpi_put_varm_text, numVars);
452 	NC_TEST1(ncmpi_put_varm_schar, numVars);
453 	NC_TEST1(ncmpi_put_varm_short, numVars);
454 	NC_TEST1(ncmpi_put_varm_int, numVars);
455 	NC_TEST1(ncmpi_put_varm_long, numVars);
456 	NC_TEST1(ncmpi_put_varm_float, numVars);
457 	NC_TEST1(ncmpi_put_varm_double, numVars);
458 	NC_TEST1(ncmpi_put_varm_uchar, numVars);
459 	NC_TEST1(ncmpi_put_varm_ushort, numVars);
460 	NC_TEST1(ncmpi_put_varm_uint, numVars);
461 	NC_TEST1(ncmpi_put_varm_longlong, numVars);
462 	NC_TEST1(ncmpi_put_varm_ulonglong, numVars);
463 	NC_TEST1(ncmpi_put_varm, numVars);
464 	NC_TEST1(ncmpi_rename_var, numVars);
465 	NC_TEST2(ncmpi_put_att_text, numGatts, numVars);
466 	NC_TEST2(ncmpi_put_att_schar, numGatts, numVars);
467 	NC_TEST2(ncmpi_put_att_short, numGatts, numVars);
468 	NC_TEST2(ncmpi_put_att_int, numGatts, numVars);
469 	NC_TEST2(ncmpi_put_att_long, numGatts, numVars);
470 	NC_TEST2(ncmpi_put_att_float, numGatts, numVars);
471 	NC_TEST2(ncmpi_put_att_double, numGatts, numVars);
472 	NC_TEST2(ncmpi_put_att_uchar, numGatts, numVars);
473 	NC_TEST2(ncmpi_put_att_ushort, numGatts, numVars);
474 	NC_TEST2(ncmpi_put_att_uint, numGatts, numVars);
475 	NC_TEST2(ncmpi_put_att_longlong, numGatts, numVars);
476 	NC_TEST2(ncmpi_put_att_ulonglong, numGatts, numVars);
477 	NC_TEST2(ncmpi_put_att, numGatts, numVars);
478 	NC_TEST2(ncmpi_copy_att, numGatts, numVars);
479 	NC_TEST2(ncmpi_rename_att, numGatts, numVars);
480 	NC_TEST2(ncmpi_del_att, numGatts, numVars);
481 	NC_TEST1(ncmpi_set_fill, numVars);
482 	NC_TEST(ncmpi_delete);
483 
484         /* test nonblocking APIs */
485 	NC_TEST1(ncmpi_iput_var_text, numVars);
486 	NC_TEST1(ncmpi_iput_var_schar, numVars);
487 	NC_TEST1(ncmpi_iput_var_short, numVars);
488 	NC_TEST1(ncmpi_iput_var_int, numVars);
489 	NC_TEST1(ncmpi_iput_var_long, numVars);
490 	NC_TEST1(ncmpi_iput_var_float, numVars);
491 	NC_TEST1(ncmpi_iput_var_double, numVars);
492 	NC_TEST1(ncmpi_iput_var_uchar, numVars);
493 	NC_TEST1(ncmpi_iput_var_ushort, numVars);
494 	NC_TEST1(ncmpi_iput_var_uint, numVars);
495 	NC_TEST1(ncmpi_iput_var_longlong, numVars);
496 	NC_TEST1(ncmpi_iput_var_ulonglong, numVars);
497 	NC_TEST1(ncmpi_iput_var, numVars);
498 	NC_TEST1(ncmpi_iput_var1_text, numVars);
499 	NC_TEST1(ncmpi_iput_var1_schar, numVars);
500 	NC_TEST1(ncmpi_iput_var1_short, numVars);
501 	NC_TEST1(ncmpi_iput_var1_int, numVars);
502 	NC_TEST1(ncmpi_iput_var1_long, numVars);
503 	NC_TEST1(ncmpi_iput_var1_float, numVars);
504 	NC_TEST1(ncmpi_iput_var1_double, numVars);
505 	NC_TEST1(ncmpi_iput_var1_uchar, numVars);
506 	NC_TEST1(ncmpi_iput_var1_ushort, numVars);
507 	NC_TEST1(ncmpi_iput_var1_uint, numVars);
508 	NC_TEST1(ncmpi_iput_var1_longlong, numVars);
509 	NC_TEST1(ncmpi_iput_var1_ulonglong, numVars);
510 	NC_TEST1(ncmpi_iput_var1, numVars);
511 	NC_TEST1(ncmpi_iput_vara_text, numVars);
512 	NC_TEST1(ncmpi_iput_vara_schar, numVars);
513 	NC_TEST1(ncmpi_iput_vara_short, numVars);
514 	NC_TEST1(ncmpi_iput_vara_int, numVars);
515 	NC_TEST1(ncmpi_iput_vara_long, numVars);
516 	NC_TEST1(ncmpi_iput_vara_float, numVars);
517 	NC_TEST1(ncmpi_iput_vara_double, numVars);
518 	NC_TEST1(ncmpi_iput_vara_uchar, numVars);
519 	NC_TEST1(ncmpi_iput_vara_ushort, numVars);
520 	NC_TEST1(ncmpi_iput_vara_uint, numVars);
521 	NC_TEST1(ncmpi_iput_vara_longlong, numVars);
522 	NC_TEST1(ncmpi_iput_vara_ulonglong, numVars);
523 	NC_TEST1(ncmpi_iput_vara, numVars);
524 	NC_TEST1(ncmpi_iput_vars_text, numVars);
525 	NC_TEST1(ncmpi_iput_vars_schar, numVars);
526 	NC_TEST1(ncmpi_iput_vars_short, numVars);
527 	NC_TEST1(ncmpi_iput_vars_int, numVars);
528 	NC_TEST1(ncmpi_iput_vars_long, numVars);
529 	NC_TEST1(ncmpi_iput_vars_float, numVars);
530 	NC_TEST1(ncmpi_iput_vars_double, numVars);
531 	NC_TEST1(ncmpi_iput_vars_uchar, numVars);
532 	NC_TEST1(ncmpi_iput_vars_ushort, numVars);
533 	NC_TEST1(ncmpi_iput_vars_uint, numVars);
534 	NC_TEST1(ncmpi_iput_vars_longlong, numVars);
535 	NC_TEST1(ncmpi_iput_vars_ulonglong, numVars);
536 	NC_TEST1(ncmpi_iput_vars, numVars);
537 	NC_TEST1(ncmpi_iput_varm_text, numVars);
538 	NC_TEST1(ncmpi_iput_varm_schar, numVars);
539 	NC_TEST1(ncmpi_iput_varm_short, numVars);
540 	NC_TEST1(ncmpi_iput_varm_int, numVars);
541 	NC_TEST1(ncmpi_iput_varm_long, numVars);
542 	NC_TEST1(ncmpi_iput_varm_float, numVars);
543 	NC_TEST1(ncmpi_iput_varm_double, numVars);
544 	NC_TEST1(ncmpi_iput_varm_uchar, numVars);
545 	NC_TEST1(ncmpi_iput_varm_ushort, numVars);
546 	NC_TEST1(ncmpi_iput_varm_uint, numVars);
547 	NC_TEST1(ncmpi_iput_varm_longlong, numVars);
548 	NC_TEST1(ncmpi_iput_varm_ulonglong, numVars);
549 	NC_TEST1(ncmpi_iput_varm, numVars);
550     }
551 
552 fn_exit:
553     MPI_Info_free(&info);
554 
555     if (nfailsTotal == 0)  {
556         printf(PASS_STR);
557     }
558     else {
559         print("\n%s: expects 0 failures ... ",argv[0]);
560         printf(FAIL_STR, nfailsTotal);
561     }
562     MPI_Finalize();
563     return nfailsTotal > 0;
564 }
565