hdf5/test/tfile.c
Robb Matzke 9bfbfbc9a0 [svn-r291] Changes since 19980206
----------------------

./configure.in
./src/H5Fprivate.h
./src/H5Fsec2.c
	We now detect and use lseek64() on systems that have it (e.g.,
	Irix64) and are able to generate >2GB files on Irix XFS file
	systems (and anything else that supports large files).  This
	change also removed some warning messages from the Irix `-64'
	compiler.

	> $ ls -l istore.h5
	> -rw-r--r--    1 matzke   meshtv   8605436856 Feb 17 14:03 istore.h5

./configure.in
./src/H5Fprivate.h
./src/H5Fstdio.h
	We now detect and use fseek64() on systems that have it (e.g.,
	Irix64) and are able to generate >2GB files on Irix XFS file
	systems (and anything else that supports large files).  This
	change also removed some warning messages from the Iris `-64'
	compiler.

./src/H5E.c
./src/H5Epublic.h
	Added the H5E_OVERFLOW error to signal file address overflow.

./src/H5Fpublic.h
./examples/h5_chunk_read.c
./examples/h5_compound.c
./examples/h5_extend_write.c
./examples/h5_group.c
./examples/h5_read.c
./examples/h5_write.c
./html/Datasets.html
./html/Files.html
./html/H5.api.html
./html/H5.intro.html
./html/H5.sample_code.html
./html/ph5example.c
./html/review1.html
./test/cmpd_dset.c
./test/dsets.c
./test/extend.c
./test/tfile.c
./test/th5p.c
./test/theap.c
./test/tohdr.c
./test/tstab.c
./testpar/phdf5.c
	Renamed file access constants to follow the naming scheme.
	Also changed the base names a little to be more accurate as to
	what they do.  The old names H5ACC_WRITE and H5ACC_OVERWRITE
	will temporarily work.

	     H5ACC_DEFAULT     --> H5F_ACC_RDONLY for H5Fopen()
	     H5ACC_DEFAULT     --> H5F_ACC_EXCL   for H5Fcreate()
	     H5ACC_WRITE       --> H5F_ACC_RDWR
	     H5ACC_OVERWRITE   --> H5F_ACC_TRUNC

	Albert or Kim: The H5ACC_INDEPENDENT and H5ACC_COLLECTIVE
	macros in H5Fpublic.h should be an enum typedef and have names
	more like H5F_MPIO_INDEPENDENT and H5F_MPIO_COLLECTIVE.  Also
	change the access_mode argument of H5Cset_mpio().

	H5Fcreate() and H5Fopen() are more strict now about which
	flags are acceptable for the operation.

./src/H5Fprivate.h
./src/H5F.c
./src/H5C.c
	Changed the file access template to make it more general.  A
	union contains a struct for each type of low-level driver and
	the default template is initialized at run-time.

./src/H5Fpublic.h
./src/H5F.c
	Added H5Fget_access_template() and cleaned up
	H5Fget_create_template().

./src/H5C.c
	The H5Cset_mpi() no longer trashes the file access template
	when an error is detected.  We check for errors and *then*
	update the file access template.

	Added H5C_close() so Albert and Kim have a place to release
	the MPI communicator and info from the file access property
	list.

	Kim or Albert: I notice in H5Cset_mpi() you copy the MPI
	communicator.  Do you need to do something similar in
	H5C_copy()?

./src/H5F.c
	Added more error checking for the file creation and access
	property lists because it used to be possible to make the
	library dump core by swapping the creation and access property
	list ID numbers of H5Fcreate().

./test/istore.c
./test/tfile.c
./test/th5p.c
./test/theap.c
./test/tohdr.c
./test/tstab.c
./testpar/testphdf5.c
	One must pass H5C_DEFAULT as the file creation or access
	property list in order to get the default property list.  It
	is no longer possible to pass zero or any other arbitrary bad
	object ID.

./src/H5Fcore.c
./src/H5Ffamly.c
./src/H5Flow.c
./src/H5Fmpio.c
./src/H5Fsec2.c
./src/H5Fsplit.c
./src/H5Fstdio.c
./src/H5MF.c
	The file access property list is passed to all H5F_low_...()
	functions and to the drivers.

./src/H5Fcore.c
	The block size can be set at run time on a per-file basis
	instead of at compile time across all files. The "5000 items in
	a group test" now takes 1.6 seconds.

./src/H5private.h
	Removed inclusion of mpi.h and mpio.h since they're included
	from H5public.h.

./src/H5Cpublic.h
./src/H5C.c
	Added H5Cset_stdio(), H5Cset_sec2(), H5Cset_core(),
	H5Cset_split(), and H5Cset_family() in addition to the
	H5Cset_mpio() that Kim and Albert already wrote.  We still
	need the H5Cget_driver() and an H5Cget...() counterpart for
	each of those functions.  The split and family drivers still
	need a little work but I'm checking this in anyway.
1998-02-19 13:26:49 -05:00

277 lines
9.2 KiB
C

/****************************************************************************
* NCSA HDF *
* Software Development Group *
* National Center for Supercomputing Applications *
* University of Illinois at Urbana-Champaign *
* 605 E. Springfield, Champaign IL 61820 *
* *
* For conditions of distribution and use, see the accompanying *
* hdf/COPYING file. *
* *
****************************************************************************/
#ifdef RCSID
static char RcsId[] = "$Revision$";
#endif
/* $Id$ */
/***********************************************************
*
* Test program: tfile
*
* Test the low-level file I/O features.
*
*************************************************************/
#include <testhdf5.h>
#include <H5private.h>
#include <H5Bprivate.h>
#include <H5Cprivate.h>
#include <H5Mprivate.h>
#define F1_USERBLOCK_SIZE 0
#define F1_OFFSET_SIZE 4
#define F1_LENGTH_SIZE 4
#define F1_SYM_LEAF_K 4
#define F1_SYM_INTERN_K 16
#define FILE1 "tfile1.h5"
#define F2_USERBLOCK_SIZE 512
#define F2_OFFSET_SIZE 8
#define F2_LENGTH_SIZE 8
#define F2_SYM_LEAF_K 8
#define F2_SYM_INTERN_K 32
#define FILE2 "tfile2.h5"
#define F3_USERBLOCK_SIZE 0
#define F3_OFFSET_SIZE F2_OFFSET_SIZE
#define F3_LENGTH_SIZE F2_LENGTH_SIZE
#define F3_SYM_LEAF_K F2_SYM_LEAF_K
#define F3_SYM_INTERN_K F2_SYM_INTERN_K
#define FILE3 "tfile3.h5"
/****************************************************************
**
** test_file_create(): Low-level file creation I/O test routine.
**
****************************************************************/
static void
test_file_create(void)
{
hid_t fid1, fid2, fid3; /* HDF5 File IDs */
hid_t tmpl1, tmpl2; /* File creation templates */
size_t parm; /* File-creation parameters */
size_t parm2; /* File-creation parameters */
int iparm, iparm2;
herr_t ret; /* Generic return value */
/* Output message about test being performed */
MESSAGE(5, ("Testing Low-Level File Creation I/O\n"));
/* Create first file */
fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5C_DEFAULT, H5C_DEFAULT);
CHECK(fid1, FAIL, "H5Fcreate");
/* Try to create first file again (should fail) */
fid2 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5C_DEFAULT, H5C_DEFAULT);
VERIFY(fid2, FAIL, "H5Fcreate");
/* Get the file-creation template */
tmpl1 = H5Fget_create_template(fid1);
CHECK(tmpl1, FAIL, "H5Fget_create_template");
/* Get the file-creation parameters */
ret = H5Cget_userblock(tmpl1, &parm);
CHECK(ret, FAIL, "H5Cget_userblock");
VERIFY(parm, F1_USERBLOCK_SIZE, "H5Cget_userblock");
ret = H5Cget_sizes(tmpl1, &parm, &parm2);
CHECK(ret, FAIL, "H5Cget_sizes");
VERIFY(parm, F1_OFFSET_SIZE, "H5Cget_sizes");
VERIFY(parm2, F1_LENGTH_SIZE, "H5Cget_sizes");
ret = H5Cget_sym_k(tmpl1, &iparm, &iparm2);
CHECK(ret, FAIL, "H5Cget_sym_k");
VERIFY(iparm, F1_SYM_INTERN_K, "H5Cget_sym_k");
VERIFY(iparm2, F1_SYM_LEAF_K, "H5Cget_sym_k");
/* Release file-creation template */
ret = H5Mclose(tmpl1);
CHECK(ret, FAIL, "H5Mrelease");
#ifdef LATER
/* Double-check that the atom has been vaporized */
ret = H5Mclose(tmpl1);
VERIFY(ret, FAIL, "H5Mrelease");
#endif
/* Create a new file with a non-standard file-creation template */
tmpl1 = H5Ccreate(H5C_FILE_CREATE);
CHECK(tmpl1, FAIL, "H5Cnew");
/* Set the new file-creation parameters */
ret = H5Cset_userblock(tmpl1, F2_USERBLOCK_SIZE);
CHECK(ret, FAIL, "H5Cset_userblock");
ret = H5Cset_sizes(tmpl1, F2_OFFSET_SIZE, F2_LENGTH_SIZE);
CHECK(ret, FAIL, "H5Cset_sizes");
ret = H5Cset_sym_k(tmpl1, F2_SYM_INTERN_K, F2_SYM_LEAF_K);
CHECK(ret, FAIL, "H5Cset_sym_k");
/*
* Try to create second file, with non-standard file-creation template
* params.
*/
fid2 = H5Fcreate(FILE2, H5F_ACC_TRUNC, tmpl1, H5C_DEFAULT);
CHECK(fid2, FAIL, "H5Fcreate");
/* Release file-creation template */
ret = H5Mclose(tmpl1);
CHECK(ret, FAIL, "H5Mrelease");
/* Get the file-creation template */
tmpl1 = H5Fget_create_template(fid2);
CHECK(tmpl1, FAIL, "H5Fget_create_template");
/* Get the file-creation parameters */
ret = H5Cget_userblock(tmpl1, &parm);
CHECK(ret, FAIL, "H5Cget_userblock");
VERIFY(parm, F2_USERBLOCK_SIZE, "H5Cget_userblock");
ret = H5Cget_sizes(tmpl1, &parm, &parm2);
CHECK(ret, FAIL, "H5Cget_sizes");
VERIFY(parm, F2_OFFSET_SIZE, "H5Cget_sizes");
VERIFY(parm2, F2_LENGTH_SIZE, "H5Cget_sizes");
ret = H5Cget_sym_k(tmpl1, &iparm, &iparm2);
CHECK(ret, FAIL, "H5Cget_sym_k");
VERIFY(iparm, F2_SYM_INTERN_K, "H5Cget_sym_k");
VERIFY(iparm2, F2_SYM_LEAF_K, "H5Cget_sym_k");
/* Clone the file-creation template */
tmpl2 = H5Mcopy(tmpl1);
CHECK(tmpl2, FAIL, "H5Mcopy");
/* Release file-creation template */
ret = H5Mclose(tmpl1);
CHECK(ret, FAIL, "H5Mrelease");
/* Set the new file-creation parameter */
ret = H5Cset_userblock(tmpl2, F3_USERBLOCK_SIZE);
CHECK(ret, FAIL, "H5Cset_userblock");
/*
* Try to create second file, with non-standard file-creation template
* params
*/
fid3 = H5Fcreate(FILE3, H5F_ACC_TRUNC, tmpl2, H5C_DEFAULT);
CHECK(fid3, FAIL, "H5Fcreate");
/* Release file-creation template */
ret = H5Mclose(tmpl2);
CHECK(ret, FAIL, "H5Mrelease");
/* Get the file-creation template */
tmpl1 = H5Fget_create_template(fid3);
CHECK(tmpl1, FAIL, "H5Fget_create_template");
/* Get the file-creation parameters */
ret = H5Cget_userblock(tmpl1, &parm);
CHECK(ret, FAIL, "H5Cget_userblock");
VERIFY(parm, F3_USERBLOCK_SIZE, "H5Cget_userblock");
ret = H5Cget_sizes(tmpl1, &parm, &parm2);
CHECK(ret, FAIL, "H5Cget_sizes");
VERIFY(parm, F3_OFFSET_SIZE, "H5Cget_sizes");
VERIFY(parm2, F3_LENGTH_SIZE, "H5Cget_sizes");
ret = H5Cget_sym_k(tmpl1, &iparm, &iparm2);
CHECK(ret, FAIL, "H5Cget_sym_k");
VERIFY(iparm, F3_SYM_INTERN_K, "H5Cget_sym_k");
VERIFY(iparm2, F3_SYM_LEAF_K, "H5Cget_sym_k");
/* Release file-creation template */
ret = H5Mclose(tmpl1);
CHECK(ret, FAIL, "H5Mrelease");
/* Close first file */
ret = H5Fclose(fid1);
CHECK(ret, FAIL, "H5Fclose");
/* Close second file */
ret = H5Fclose(fid2);
CHECK(ret, FAIL, "H5Fclose");
/* Close third file */
ret = H5Fclose(fid3);
CHECK(ret, FAIL, "H5Fclose");
} /* test_file_create() */
/****************************************************************
**
** test_file_open(): Low-level file open I/O test routine.
**
****************************************************************/
static void
test_file_open(void)
{
hid_t fid1; /* HDF5 File IDs */
hid_t tmpl1; /* File creation templates */
size_t parm; /* File-creation parameters */
size_t parm2; /* File-creation parameters */
int iparm, iparm2;
herr_t ret; /* Generic return value */
/* Output message about test being performed */
MESSAGE(5, ("Testing Low-Level File Opening I/O\n"));
/* Open first file */
fid1 = H5Fopen(FILE2, H5F_ACC_RDWR, H5C_DEFAULT);
CHECK(fid1, FAIL, "H5Fopen");
/* Get the file-creation template */
tmpl1 = H5Fget_create_template(fid1);
CHECK(tmpl1, FAIL, "H5Fget_create_template");
/* Get the file-creation parameters */
ret = H5Cget_userblock(tmpl1, &parm);
CHECK(ret, FAIL, "H5Cget_userblock");
VERIFY(parm, F2_USERBLOCK_SIZE, "H5Cget_userblock");
ret = H5Cget_sizes(tmpl1, &parm, &parm2);
CHECK(ret, FAIL, "H5Cget_sizes");
VERIFY(parm, F2_OFFSET_SIZE, "H5Cget_sizes");
VERIFY(parm2, F2_LENGTH_SIZE, "H5Cget_sizes");
ret = H5Cget_sym_k(tmpl1, &iparm, &iparm2);
CHECK(ret, FAIL, "H5Cget_sym_k");
VERIFY(iparm, F2_SYM_INTERN_K, "H5Cget_sym_k");
VERIFY(iparm2, F2_SYM_LEAF_K, "H5Cget_sym_k");
/* Release file-creation template */
ret = H5Mclose(tmpl1);
CHECK(ret, FAIL, "H5Mrelease");
/* Close first file */
ret = H5Fclose(fid1);
CHECK(ret, FAIL, "H5Fclose");
} /* test_file_open() */
/****************************************************************
**
** test_file(): Main low-level file I/O test routine.
**
****************************************************************/
void
test_file(void)
{
/* Output message about test being performed */
MESSAGE(5, ("Testing Low-Level File I/O\n"));
test_file_create(); /* Test file creation (also creation templates) */
test_file_open(); /* Test file opening */
} /* test_file() */