mirror of
https://github.com/Unidata/netcdf-c.git
synced 2024-11-21 03:13:42 +08:00
f1506d552e
* For URL paths, the new approach essentially centralizes all information in the URL into the "#mode=" fragment key and uses that value to determine the dispatcher for (most) URLs. * The new approach has the following steps: 1. canonicalize the path if it is a URL. 2. use the mode= fragment key to determine the dispatcher 3. if dispatcher still not determined, then use the mode flags argument to nc_open/nc_create to determine the dispatcher. 4. if the path points to something readable, attempt to read the magic number at the front, and use that to determine the dispatcher. this case may override all previous cases. * Misc changes. 1. Update documentation 2. Moved some unit tests from libdispatch to unit_test directory. 3. Fixed use of wrong #ifdef macro in test_filter_reg.c [I think this may fix an previously reported esupport query].
147 lines
4.1 KiB
C
147 lines
4.1 KiB
C
/* 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 nclistmgr.c.
|
|
|
|
Ed Hartnett, 8/10/19
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include <nc_tests.h>
|
|
#include "nc.h"
|
|
#include "ncdispatch.h"
|
|
#include "err_macros.h"
|
|
|
|
/* An integer value to use in testing. */
|
|
#define TEST_VAL_42 42
|
|
|
|
#define FILE_NAME "tst_nclist.nc"
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
printf("\n*** Testing netcdf internal NC list functions.\n");
|
|
printf("Testing NC list functions with no open files...");
|
|
{
|
|
/* These are cases where there are no files, or NULL
|
|
* params. */
|
|
if (count_NCList()) ERR;
|
|
free_NCList();
|
|
if (find_in_NCList_by_name("nope")) ERR;
|
|
if (iterate_NCList(0, NULL)) ERR;
|
|
}
|
|
SUMMARIZE_ERR;
|
|
printf("Testing adding to NC list...");
|
|
{
|
|
int ncid;
|
|
NC *ncp, *ncp2;
|
|
int mode = 0;
|
|
int ret;
|
|
|
|
/* Create the NC* instance and insert its dispatcher and model. */
|
|
if ((ret = new_NC(NULL, FILE_NAME, mode, &ncp))) ERR;
|
|
|
|
/* Nothing to find yet. */
|
|
if (find_in_NCList(TEST_VAL_42)) ERR;
|
|
|
|
/* Add to list of known open files and define ext_ncid. To get
|
|
* the ncid, we find the first open index > 1 in the
|
|
* nc_filelist array, which has a size of 65536. Then we
|
|
* left-shift that index 16 bits to put it in the first
|
|
* 2-bytes of the 4-byte ncid. (The other two bytes are
|
|
* reserved for grpid of netCDF-4 groups.) */
|
|
add_to_NCList(ncp);
|
|
|
|
/* These won't work! */
|
|
if (find_in_NCList(TEST_VAL_42)) ERR;
|
|
if (find_in_NCList_by_name("nope")) ERR;
|
|
if ((ret = iterate_NCList(2, &ncp2))) ERR;
|
|
|
|
/* 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;
|
|
|
|
/* Won't do anything because list contains an entry. */
|
|
free_NCList();
|
|
|
|
/* Delete it. */
|
|
ncid = ncp->ext_ncid;
|
|
del_from_NCList(ncp); /* Will free empty list. */
|
|
free_NC(ncp);
|
|
|
|
/* Ensure it is no longer in list. */
|
|
if (find_in_NCList(ncid)) ERR;
|
|
}
|
|
SUMMARIZE_ERR;
|
|
printf("Testing moving in NC list (needed for PIO)...");
|
|
{
|
|
int ncid;
|
|
NC *ncp, *ncp2;
|
|
int mode = 0;
|
|
int ret;
|
|
|
|
/* Create the NC* instance and add it to list. */
|
|
if ((ret = new_NC(NULL, FILE_NAME, mode, &ncp))) ERR;
|
|
add_to_NCList(ncp);
|
|
|
|
/* Find it in the list. */
|
|
if (!(ncp2 = find_in_NCList(ncp->ext_ncid))) ERR;
|
|
|
|
/* Move it. */
|
|
ncid = ncp->ext_ncid;
|
|
if (move_in_NCList(ncp, TEST_VAL_42)) ERR;
|
|
|
|
/* Now we won't find old ncid in the list. */
|
|
if (find_in_NCList(ncid)) ERR;
|
|
|
|
/* Delete it. */
|
|
ncid = ncp->ext_ncid;
|
|
del_from_NCList(ncp); /* Will free empty list. */
|
|
free_NC(ncp);
|
|
|
|
/* Ensure it is no longer in list. */
|
|
if (find_in_NCList(ncid)) ERR;
|
|
}
|
|
SUMMARIZE_ERR;
|
|
#ifdef LARGE_FILE_TESTS
|
|
/* This test is slow, only run it on large file test builds. */
|
|
printf("Testing maxing out NC list...");
|
|
{
|
|
NC *ncp;
|
|
int mode = 0;
|
|
NCmodel model;
|
|
int max_num_nc = 65535;
|
|
int i;
|
|
int ret;
|
|
|
|
/* Fill the NC list. */
|
|
for (i = 0; i < max_num_nc; i++)
|
|
{
|
|
if ((ret = new_NC(NULL, FILE_NAME, mode, &ncp))) ERR;
|
|
if (add_to_NCList(ncp)) ERR;
|
|
}
|
|
|
|
/* Check the count. */
|
|
if (count_NCList() != max_num_nc) ERR;
|
|
|
|
/* Try and add another. It will fail. */
|
|
if (add_to_NCList(ncp) != NC_ENOMEM) ERR;
|
|
|
|
/* Delete them all. */
|
|
for (i = 0; i < max_num_nc; i++)
|
|
{
|
|
if (iterate_NCList(i + 1, &ncp)) ERR;
|
|
if (!ncp) ERR;
|
|
del_from_NCList(ncp);
|
|
free_NC(ncp);
|
|
}
|
|
}
|
|
SUMMARIZE_ERR;
|
|
#endif /* LARGE_FILE_TESTS */
|
|
|
|
FINAL_RESULTS;
|
|
}
|