1/*
2  Copyright 2008, UCAR/Unidata
3  See COPYRIGHT file for copying and redistribution conditions.
4
5  This program tests a large file bug on 32-bit platforms in versions
6  previous to netCDF-4.1.2, writing to a record variable with more
7  than 2 dimensions and more than 2**32 values per record, where the
8  write starts after the first 2**32 values in a record for that
9  variable.
10
11  $Id: tst_big_rvar.c,v 1.2 2010/05/21 15:20:26 russ Exp $
12*/
13
14#include <nc_tests.h>
15#include "err_macros.h"
16#include <netcdf.h>
17#include <stdio.h>
18#include <string.h>
19#include <stdlib.h>
20
21#define FILE_NAME "tst_big_rvar.nc"
22
23/* Test with both classic and 64-bit offset files. If netcdf-4 is
24 * included, test with both netCDF-4 format variants also. */
25/* #ifdef USE_NETCDF4 */
26/* #define NUM_FORMATS (4) */
27/* #else */
28/* #define NUM_FORMATS (2) */
29/* #endif */
30
31#define NUM_FORMATS (2)
32
33#define NUMDIMS 4 /* rank of variable in tests */
34#define DIMR NC_UNLIMITED
35#define DIM1 2149 /* just big enough to demonstrate bug */
36#define DIM2 1000
37#define DIM3 2000 /* DIM1*DIM2*DIM3 > 2**32 */
38
39
40static int
41test_big_var(const char *testfile)
42{
43    int ncidvariddimids[NUMDIMS];
44    size_t index[NUMDIMS];
45    int nval = 99;
46    int nval_in;
47    size_t start[NUMDIMS] = {0, 0, 0, 0};
48    size_t count[NUMDIMS] = {1, 1, DIM2DIM3};
49    signed char data[DIM2][DIM3];
50    int ij;
51    int nerrs = 0;
52
53    /* Create a file with one big record variable. */
54    if (nc_create(testfileNC_CLOBBER, &ncid)) ERR;
55    if (nc_set_fill(ncidNC_NOFILLNULL)) ERR;
56    if (nc_def_dim(ncid, "rec", DIMR, &dimids[0])) ERR;
57    if (nc_def_dim(ncid, "dim1", DIM1, &dimids[1])) ERR;
58    if (nc_def_dim(ncid, "dim2", DIM2, &dimids[2])) ERR;
59    /* if (nc_def_dim(ncid, "dim3", DIM3 - 1, &dimids[1])) ERR; */
60    if (nc_def_dim(ncid, "dim3", DIM3, &dimids[3])) ERR;
61    if (nc_def_var(ncid, "var", NC_BYTENUMDIMSdimids, &varid)) ERR;
62    if (nc_enddef(ncid)) ERR;
63
64    /* Initialize slab of data. */
65    for (i = 0; i < DIM2i++)
66 for (j = 0; j < DIM3j++) {
67     data[i][j] = (i + j) % 16;
68 }
69    /* Just write the first and last slabs */
70    start[1] = 0;
71    if (nc_put_vara_schar(ncidvaridstartcount, &data[0][0])) ERR;
72    start[1] = DIM1 - 1;
73    if (nc_put_vara_schar(ncidvaridstartcount, &data[0][0])) ERR;
74    if (nc_close(ncid)) ERR;
75
76    /* Open the file and check it. */
77    if (nc_open(testfileNC_NOWRITE, &ncid)) ERR;
78    if (nc_inq_varid(ncid, "var", &varid)) ERR;
79    /* Read and check data in the first and last slabs */
80    start[1] = 0;
81    if (nc_get_vara_schar(ncidvaridstartcount, &data[0][0])) ERR;
82    for (i = 0; i < DIM2i++)
83 for (j = 0; j < DIM3j++)
84 {
85     if (data[i][j] != (signed char)((i + j) % 16))
86     {
87 printf("error on start[0]: %d i: %d j: %d expected %d got %d\n",
88        start[0], ij, (i + j) % 16, data[i][j]);
89 ERR;
90 if(nerrs++ > 2)
91   return nerrs;
92     }
93 }
94    start[1] = DIM1 - 1;
95    if (nc_get_vara_schar(ncidvaridstartcount, &data[0][0])) ERR;
96    for (i = 0; i < DIM2i++)
97 for (j = 0; j < DIM3j++)
98 {
99     if (data[i][j] != (signed char)((i + j) % 16))
100     {
101 printf("error on start[0]: %d i: %d j: %d expected %d got %d\n",
102        start[0], ij, (i + j) % 16, data[i][j]);
103 ERR;
104 if(nerrs++ > 2)
105   return nerrs;
106     }
107 }
108    if (nc_close(ncid)) ERR;
109    return 0;
110}
111
112int
113main(int argc, char **argv) {
114    int i;
115    char testfile[NC_MAX_NAME + 1];
116
117    printf("\n*** Testing files with multidimensional variable with more than 2**32 values\n");
118    sprintf(testfile, "%s/%s", TEMP_LARGEFILE_NAME);
119    for (i = NC_FORMAT_CLASSICi <= NUM_FORMATSi++)
120    {
121       printf("*** testing format %d file with record variable with > 2**32 values...", i);
122       nc_set_default_format(iNULL);
123       test_big_var(testfile);
124       (void) remove(testfile);
125       SUMMARIZE_ERR;
126   }
127
128    FINAL_RESULTS;
129}


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