1/*
2  Copyright 2008, UCAR/Unidata
3  See COPYRIGHT file for copying and redistribution conditions.
4
5  This program tests the large file bug in netCDF 3.6.2,
6  creating byte and short variables larger than 4 GiB.
7
8  $Id: tst_big_var.c,v 1.9 2010/05/15 00:50:10 russ Exp $
9*/
10
11#include <nc_tests.h>
12#include "err_macros.h"
13#include <netcdf.h>
14#include <stdio.h>
15#include <string.h>
16#include <stdlib.h>
17
18#define FILE_NAME "tst_big_var.nc"
19
20/* Test with both classic and 64-bit offset files. If netcdf-4 is
21 * included, test with both netCDF-4 format variants also. */
22#ifdef USE_NETCDF4
23#define NUM_FORMATS (4)
24#else
25#define NUM_FORMATS (2)
26#endif
27
28
29#define NUMDIMS 2 /* rank of each variable in tests */
30#define DIM1 2048
31#define DIM2 2097153 /* DIM1*DIM2*sizeof(char)   > 2**32 */
32
33/*
34 * In netCDF-3.6.2, an assertion failure occurs on 32-bit platforms
35 * when creating a byte variable for which the product of dimensions
36 * is greater than 2**32.  Check that this bug has been fixed.
37 */
38static int
39test_big_var(const char *testfile)
40{
41    int ncidvariddimids[NUMDIMS];
42    size_t index[NUMDIMS];
43    int nval = 99;
44    int nval_in;
45
46    /* Create a file with one big variable. */
47    if (nc_create(testfileNC_CLOBBER, &ncid)) ERR;
48    if (nc_set_fill(ncidNC_NOFILLNULL)) ERR;
49    if (nc_def_dim(ncid, "dim1", DIM1, &dimids[0])) ERR;
50    if (nc_def_dim(ncid, "dim2", DIM2 - 1, &dimids[1])) ERR;
51    if (nc_def_var(ncid, "var", NC_BYTENUMDIMSdimids, &varid)) ERR;
52    if (nc_enddef(ncid)) ERR;
53    index[0] = DIM1 - 1;
54    index[1] = DIM2 - 2;
55    if (nc_put_var1_int(ncidvaridindex, &nval)) ERR;
56    if (nc_close(ncid)) ERR;
57
58    /* Open the file and check it. */
59    if (nc_open(testfileNC_NOWRITE, &ncid)) ERR;
60    if (nc_inq_varid(ncid, "var", &varid)) ERR;
61    if (nc_get_var1_int(ncidvaridindex, &nval_in)) ERR;
62    if (nval != nval_inERR;
63    if (nc_close(ncid)) ERR;
64    return 0;
65}
66
67int
68main(int argc, char **argv) {
69    int i;
70    char testfile[NC_MAX_NAME + 1];
71
72    printf("\n*** Testing files with one very big variable.\n");
73    sprintf(testfile, "%s/%s", TEMP_LARGEFILE_NAME);
74    for (i = NC_FORMAT_CLASSICi <= NUM_FORMATSi++)
75    {
76       printf("*** testing format %d file with byte variable with > 2**32 values...", i);
77       nc_set_default_format(iNULL);
78       test_big_var(testfile);
79       (void) remove(testfile);
80       SUMMARIZE_ERR;
81   }
82
83    FINAL_RESULTS;
84}


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