1/* This is part of the netCDF package.
2   Copyright 2016 University Corporation for Atmospheric Research/Unidata
3   See COPYRIGHT file for conditions of use.
4
5   Based on tst_fillbug.c
6
7   Added in support of https://github.com/Unidata/netcdf-c/issues/239
8
9   The issue in a nutshell is that if _FillValue is added to a file
10   defined without it, previously existing attributes with
11   preexisting variables are wiped out, only the _FillValue attribute
12   exists.
13
14*/
15
16#include <nc_tests.h>
17#include "err_macros.h"
18#include <stdio.h>
19#include <stdlib.h>
20#include <netcdf.h>
21
22#define FILENAME "tst_fill_attr_vanish.nc"
23#define RANK_Time 1
24#define RANK_P 3
25#define LEN 4
26
27#define ATTNAME "TextAttribute"
28#define ATTVAL  "This is a text attribute used for testing."
29
30
31/*! Main function for tst_fill_attr_vanish.c
32 *
33 */
34int main()
35{
36  int nciddimids[RANK_P], time_idp_idtest_id;
37  int ndimsdimids_in[RANK_P];
38
39  int test_data[1] = {1};
40  size_t test_start[1] = {0}, test_count[1] = {1};
41  int test_fill_val[] = {5};
42
43
44  double data[1] = {3.14159};
45  size_t start[1] = {0}, count[1] = {1};
46  float ddata[1][4][3];
47  static float P_data[LEN];
48  size_t cor[RANK_P] = {0, 1, 0};
49  size_t edg[RANK_P] = {1, 1, LEN};
50  float pfills[] = {3};
51
52  printf("\n*** Testing for a netCDF-4 fill-value bug.\n");
53  printf("*** Creating a file with no _FillValue defined. ***\n");
54
55  /* Create a 3D test file. */
56  if (nc_create(FILENAMENC_CLOBBER|NC_NETCDF4, &ncid)) ERR;
57  if (nc_set_fill(ncidNC_NOFILLNULL)) ERR;
58
59  /* define dimensions */
60  if (nc_def_dim(ncid, "Time", NC_UNLIMITED, &dimids[0])) ERR;
61  if (nc_def_dim(ncid, "X", 4, &dimids[2])) ERR;
62  if (nc_def_dim(ncid, "Y", 3, &dimids[1])) ERR;
63
64  /* define variables */
65  if (nc_def_var(ncid, "Time", NC_DOUBLE, 1, dimids, &time_id)) ERR;
66  if (nc_def_var(ncid, "P", NC_FLOATRANK_Pdimids, &p_id)) ERR;
67  if (nc_def_var(ncid, "Test", NC_INT, 1, &dimids[1], &test_id)) ERR;
68
69  /* Add a _FillValue attribute */
70
71  if (nc_put_att_text(ncidtest_idATTNAME, strlen(ATTVAL), ATTVAL)) ERR;
72  /* Add a value to the test variable */
73  if (nc_put_vara(ncidtest_idtest_starttest_counttest_data)) ERR;
74
75  /* Add one record in coordinate variable. */
76  if (nc_put_vara(ncidtime_idstartcountdata)) ERR;
77
78  /* That's it! */
79  if (nc_close(ncid)) ERR;
80
81  /********************************************/
82
83  /* Reopen the file, add a fillvalue attribute. */
84  if (nc_open(FILENAMENC_NOCLOBBER|NC_WRITE, &ncid)) ERR;
85  if (nc_redef(ncid)) ERR;
86  if (nc_inq_varid(ncid, "Test", &test_id)) ERR;
87
88  /* Query existing attribute. */
89  {
90    printf("**** Checking that attribute still exists:\t");
91    char *attval = malloc(sizeof(char) * strlen(ATTVAL));
92    if(nc_get_att_text(ncid,test_id,ATTNAME,attval)) {printf("Fail\n"); ERR;}
93    else {printf("%s\n",attval);}
94    free(attval);
95
96  }
97
98  printf("**** Adding _FillValue attribute.\n");
99  if (nc_put_att_int(ncidtest_id, "_FillValue", NC_INT, 1, test_fill_val)) ERR;
100
101  /* Query existing attribute. */
102  {
103    printf("**** Checking that attribute still exists, pre-write:\t");
104    char *attval = malloc(sizeof(char) * strlen(ATTVAL));
105    if(nc_get_att_text(ncid,test_id,ATTNAME,attval)) {printf("Fail\n"); ERR;}
106    else {printf("%s\n",attval);}
107    free(attval);
108
109  }
110
111  /* Close file again. */
112  printf( "**** Saving, closing file.\n");
113  if (nc_close(ncid)) ERR;
114  /********************************************/
115  printf( "*** Reopening file.\n");
116  /* Reopen the file, checking that all attributes are preserved. */
117  if (nc_open(FILENAMENC_NOCLOBBER|NC_WRITE, &ncid)) ERR;
118  if (nc_redef(ncid)) ERR;
119  if (nc_inq_varid(ncid, "Test", &test_id)) ERR;
120
121  /* Query existing attribute. */
122  {
123    printf("**** Checking that attribute still exists:\t");
124    char *attval = malloc(sizeof(char) * strlen(ATTVAL));
125    if(nc_get_att_text(ncid,test_id,ATTNAME,attval)) {printf("Fail\n"); ERR;}
126    else {printf("%s\n",attval);}
127    free(attval);
128
129  }
130
131  if (nc_close(ncid)) ERR;
132  /********************************************/
133
134  SUMMARIZE_ERR;
135
136  FINAL_RESULTS;
137  return 0;
138}


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