netcdf-c/ncdap_test/test_varm3.c
Dennis Heimbigner 245961de00 re: github issues
https://github.com/Unidata/netcdf-c/issues/1168
    https://github.com/Unidata/netcdf-c/issues/1163
    https://github.com/Unidata/netcdf-c/issues/1162

This PR partially fixes memory leaks in the netcdf-c library,
in the ncdump utility, and in some test cases.

The netcdf-c library now runs memory clean with the assumption
that the --disable-utilities option is used. The primary remaining
problem is ncgen. Once that is fixed, I believe the netcdf-c library
will run memory clean with no limitations.

Notes
-----------
1. Memory checking was performed using gcc -fsanitize=address.
   Valgrind-based testing has yet to be performed.
2. The pnetcdf, hdf4, and examples code has not been tested.

Misc. Non-leak changes
1. Make tst_diskless2 only run when netcdf4 is enabled (issue 1162)
2. Fix CmakeLists.txt to turn off logging if ENABLE_NETCDF_4 is OFF
3. Isolated all my debug scripts into a single top-level directory
   called debug
4. Fix some USE_NETCDF4 dependencies in nc_test and nc_test4 Makefile.am
2018-10-30 20:48:12 -06:00

260 lines
6.4 KiB
C

/* varm_test */
/* acm 9/15/09 */
/* ansley.b.manke@noaa.gov */
/* test nc_get_varm_float with calls similar to Ferret calls */
/* local file is correct results with stride: every second value */
/* remote url; incorrect results with stride
linked with:
cc varm_test.c -g -o varm_test /home/nstout/ansley/local/lib/libnetcdf.a -L/usr/lib64 -lc -lm -lcurl
netcdf.a from the daily snapshot
netcdf-4.1-beta2-snapshot2009091100
TODO: Note that this test uses thredds server
*/
/* This particular test seems to occasionally expose a server error*/
#include <config.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "netcdf.h"
#include "ncdispatch.h"
#include "nctestserver.h"
#undef STANDALONE
#undef DEBUG
#define TESTPATH "/dodsC/testdods/coads_climatology.nc"
#define VAR "SST"
static float expected_stride1[12] = {
29.430857,
29.403780,
29.325428,
29.578333,
29.660833,
29.378437,
29.151943,
29.109715,
29.114864,
29.550285,
29.542500,
29.500286
};
static float expected_stride2[6] = {
29.430857,
29.325428,
29.660833,
29.151943,
29.114864,
29.542500
};
static float expected_stride3[3] = {
29.430857,
29.378437,
29.542500
};
void
check(int status, char* file, int line)
{
if(status == 0) return;
fprintf(stderr,"error: %s at %s:%d\n",nc_strerror(status),file,line);
exit(1);
}
int
main()
{
int ncid;
int varid;
int i,fail;
int err;
size_t start[5], count[5];
ptrdiff_t stride[5], imap[5];
int idim;
float dat[20];
char url[4096];
char* svc;
#ifdef STANDALONE
int ndim;
#endif
#ifdef DEBUG
oc_loginit();
oc_setlogging(1);
oc_logopen(NULL);
#endif
/* Find Test Server */
svc = nc_findtestserver("thredds",0,REMOTETESTSERVERS);
if(svc == NULL) {
fprintf(stderr,"Cannot locate test server\n");
exit(0);
}
strncpy(url,svc,sizeof(url));
strlcat(url,TESTPATH,sizeof(url));
printf("*** Test: varm on URL: %s\n",url);
free(svc);
check(err = nc_open(url, NC_NOWRITE, &ncid),__FILE__,__LINE__);
check(err = nc_inq_varid(ncid, VAR, &varid),__FILE__,__LINE__);
for (idim=0; idim<4; idim++) {
start[idim] = 0;
count[idim] = 1;
stride[idim] = 1;
imap[idim] = 1;
}
#ifdef STANDALONE
ndim=3;
#endif
printf("*** Testing: stride case 1\n");
start[1] = 44;
start[2] = 66;
count[0] = 12;
#ifdef STANDALONE
printf("start = ");
for(i=0;i<ndim;i++) printf(" %d",(int)start[i]);
printf("\n");
printf("count = ");
for(i=0;i<ndim;i++) printf(" %d",(int)count[i]);
printf("\n");
printf("stride = ");
for(i=0;i<ndim;i++) printf(" %d",(int)stride[i]);
printf("\n");
printf("map = ");
for(i=0;i<ndim;i++) printf(" %d",(int)imap[i]);
printf("\n");
err = nc_get_vars_float (ncid, varid, start, count, stride,
(float*) dat);
printf("vars: %s =",VAR);
for(i=0;i<12;i++) printf(" %f",dat[i]);
printf("\n");
#endif
check(err = nc_get_varm_float (ncid, varid, start, count, stride, imap,(float*) dat),__FILE__,__LINE__);
/* check(err = nc_get_vara_float (ncid, varid, start, count, (float*) dat),__FILE__,__LINE__); */
#ifdef STANDALONE
printf("varm: %s =",VAR);
for(i=0;i<12;i++) printf(" %f",dat[i]);
printf("\n");
#endif
fail=0;
for(i=0;i<12;i++) {
float delta = (dat[i] - expected_stride1[i]);
if(delta > 0.0005 || delta < -0.0005) {
fprintf(stderr,"*** Failure: unexpected value: delta=%g dat[%d]=%g expected[%d]=%g\n",
delta, i, dat[i], i, expected_stride1[i]);
fail = 1;
}
}
printf("*** %s: stride case 1\n",(fail?"Fail":"Pass"));
printf("*** Testing: stride case 2\n");
/* case with strides #1 where len % stride == 0 */
start[1] = 44;
start[2] = 66;
count[0] = 6;
stride[0] = 2;
#ifdef STANDALONE
printf("start = ");
for(i=0;i<ndim;i++) printf(" %d",(int)start[i]);
printf("\n");
printf("count = ");
for(i=0;i<ndim;i++) printf(" %d",(int)count[i]);
printf("\n");
printf("stride = ");
for(i=0;i<ndim;i++) printf(" %d",(int)stride[i]);
printf("\n");
printf("map = ");
for(i=0;i<ndim;i++) printf(" %d",(int)imap[i]);
printf("\n");
check(err = nc_get_vars_float(ncid, varid, start, count, stride,
(float*) dat),__FILE__,__LINE__);
printf("strided.vars: %s =",VAR);
for(i=0;i<6;i++) printf(" %f",dat[i]);
printf("\n");
#endif
check(err = nc_get_varm_float(ncid, varid, start, count, stride, imap,
(float*) dat),__FILE__,__LINE__);
#ifdef STANDALONE
printf("strided.varm: %s =",VAR);
for(i=0;i<6;i++) printf(" %f",dat[i]);
printf("\n");
#endif
fail=0;
for(i=0;i<6;i++) {
float delta = (dat[i] - expected_stride2[i]);
if(delta > 0.0005 || delta < -0.0005) {
fprintf(stderr,"*** Failure: unexpected value: delta=%g dat[%d]=%g expected[%d]=%g\n",
delta, i, dat[i], i, expected_stride2[i]);
fail=1;
}
}
printf("*** %s: stride case 2\n",(fail?"Fail":"Pass"));
/* case with strides #2: len % stride != 0 */
printf("*** Testing: stride case 3\n");
start[1] = 44;
start[2] = 66;
count[0] = 3;
stride[0] = 5;
#ifdef STANDALONE
printf("start = ");
for(i=0;i<ndim;i++) printf(" %d",(int)start[i]);
printf("\n");
printf("count = ");
for(i=0;i<ndim;i++) printf(" %d",(int)count[i]);
printf("\n");
printf("stride = ");
for(i=0;i<ndim;i++) printf(" %d",(int)stride[i]);
printf("\n");
printf("map = ");
for(i=0;i<ndim;i++) printf(" %d",(int)imap[i]);
printf("\n");
check(err = nc_get_vars_float(ncid, varid, start, count, stride,
(float*) dat),__FILE__,__LINE__);
printf("strided.vars: %s =",VAR);
for(i=0;i<3;i++) printf(" %f",dat[i]);
printf("\n");
#endif
check(err = nc_get_varm_float(ncid, varid, start, count, stride, imap,
(float*) dat),__FILE__,__LINE__);
#ifdef STANDALONE
printf("strided.varm: %s =",VAR);
for(i=0;i<3;i++) printf(" %f",dat[i]);
printf("\n");
#endif
fail=0;
for(i=0;i<3;i++) {
float delta = (dat[i] - expected_stride3[i]);
if(delta > 0.0005 || delta < -0.0005) {
fprintf(stderr,"*** Failure: stride case 2: unexpected value: delta=%g dat[%d]=%g expected[%d]=%g\n",
delta, i, dat[i], i, expected_stride3[i]);
fail=1;
}
}
printf("*** %s: stride case 3\n",(fail?"Fail":"Pass"));
nc_close(ncid);
return fail;
}