1/* This is part of the netCDF package. Copyright 2008 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
6/*
7Test _NCProperties and other special attributes
8*/
9
10#include "config.h"
11#ifdef HAVE_UNISTD_H
12#include "unistd.h"
13#endif
14
15#include <hdf5.h>
16#include "nc_tests.h"
17#include "err_macros.h"
18#include "netcdf.h"
19#include "nc4internal.h"
20
21#define NC4FILE "nc4_fileinfo.nc"
22#define HDFFILE "hdf5_fileinfo.hdf"
23#define INT_ATT_NAME "int_attr"
24#define INT_VAR_NAME "int_var"
25#define GROUPNAME "subgroup"
26#define DIMNAME "time"
27
28int
29main(int argc, char **argv)
30{
31    printf("\n*** Testing 'Fileinfo attributes.\n");
32
33    {
34 hid_t fileid;
35 hid_t fcplid;
36 hid_t scalar_spaceid;
37
38        printf("*** creating test file using HDF5 directly %s...", HDFFILE);
39
40        /* Create scalar dataspace */
41        if((scalar_spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
42
43        /* Set creation ordering for file, so we can revise its contents later */
44        if((fcplid = H5Pcreate(H5P_FILE_CREATE)) < 0) ERR;
45        if(H5Pset_link_creation_order(fcplidH5P_CRT_ORDER_TRACKED) < 0) ERR;
46        if(H5Pset_attr_creation_order(fcplidH5P_CRT_ORDER_TRACKED) < 0) ERR;
47
48        /* Create new file, using default properties */
49        if((fileid = H5Fcreate(HDFFILEH5F_ACC_TRUNCfcplidH5P_DEFAULT)) < 0) ERR;
50        /* Close file creation property list */
51        if(H5Pclose(fcplid) < 0) ERR;
52
53        /* Add attributes to root group */
54        {
55            hid_t scalar_spaceid = -1;
56            hid_t attid = -1;
57
58            /* Create scalar dataspace */
59            if((scalar_spaceid = H5Screate(H5S_SCALAR)) < 0) ERR;
60
61            /* Create attribute with native integer datatype on object */
62            if((attid = H5Acreate2(fileidINT_ATT_NAMEH5T_NATIVE_INTscalar_spaceidH5P_DEFAULTH5P_DEFAULT)) < 0) ERR;
63            if(H5Aclose(attid) < 0) ERR;
64
65            /* Clean up objects created */
66            if(H5Sclose(scalar_spaceid) < 0) ERR;
67        }
68
69        /* Close rest */
70        if(H5Sclose(scalar_spaceid) < 0) ERR;
71        if(H5Fclose(fileid) < 0) ERR;
72    }
73
74    {
75 int rootgrpidvaridstatnattsid;
76 int data = 17;
77 const char* sdata = "text";
78 char ncprops[8192];
79 size_t len;
80 int dimid;
81        nc_type xtype;
82 char name[NC_MAX_NAME];
83
84        printf("\n*** creating netcdf-4 test file using netCDF %s...", NC4FILE);
85
86 if(nc_create(NC4FILE,NC_WRITE|NC_CLOBBER|NC_NETCDF4,&root)!=0) ERR;
87 /* Create global attribute */
88 if(nc_put_att_int(root,NC_GLOBAL,INT_ATT_NAME,NC_INT,1,&data)!=0) ERR;
89 /* Create global variable */
90 if(nc_def_var(root,INT_VAR_NAME,NC_INT,0,NULL,&varid)!=0) ERR;
91 /* Create attribute on var */
92 if(nc_put_att_int(root,varid,INT_ATT_NAME,NC_INT,1,&data)!=0) ERR;
93 /* Create global subgroup */
94 if(nc_def_grp(root,GROUPNAME,&grpid)!=0) ERR;
95 /* Create global attribute in the group */
96 if(nc_put_att_int(grpid,NC_GLOBAL,INT_ATT_NAME,NC_INT,1,&data)!=0) ERR;
97 /* Create _NCProperties as var attr and as subgroup attribute */
98 if(nc_put_att_text(grpid,NC_GLOBAL,NCPROPS,strlen(sdata),sdata)!=0) ERR;
99 if(nc_put_att_text(root,varid,NCPROPS,strlen(sdata),sdata)!=0) ERR;
100 /* Create var + dimension to cause e.g. dimscales to appear */
101 if(nc_def_dim(root,DIMNAME,(size_t)4,&dimid)!=0) ERR;
102 if(nc_def_var(root,DIMNAME,NC_INT,1,&dimid,&varid)!=0) ERR; /* same name */
103 /* Close, then re-open */
104 if(nc_close(root)) ERR;
105 if(nc_open(NC4FILE,NC_WRITE|NC_NETCDF4,&root)!=0) ERR;
106
107 /* Is all invisible attributes actually invisible vis-a-vis nc_inq? */
108        if(nc_inq(root,NULL,NULL,&natts,NULL)!=0) ERR;
109 if(natts != 1) ERR;
110
111 /* Now, fiddle with the NCPROPS attribute */
112
113 /* Get its metadata */
114 if(nc_inq_att(root,NC_GLOBAL,NCPROPS,&xtype,&len)!=0) ERR;
115 if(xtype != NC_CHARERR;
116
117 /* Read in two ways */
118 if(nc_get_att_text(root,NC_GLOBAL,NCPROPS,ncprops)!=0) ERR;
119 if(strlen(ncprops) != lenERR;
120
121 /* Attempt to get attribute metadata piecemeal; some will fail */
122 id = -1;
123 stat = nc_inq_attid(root,NC_GLOBAL,NCPROPS,&id);
124 if(stat == NC_NOERRERR;
125 stat = nc_inq_attname(root,NC_GLOBAL,id,name);
126 if(stat == NC_NOERRERR;
127 if(nc_inq_atttype(root,NC_GLOBAL,NCPROPS,&xtype)!=0) ERR;
128 if(xtype != NC_CHARERR;
129 if(nc_inq_attlen(root,NC_GLOBAL,NCPROPS,&len)!=0) ERR;
130 if(len != strlen(ncprops)) ERR;
131
132 /*Overwrite _NCProperties root attribute; should fail */
133 stat = nc_put_att_text(root,NC_GLOBAL,NCPROPS,strlen(sdata),sdata);
134 if(stat == NC_NOERRERR;
135
136 /* Delete; should fail */
137 stat = nc_del_att(root,NC_GLOBAL,NCPROPS);
138        if(stat != NC_ENOTATTERR;
139
140 /* Ditto _SuperblockVersion */
141
142 /* Get its metadata */
143 if(nc_inq_att(root,NC_GLOBAL,SUPERBLOCKATT,&xtype,&len)!=0) ERR;
144 if(xtype != NC_INTERR;
145 if(len != 1) ERR;
146
147 if(nc_get_att_int(root,NC_GLOBAL,SUPERBLOCKATT,&data)!=0) ERR;
148
149 /* Attempt to get attribute metadata piecemeal */
150 stat = nc_inq_attid(root,NC_GLOBAL,SUPERBLOCKATT,&id);
151 if(stat == NC_NOERRERR;
152 stat = nc_inq_attname(root,NC_GLOBAL,id,name);
153 if(stat == NC_NOERRERR;
154 if(nc_inq_atttype(root,NC_GLOBAL,SUPERBLOCKATT,&xtype)!=0) ERR;
155 if(xtype != NC_INTERR;
156 if(nc_inq_attlen(root,NC_GLOBAL,SUPERBLOCKATT,&len)!=0) ERR;
157 if(len != 1) ERR;
158
159 /*Overwrite; should fail */
160 stat = nc_put_att_int(root,NC_GLOBAL,NCPROPS,NC_INT,1,&data);
161 if(stat == NC_NOERRERR;
162
163 /* Delete; should fail */
164 stat = nc_del_att(root,NC_GLOBAL,SUPERBLOCKATT);
165        if(stat == NC_NOERRERR;
166
167 /* Ditto _IsNetcdf4 */
168
169 /* Get its metadata */
170 if(nc_inq_att(root,NC_GLOBAL,ISNETCDF4ATT,&xtype,&len)!=0) ERR;
171 if(xtype != NC_INTERR;
172 if(len != 1) ERR;
173
174 if(nc_get_att_int(root,NC_GLOBAL,ISNETCDF4ATT,&data)!=0) ERR;
175
176 /* Attempt to get attribute metadata piecemeal */
177 stat = nc_inq_attid(root,NC_GLOBAL,ISNETCDF4ATT,&id);
178 if(stat == NC_NOERRERR;
179 stat = nc_inq_attname(root,NC_GLOBAL,id,name);
180 if(stat == NC_NOERRERR;
181 if(nc_inq_atttype(root,NC_GLOBAL,ISNETCDF4ATT,&xtype)!=0) ERR;
182 if(xtype != NC_INTERR;
183 if(nc_inq_attlen(root,NC_GLOBAL,ISNETCDF4ATT,&len)!=0) ERR;
184 if(len != 1) ERR;
185
186 /*Overwrite; should fail */
187 stat = nc_put_att_int(root,NC_GLOBAL,ISNETCDF4ATT,NC_INT,1,&data);
188 if(stat == NC_NOERRERR;
189
190 /* Delete; should fail */
191 stat = nc_del_att(root,NC_GLOBAL,ISNETCDF4ATT);
192        if(stat == NC_NOERRERR;
193
194 if(nc_close(root)!=0) ERR;
195    }
196
197    SUMMARIZE_ERR;
198    FINAL_RESULTS;
199}


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