more unit tests, this time for nc4internal.c

This commit is contained in:
edwardhartnett 2019-08-21 04:46:00 -06:00
parent fb371d3c3e
commit e4ef7b1a65
6 changed files with 129 additions and 10 deletions

View File

@ -341,6 +341,7 @@ int nc4_file_list_add(int ncid, const char *path, int mode,
int nc4_file_list_get(int ncid, char **path, int *mode, int nc4_file_list_get(int ncid, char **path, int *mode,
void **dispatchdata); void **dispatchdata);
int nc4_file_list_del(int ncid); int nc4_file_list_del(int ncid);
int nc4_file_change_ncid(int ncid, int new_ncid);
int nc4_var_list_add(NC_GRP_INFO_T* grp, const char* name, int ndims, int nc4_var_list_add(NC_GRP_INFO_T* grp, const char* name, int ndims,
NC_VAR_INFO_T **var); NC_VAR_INFO_T **var);
int nc4_var_list_add2(NC_GRP_INFO_T* grp, const char* name, int nc4_var_list_add2(NC_GRP_INFO_T* grp, const char* name,

View File

@ -68,10 +68,11 @@ free_NC(NC *ncp)
/** /**
* Create and initialize a new NC struct. The ncid is assigned later. * Create and initialize a new NC struct. The ncid is assigned later.
* *
* @param dispatcher * @param dispatcher An pointer to the NC_Dispatch table that should
* be used by this NC.
* @param path The name of the file. * @param path The name of the file.
* @param mode The open or create mode. * @param mode The open or create mode.
* @param model * @param model An NCmodel instance, provided by NC_infermodel().
* @param ncpp A pointer that gets a pointer to the newlly allocacted * @param ncpp A pointer that gets a pointer to the newlly allocacted
* and initialized NC struct. * and initialized NC struct.
* *

View File

@ -89,7 +89,7 @@ nc4_check_name(const char *name, char *norm_name)
* nc4_nc4f_list_add(), except it takes an ncid instead of an NC *, * nc4_nc4f_list_add(), except it takes an ncid instead of an NC *,
* and also passes back the dispatchdata pointer. * and also passes back the dispatchdata pointer.
* *
* @param ncid The ncid of the file (aka ext_ncid). * @param ncid The (already-assigned) ncid of the file (aka ext_ncid).
* @param path The file name of the new file. * @param path The file name of the new file.
* @param mode The mode flag. * @param mode The mode flag.
* @param dispatchdata Void * that gets pointer to dispatch data, * @param dispatchdata Void * that gets pointer to dispatch data,
@ -125,6 +125,31 @@ nc4_file_list_add(int ncid, const char *path, int mode, void **dispatchdata)
return NC_NOERR; return NC_NOERR;
} }
/**
* @internal Change the ncid of an open file. This is needed for PIO
* integration.
*
* @param ncid The ncid of the file (aka ext_ncid).
* @param new_ncid The new ncid to use.
*
* @return ::NC_NOERR No error.
* @return ::NC_EBADID No NC struct with this ext_ncid.
* @return ::NC_ENOMEM Out of memory.
* @author Ed Hartnett
*/
int
nc4_file_change_ncid(int ncid, int new_ncid)
{
NC *nc;
int ret;
/* Find NC pointer for this file. */
if ((ret = NC_check_id(ncid, &nc)))
return ret;
return NC_NOERR;
}
/** /**
* @internal Get info about a file on the list of libsrc4 open files. This is * @internal Get info about a file on the list of libsrc4 open files. This is
* used by dispatch layers that wish to use the libsrc4 metadata * used by dispatch layers that wish to use the libsrc4 metadata

View File

@ -14,8 +14,8 @@ include $(top_srcdir)/lib_flags.am
# Find and link to the netcdf-c library. # Find and link to the netcdf-c library.
LDADD = ${top_builddir}/liblib/libnetcdf.la LDADD = ${top_builddir}/liblib/libnetcdf.la
check_PROGRAMS = tst_nclist check_PROGRAMS = tst_nclist tst_nc4internal
TESTS = tst_nclist TESTS = tst_nclist tst_nc4internal
# If valgrind is present, add valgrind targets. # If valgrind is present, add valgrind targets.
@VALGRIND_CHECK_RULES@ @VALGRIND_CHECK_RULES@

View File

@ -0,0 +1,90 @@
/* This is part of the netCDF package. Copyright 2005-2019 University
Corporation for Atmospheric Research/Unidata. See COPYRIGHT file
for conditions of use.
Test list functions in nc4internal.c.
Ed Hartnett, 8/21/19
*/
#include "config.h"
#include <nc_tests.h>
#include "nc.h"
#include "nc4internal.h"
#include "ncdispatch.h"
#include "err_macros.h"
/* An integer value to use in testing. */
#define TEST_VAL_42 42
#define FILE_NAME "tst_nc4internal.nc"
int
main(int argc, char **argv)
{
printf("\n*** Testing netcdf nc4internal functions.\n");
printf("Testing adding new file to nc4internal file lists...");
{
NC *ncp;
NCmodel model;
/* This won't work because there is no NC in the NC list which
* has an ncid of TEST_VAL_42. */
if (nc4_file_list_add(TEST_VAL_42, FILE_NAME, 0, NULL) != NC_EBADID) ERR;
/* Create the NC* instance and insert its dispatcher and
* model. The NC3_dispatch_table is defined in
* ncdispatch.h. */
if(new_NC(NC3_dispatch_table, FILE_NAME, 0, &model, &ncp)) ERR;
/* Add to list of known open files and define ext_ncid. */
add_to_NCList(ncp);
/* Create the NC_FILE_INFO_T instance associated empty lists
* to hold dims, types, groups, and the root group. */
if (nc4_file_list_add(ncp->ext_ncid, FILE_NAME, 0, NULL)) ERR;
/* Delete the NC_FILE_INFO_T and related storage. */
if (nc4_file_list_del(ncp->ext_ncid)) ERR;
/* Delete the ncp from the list. (In fact, just null out its
* entry in the array of file slots. */
del_from_NCList(ncp); /* Will free empty list. */
/* Now free the NC struct. */
free_NC(ncp);
}
SUMMARIZE_ERR;
/* printf("Testing changing ncid..."); */
/* { */
/* NC *ncp, *ncp2; */
/* int mode = 0; */
/* NCmodel model; */
/* int ret; */
/* /\* Create the NC* instance and insert its dispatcher and model. *\/ */
/* if ((ret = new_NC(NULL, FILE_NAME, mode, &model, &ncp))) ERR; */
/* /\* Add to list of known open files and define ext_ncid. *\/ */
/* add_to_NCList(ncp); */
/* /\* Find it in the list. *\/ */
/* if (!(ncp2 = find_in_NCList(ncp->ext_ncid))) ERR; */
/* if (!(ncp2 = find_in_NCList_by_name(FILE_NAME))) ERR; */
/* if ((ret = iterate_NCList(1, &ncp2))) ERR; */
/* if (count_NCList() != 1) ERR; */
/* /\* Change the ncid. *\/ */
/* if (nc4_file_change_ncid(ncp->ext_ncid, TEST_VAL_42)) ERR; */
/* /\* Delete it. *\/ */
/* del_from_NCList(ncp); /\* Will free empty list. *\/ */
/* free_NC(ncp); */
/* /\* Ensure it is no longer in list. *\/ */
/* /\* if (find_in_NCList(ncp->ext_ncid)) ERR; *\/ */
/* } */
/* SUMMARIZE_ERR; */
FINAL_RESULTS;
}

View File

@ -16,6 +16,8 @@
/* An integer value to use in testing. */ /* An integer value to use in testing. */
#define TEST_VAL_42 42 #define TEST_VAL_42 42
#define FILE_NAME "tst_nclist.nc"
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
@ -36,11 +38,10 @@ main(int argc, char **argv)
NC *ncp, *ncp2; NC *ncp, *ncp2;
int mode = 0; int mode = 0;
NCmodel model; NCmodel model;
char path[] = {"file.nc"};
int ret; int ret;
/* Create the NC* instance and insert its dispatcher and model. */ /* Create the NC* instance and insert its dispatcher and model. */
if ((ret = new_NC(NULL, path, mode, &model, &ncp))) ERR; if ((ret = new_NC(NULL, FILE_NAME, mode, &model, &ncp))) ERR;
/* Nothing to find yet. */ /* Nothing to find yet. */
if (find_in_NCList(TEST_VAL_42)) ERR; if (find_in_NCList(TEST_VAL_42)) ERR;
@ -55,7 +56,7 @@ main(int argc, char **argv)
/* Find it in the list. */ /* Find it in the list. */
if (!(ncp2 = find_in_NCList(ncp->ext_ncid))) ERR; if (!(ncp2 = find_in_NCList(ncp->ext_ncid))) ERR;
if (!(ncp2 = find_in_NCList_by_name(path))) ERR; if (!(ncp2 = find_in_NCList_by_name(FILE_NAME))) ERR;
if ((ret = iterate_NCList(1, &ncp2))) ERR; if ((ret = iterate_NCList(1, &ncp2))) ERR;
if (count_NCList() != 1) ERR; if (count_NCList() != 1) ERR;
@ -66,6 +67,8 @@ main(int argc, char **argv)
ncid = ncp->ext_ncid; ncid = ncp->ext_ncid;
del_from_NCList(ncp); /* Will free empty list. */ del_from_NCList(ncp); /* Will free empty list. */
free_NC(ncp); free_NC(ncp);
/* Ensure it is no longer in list. */
if (find_in_NCList(ncid)) ERR; if (find_in_NCList(ncid)) ERR;
} }
SUMMARIZE_ERR; SUMMARIZE_ERR;
@ -76,7 +79,6 @@ main(int argc, char **argv)
NC *ncp; NC *ncp;
int mode = 0; int mode = 0;
NCmodel model; NCmodel model;
char path[] = {"file.nc"};
int max_num_nc = 65535; int max_num_nc = 65535;
int i; int i;
int ret; int ret;
@ -84,7 +86,7 @@ main(int argc, char **argv)
/* Fill the NC list. */ /* Fill the NC list. */
for (i = 0; i < max_num_nc; i++) for (i = 0; i < max_num_nc; i++)
{ {
if ((ret = new_NC(NULL, path, mode, &model, &ncp))) ERR; if ((ret = new_NC(NULL, FILE_NAME, mode, &model, &ncp))) ERR;
if (add_to_NCList(ncp)) ERR; if (add_to_NCList(ncp)) ERR;
} }