Bring new/updated tests from revise+chunks branch: flush1/flush2 update and

flushrefresh test.  (Also refactor of message send / wait code)
This commit is contained in:
Quincey Koziol 2016-12-19 20:44:54 -08:00
parent ab3963b28e
commit eefddf2813
13 changed files with 1734 additions and 82 deletions

View File

@ -943,6 +943,7 @@
./test/filter_fail.c
./test/flush1.c
./test/flush2.c
./test/flushrefresh.c
./test/gen_bad_ohdr.c
./test/gen_bad_compound.c
./test/gen_bogus.c
@ -1010,6 +1011,7 @@
./test/testcheck_version.sh.in
./test/testerror.sh.in
./test/testlinks_env.sh.in
./test/testflushrefresh.sh.in
./test/testframe.c
./test/testhdf5.c
./test/testhdf5.h

View File

@ -3317,6 +3317,7 @@ AC_CONFIG_FILES([src/libhdf5.settings
test/Makefile
test/testcheck_version.sh
test/testerror.sh
test/testflushrefresh.sh
test/H5srcdir_str.h
test/testlibinfo.sh
test/testlinks_env.sh

View File

@ -37,6 +37,14 @@ h5watch_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS)
# Programs all depend on the hdf5 library, the tools library, and the HL
# library.
LDADD=$(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5)
# Add extend_dset specific preprocessor flags here
# (add the main test subdirectory to the include file path)
extend_dset_CPPFLAGS=$(AM_CPPFLAGS) -I$(top_srcdir)/test
# Add extend_dset specific library flags here
# (add the main test library to the list of libraries)
extend_dset_LDADD=$(LDADD) $(LIBH5TEST)
#
CHECK_CLEANFILES+=*.h5
DISTCLEANFILES=testh5watch.sh

View File

@ -14,6 +14,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "H5HLprivate2.h"
#include "h5test.h"
/*
* Extending datasets in WATCH.h5 generated by h5watchgentest.c
@ -30,8 +31,6 @@
#define WRITER_MESSAGE "writer_message"
/* The message received from the test script to start extending dataset */
#define READER_MESSAGE "reader_message"
/* Message timeout in seconds */
#define MESSAGE_TIMEOUT 300
/* Size of data buffer */
#define TEST_BUF_SIZE 100
@ -57,8 +56,6 @@ int two_tests[TWO_NTESTS][2] = { {2, 2}, {2, -11}, {2, 0},
static herr_t extend_dset_two(const char *file, char *dname);
static herr_t extend_dset_one(const char *file, char *dname);
void send_message(const char *file);
static herr_t wait_message(const char *file);
/* Data structures for datasets with compound data type */
@ -86,55 +83,6 @@ typedef struct set_t {
sub4_t field4;
} set_t;
/*
* To send a message by creating the file.
*/
void
send_message(const char *file)
{
FILE *id;
id = HDfopen(file, "w+");
HDfclose(id);
} /* end send_message() */
/*
*
* Repeatedly check for the message file.
* It will stop when the file exists or exceeds the timeout limit.
*/
static herr_t
wait_message(const char *file)
{
FILE *id; /* File pointer */
time_t t0, t1; /* Time info */
/* Start timer */
HDtime(&t0);
/* Wait for message from test script to start work */
while((id = HDfopen(file, "r")) == NULL) {
/* Get current time */
HDtime(&t1);
/*
* Determine time difference--
* if waiting too long for the message, then it is
* unlikely the message will get sent, then fail rather
* than loop forever.
*/
if(HDdifftime(t1, t0) > MESSAGE_TIMEOUT)
goto error;
} /* end while */
HDfclose(id);
HDunlink(file);
return SUCCEED;
error:
return FAIL;
} /* end wait_message() */
/*
***********************************************************************
*
@ -198,7 +146,7 @@ extend_dset_two(const char *file, char *dname)
goto error;
/* Send message to the test script to start "h5watch" */
send_message(WRITER_MESSAGE);
h5_send_message(WRITER_MESSAGE, NULL, NULL);
if((sid = H5Dget_space(did)) < 0)
goto error;
@ -215,7 +163,7 @@ extend_dset_two(const char *file, char *dname)
goto error;
/* Wait for message from the test script to start extending dataset */
if(wait_message(READER_MESSAGE) < 0)
if(h5_wait_message(READER_MESSAGE) < 0)
goto error;
/* Loop through different variations of extending the dataset */
@ -355,7 +303,7 @@ extend_dset_one(const char *file, char *dname)
goto error;
/* Send message to the test script to start "h5watch" */
send_message(WRITER_MESSAGE);
h5_send_message(WRITER_MESSAGE, NULL, NULL);
if((did = H5Dopen2(fid, dname, H5P_DEFAULT)) < 0)
goto error;
@ -369,7 +317,7 @@ extend_dset_one(const char *file, char *dname)
goto error;
/* Wait for message from the test script to start extending dataset */
if(wait_message(READER_MESSAGE) < 0)
if(h5_wait_message(READER_MESSAGE) < 0)
goto error;
/* Loop through different variations of extending the dataset */

View File

@ -319,6 +319,7 @@ set (H5_CHECK_TESTS
tcheck_version
testmeta
links_env
flushrefresh
)
foreach (test ${H5_CHECK_TESTS})

View File

@ -440,6 +440,13 @@ set (test_CLEANFILES
tvlstr.h5
tvlstr2.h5
flush.h5
flush-swmr.h5
noflush.h5
noflush-swmr.h5
flush_extend.h5
flush_extend-swmr.h5
noflush_extend.h5
noflush_extend-swmr.h5
enum1.h5
titerate.h5
ttsafe.h5
@ -508,6 +515,11 @@ set (test_CLEANFILES
vds_src_0.h5
vds_src_1.h5
tbogus.h5.copy
flushrefresh.h5
flushrefresh_VERIFICATION_START
flushrefresh_VERIFICATION_CHECKPOINT1
flushrefresh_VERIFICATION_CHECKPOINT2
flushrefresh_VERIFICATION_DONE
accum_swmr_big.h5
ohdr_swmr.h5
cache_logging.h5
@ -870,6 +882,11 @@ set_tests_properties (H5PLUGIN-plugin PROPERTIES
WORKING_DIRECTORY ${HDF5_TEST_BINARY_DIR}
)
##############################################################################
### S W M R T E S T S
##############################################################################
# testflushrefresh.sh: flushrefresh
##############################################################################
##############################################################################
### V F D T E S T S ###

View File

@ -28,8 +28,11 @@ AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_builddir)/src
# testlibinfo.sh:
# testcheck_version.sh: tcheck_version
# tetlinks_env.sh: links_env
TEST_SCRIPT = testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.sh
SCRIPT_DEPEND = error_test$(EXEEXT) err_compat$(EXEEXT) links_env$(EXEEXT)
# testflushrefresh.sh: flushrefresh
TEST_SCRIPT = testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.sh \
testflushrefresh.sh
SCRIPT_DEPEND = error_test$(EXEEXT) err_compat$(EXEEXT) links_env$(EXEEXT) \
testflushrefresh.sh
if HAVE_SHARED_CONDITIONAL
TEST_SCRIPT += test_plugin.sh
SCRIPT_DEPEND += plugin$(EXEEXT)
@ -55,12 +58,13 @@ TEST_PROG= testhdf5 cache cache_api cache_tagging lheap ohdr stab gheap \
# tcheck_version is used by testcheck_version.sh.
# accum_swmr_reader is used by accum.c.
# links_env is used by testlinks_env.sh
# flushrefresh is used by testflushrefresh.sh.
# 'make check' doesn't run them directly, so they are not included in TEST_PROG.
# Also build testmeta, which is used for timings test. It builds quickly,
# and this lets automake keep all its test programs in one place.
check_PROGRAMS=$(TEST_PROG) error_test err_compat tcheck_version \
testmeta accum_swmr_reader \
links_env
links_env flushrefresh
if HAVE_SHARED_CONDITIONAL
check_PROGRAMS+= plugin
endif
@ -148,7 +152,9 @@ CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offse
stdio.h5 sec2.h5 dtypes[0-9].h5 dtypes1[0].h5 dt_arith[1-2].h5 tattr.h5 \
tselect.h5 mtime.h5 unlink.h5 unicode.h5 coord.h5 \
fillval_[0-9].h5 fillval.raw mount_[0-9].h5 testmeta.h5 ttime.h5 \
trefer[1-3].h5 tvltypes.h5 tvlstr.h5 tvlstr2.h5 flush.h5 \
trefer[1-3].h5 tvltypes.h5 tvlstr.h5 tvlstr2.h5 \
flush.h5 flush-swmr.h5 noflush.h5 noflush-swmr.h5 flush_extend.h5 \
flush_extend-swmr.h5 noflush_extend.h5 noflush_extend-swmr.h5 \
enum1.h5 titerate.h5 ttsafe.h5 tarray1.h5 tgenprop.h5 \
tmisc[0-9]*.h5 set_extent[1-5].h5 ext[12].bin \
getname.h5 getname[1-3].h5 sec2_file.h5 direct_file.h5 \
@ -163,7 +169,9 @@ CHECK_CLEANFILES+=accum.h5 cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offse
split_get_file_image_test-m.h5 split_get_file_image_test-r.h5 \
file_image_core_test.h5.copy unregister_filter_1.h5 unregister_filter_2.h5 \
vds_virt.h5 vds_dapl.h5 vds_src_[0-1].h5 \
accum_swmr_big.h5 ohdr_swmr.h5 \
flushrefresh.h5 flushrefresh_VERIFICATION_START \
flushrefresh_VERIFICATION_CHECKPOINT1 flushrefresh_VERIFICATION_CHECKPOINT2 \
flushrefresh_VERIFICATION_DONE accum_swmr_big.h5 ohdr_swmr.h5 \
cache_logging.h5 cache_logging.out \
swmr[0-2].h5
# Sources for testhdf5 executable
@ -173,5 +181,7 @@ testhdf5_SOURCES=testhdf5.c tarray.c tattr.c tchecksum.c tconfig.c tfile.c \
tvlstr.c tvltypes.c
# Temporary files.
DISTCLEANFILES=testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.sh test_plugin.sh
DISTCLEANFILES=testerror.sh testlibinfo.sh testcheck_version.sh testlinks_env.sh test_plugin.sh \
testflushrefresh.sh
include $(top_srcdir)/config/conclude.am

View File

@ -27,8 +27,13 @@
const char *FILENAME[] = {
"flush",
"flush-swmr",
"noflush",
"noflush-swmr",
"flush_extend",
"flush_extend-swmr",
"noflush_extend",
"noflush_extend-swmr",
NULL
};
@ -51,14 +56,17 @@ static double the_data[100][100];
*-------------------------------------------------------------------------
*/
static hid_t
create_file(char* name, hid_t fapl)
create_file(char* name, hid_t fapl, hbool_t swmr)
{
hid_t file, dcpl, space, dset, groups, grp;
hsize_t ds_size[2] = {100, 100};
hsize_t ch_size[2] = {5, 5};
unsigned flags;
size_t i, j;
if((file = H5Fcreate(name, H5F_ACC_TRUNC, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
flags = H5F_ACC_TRUNC | (swmr ? H5F_ACC_SWMR_WRITE : 0);
if((file = H5Fcreate(name, flags, H5P_DEFAULT, fapl)) < 0) FAIL_STACK_ERROR
/* Create a chunked dataset */
if((dcpl = H5Pcreate(H5P_DATASET_CREATE)) < 0) FAIL_STACK_ERROR
@ -156,30 +164,43 @@ main(void)
{
hid_t file, fapl;
char name[1024];
unsigned swmr;
h5_reset();
fapl = h5_fileaccess();
TESTING("H5Fflush (part1)");
/* Create the file */
h5_fixname(FILENAME[0], fapl, name, sizeof name);
file = create_file(name, fapl);
/* Flush and exit without closing the library */
if (H5Fflush(file, H5F_SCOPE_GLOBAL) < 0) goto error;
/* Loop over SWMR & non-SWMR opens for the file */
for(swmr = 0; swmr <= 1; swmr++) {
/* Create the file */
h5_fixname(FILENAME[0 + swmr], fapl, name, sizeof name);
file = create_file(name, fapl, swmr);
/* Flush and exit without closing the library */
if (H5Fflush(file, H5F_SCOPE_GLOBAL) < 0) goto error;
/* Create the file */
h5_fixname(FILENAME[2], fapl, name, sizeof name);
file = create_file(name, fapl);
/* Flush and exit without closing the library */
if(H5Fflush(file, H5F_SCOPE_GLOBAL) < 0) goto error;
/* Add a bit to the file and don't flush the new part */
extend_file(file);
/* Create the other file which will not be flushed */
h5_fixname(FILENAME[2 + swmr], fapl, name, sizeof name);
file = create_file(name, fapl, swmr);
/* Create the other file which will not be flushed */
h5_fixname(FILENAME[1], fapl, name, sizeof name);
file = create_file(name, fapl);
/* Create the file */
h5_fixname(FILENAME[4 + swmr], fapl, name, sizeof name);
file = create_file(name, fapl, swmr);
/* Flush and exit without closing the library */
if(H5Fflush(file, H5F_SCOPE_GLOBAL) < 0) goto error;
/* Add a bit to the file and don't flush the new part */
extend_file(file);
/* Flush and exit without closing the library */
if (H5Fflush(file, H5F_SCOPE_GLOBAL) < 0) goto error;
/* Create the file */
h5_fixname(FILENAME[6 + swmr], fapl, name, sizeof name);
file = create_file(name, fapl, swmr);
/* Flush and exit without closing the library */
if(H5Fflush(file, H5F_SCOPE_GLOBAL) < 0) goto error;
/* Add a bit to the file and don't flush the new part */
extend_file(file);
} /* end for */
PASSED();
fflush(stdout);

View File

@ -24,10 +24,20 @@
*/
#include "h5test.h"
/* Make this private property (defined in H5Fprivate.h) available */
/* This is used in the helper routine clear_status_flags() */
#define H5F_ACS_CLEAR_STATUS_FLAGS_NAME "clear_status_flags"
const char *FILENAME[] = {
"flush",
"flush-swmr",
"noflush",
"noflush-swmr",
"flush_extend",
"flush_extend-swmr",
"noflush_extend",
"noflush_extend-swmr",
NULL
};
@ -134,6 +144,53 @@ error:
return 1;
} /* end check_file() */
/*-------------------------------------------------------------------------
* Function: clear_status_flags
*
* Purpose: To clear the status_flags in the superblock of the file.
* It is smilar to the tool "h5clear".
*
* Return: Success: 0
* Failure: 1
*
* Programmer: Vailin Choi
* July 2013
*
*-------------------------------------------------------------------------
*/
static int
clear_status_flags(char *name, hid_t fapl)
{
hid_t new_fapl = -1;
hid_t fid = -1;
hbool_t clear = TRUE;
/* Get a copy of fapl */
if((new_fapl = H5Pcopy(fapl)) < 0)
FAIL_STACK_ERROR;
/* Set this private property */
if(H5Pset(new_fapl, H5F_ACS_CLEAR_STATUS_FLAGS_NAME, &clear) < 0)
FAIL_STACK_ERROR;
/* Has to open rw */
if((fid = H5Fopen(name, H5F_ACC_RDWR, new_fapl)) < 0)
FAIL_STACK_ERROR;
/* Close the file */
if(H5Fclose(fid) < 0)
FAIL_STACK_ERROR;
/* CLose the property list */
if(H5Pclose(new_fapl) < 0)
FAIL_STACK_ERROR;
return 0;
error:
return 1;
} /* clear_status_flags() */
/*-------------------------------------------------------------------------
* Function: main
@ -166,6 +223,26 @@ main(void)
/* Check the case where the file was flushed */
h5_fixname(FILENAME[0], fapl, name, sizeof name);
if(check_file(name, fapl, FALSE)) {
H5_FAILED()
goto error;
}
else
PASSED();
TESTING("H5Fflush (part2 with flush + SWMR)");
/* Check the case where the file was flushed w/SWMR */
h5_fixname(FILENAME[1], fapl, name, sizeof name);
/* Clear the status_flags of the file which is flushed and exited in flush1.c */
if(clear_status_flags(name, fapl) < 0) {
H5_FAILED()
goto error;
}
if(check_file(name, fapl, FALSE)) {
H5_FAILED()
goto error;
@ -180,7 +257,31 @@ main(void)
H5Eget_auto2(H5E_DEFAULT,&func,NULL);
H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
h5_fixname(FILENAME[1], fapl, name, sizeof name);
h5_fixname(FILENAME[2], fapl, name, sizeof name);
/* No need to clear the status_flags because this file is not flushed in flush1.c */
/* H5Fopen() in check_file() will just return error */
if(check_file(name, fapl, FALSE))
PASSED()
else {
#if defined H5_HAVE_WIN32_API && !defined (hdf5_EXPORTS)
SKIPPED();
puts(" DLL will flush the file even when calling _exit, skip this test temporarily");
#else
H5_FAILED()
goto error;
#endif
}
H5Eset_auto2(H5E_DEFAULT, func, NULL);
/* Check the case where the file was not flushed. This should give an error
* so we turn off the error stack temporarily */
TESTING("H5Fflush (part2 without flush + SWMR)");
H5Eget_auto2(H5E_DEFAULT,&func,NULL);
H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
h5_fixname(FILENAME[3], fapl, name, sizeof name);
/* No need to clear the status_flags because this file is not flushed in flush1.c */
/* H5Fopen() in check_file() will just return error */
if(check_file(name, fapl, FALSE))
PASSED()
else {
@ -194,13 +295,81 @@ main(void)
}
H5Eset_auto2(H5E_DEFAULT, func, NULL);
/* Check the case where the file was flushed, but more data was added afterward. This should give an error
* so we turn off the error stack temporarily */
TESTING("H5Fflush (part2 with flush and later addition and another flush)");
H5Eget_auto2(H5E_DEFAULT,&func,NULL);
H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
h5_fixname(FILENAME[4], fapl, name, sizeof name);
/* Clear the status_flags of the file which is flushed and exited in flush1.c */
if(clear_status_flags(name, fapl) < 0) {
H5_FAILED()
goto error;
}
if(check_file(name, fapl, TRUE)) {
H5_FAILED()
goto error;
}
else
PASSED();
H5Eset_auto2(H5E_DEFAULT, func, NULL);
/* Check the case where the file was flushed, but more data was added afterward. This should give an error
* so we turn off the error stack temporarily */
TESTING("H5Fflush (part2 with flush and later addition and another flush + SWMR)");
H5Eget_auto2(H5E_DEFAULT,&func,NULL);
H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
h5_fixname(FILENAME[5], fapl, name, sizeof name);
if(check_file(name, fapl, TRUE))
PASSED()
else {
#if defined H5_HAVE_WIN32_API && !defined (hdf5_EXPORTS)
SKIPPED();
puts(" DLL will flush the file even when calling _exit, skip this test temporarily");
#else
H5_FAILED()
goto error;
#endif
}
H5Eset_auto2(H5E_DEFAULT, func, NULL);
/* Check the case where the file was flushed, but more data was added afterward. This should give an error
* so we turn off the error stack temporarily */
TESTING("H5Fflush (part2 with flush and later addition)");
H5Eget_auto2(H5E_DEFAULT,&func,NULL);
H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
h5_fixname(FILENAME[2], fapl, name, sizeof name);
h5_fixname(FILENAME[6], fapl, name, sizeof name);
if(check_file(name, fapl, TRUE))
PASSED()
else {
#if defined H5_HAVE_WIN32_API && !defined (hdf5_EXPORTS)
SKIPPED();
puts(" DLL will flush the file even when calling _exit, skip this test temporarily");
#else
H5_FAILED()
goto error;
#endif
}
H5Eset_auto2(H5E_DEFAULT, func, NULL);
/* Check the case where the file was flushed, but more data was added afterward. This should give an error
* so we turn off the error stack temporarily */
TESTING("H5Fflush (part2 with flush and later addition + SWMR)");
H5Eget_auto2(H5E_DEFAULT,&func,NULL);
H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
h5_fixname(FILENAME[7], fapl, name, sizeof name);
if(check_file(name, fapl, TRUE))
PASSED()
else {

1151
test/flushrefresh.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -93,6 +93,12 @@ static const char *multi_letters = "msbrglo";
/* Length of multi-file VFD filename buffers */
#define H5TEST_MULTI_FILENAME_LEN 1024
/* Temporary file for sending signal messages */
#define TMP_SIGNAL_FILE "tmp_signal_file"
/* The # of seconds to wait for the message file--used by h5_wait_message() */
#define MESSAGE_TIMEOUT 300 /* Timeout in seconds */
/* Previous error reporting function */
static H5E_auto2_t err_func = NULL;
@ -1711,3 +1717,118 @@ error:
return -1;
}
/*-------------------------------------------------------------------------
* Function: h5_send_message
*
* Purpose: Sends the specified signal.
*
* In terms of this test framework, a signal consists of a file
* on disk. Since there are multiple processes that need to
* communicate with each other, they do so by writing and
* reading signal files on disk, the names and contents of
* which are used to inform a process about when it can
* proceed and what it should do next.
*
* This function writes a signal file. The first argument is
* the name of the signal file, and the second and third
* arguments are the contents of the first two lines of the
* signal file. The last two arguments may be NULL.
*
* Return: void
*
* Programmer: Mike McGreevy
* August 18, 2010
*
*-------------------------------------------------------------------------
*/
void
h5_send_message(const char *send, const char *arg1, const char *arg2)
{
FILE *signalfile;
HDremove(TMP_SIGNAL_FILE);
/* Create signal file (which will send signal to some other process) */
signalfile = HDfopen(TMP_SIGNAL_FILE, "w+");
/* Write messages to signal file, if provided */
if(arg2 != NULL) {
HDassert(arg1);
HDfprintf(signalfile, "%s\n%s\n", arg1, arg2);
} /* end if */
else if(arg1 != NULL) {
HDassert(arg2 == NULL);
HDfprintf(signalfile, "%s\n", arg1);
} /* end if */
else {
HDassert(arg1 == NULL);
HDassert(arg2 == NULL);
}/* end else */
HDfclose(signalfile);
HDrename(TMP_SIGNAL_FILE, send);
} /* h5_send_message() */
/*-------------------------------------------------------------------------
* Function: h5_wait_message
*
* Purpose: Waits for the specified signal.
*
* In terms of this test framework, a signal consists of a file
* on disk. Since there are multiple processes that need to
* communicate with each other, they do so by writing and
* reading signal files on disk, the names and contents of
* which are used to inform a process about when it can
* proceed and what it should do next.
*
* This function continuously attempts to read the specified
* signal file from disk, and only continues once it has
* successfully done so (i.e., only after another process has
* called the "h5_send_message" function to write the signal file).
* This functon will then immediately remove the file (i.e.,
* to indicate that it has been received and can be reused),
* and then exits, allowing the calling function to continue.
*
* Return: void
*
* Programmer: Mike McGreevy
* August 18, 2010
*
*-------------------------------------------------------------------------
*/
herr_t
h5_wait_message(const char *waitfor)
{
FILE *returnfile;
time_t t0,t1;
/* Start timer. If this function runs for too long (i.e.,
expected signal is never received), it will
return failure */
HDtime(&t0);
/* Wait for return signal from some other process */
while ((returnfile = HDfopen(waitfor, "r")) == NULL) {
/* make note of current time. */
HDtime(&t1);
/* If we've been waiting for a signal for too long, then
it was likely never sent and we should fail rather
than loop infinitely */
if(HDdifftime(t1, t0) > MESSAGE_TIMEOUT) {
HDfprintf(stdout, "Error communicating between processes. Make sure test script is running.\n");
TEST_ERROR;
} /* end if */
} /* end while */
HDfclose(returnfile);
HDunlink(waitfor);
return SUCCEED;
error:
return FAIL;
} /* h5_wait_message() */

View File

@ -197,6 +197,9 @@ H5TEST_DLL char* getenv_all(MPI_Comm comm, int root, const char* name);
/* Extern global variables */
H5TEST_DLLVAR int TestVerbosity;
H5TEST_DLL void h5_send_message(const char *file, const char *arg1, const char *arg2);
H5TEST_DLL herr_t h5_wait_message(const char *file);
#ifdef __cplusplus
}
#endif

200
test/testflushrefresh.sh.in Normal file
View File

@ -0,0 +1,200 @@
#! /bin/sh
#
# Copyright by The HDF Group.
# Copyright by the Board of Trustees of the University of Illinois.
# All rights reserved.
#
# This file is part of HDF5. The full HDF5 copyright notice, including
# terms governing use, modification, and redistribution, is contained in
# the files COPYING and Copyright.html. COPYING can be found at the root
# of the source code distribution tree; Copyright.html can be found at the
# root level of an installed copy of the electronic HDF5 document set and
# is linked from the top-level documents page. It can also be found at
# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
# access to either file, you may request a copy from help@hdfgroup.org.
#
#
# Test script for the flush/evict single objects feature.
#
# This test file doesn't actually perform any tests, rather, it acts
# as a process manager for the 'flushrefresh' test file, which is where
# the tests are actually housed. The reason this script exists is because
# the verification of this feature needs to occur in separate processes
# from the one in which the file is being manipulated in. (i.e., we have
# a single writer process, and various reader processes spawning off
# and doing the verification that individual objects are being
# correctly flushed).
#
# Programmer:
# Mike McGreevy
# Tuesday, July 20, 2010
###############################################################################
## test variables
###############################################################################
# Number of errors encountered during test run.
nerrors=0
# Set up a function to check the current time since the epoch - ideally, we'd
# like to use Perl. If it wasn't detected by configure, then use date, though
# this is less portable and might cause problems on machines that don't
# recognize the +%s option (like Solaris).
#
# Note that PERL will resolve to true or false, not a path.
PERL=@PERL@
if test -n "$PERL"; then
TimeStamp()
{
time=`perl -e 'print int(time)'`
echo "$time"
}
else
TimeStamp()
{
time=`date +%s`
echo "$time"
}
fi
###############################################################################
## Main
###############################################################################
# The build (current) directory might be different than the source directory.
if test -z "$srcdir"; then
srcdir=.
fi
# Check to see if the VFD specified by the HDF5_DRIVER environment variable
# supports SWMR.
./swmr_check_compat_vfd
rc=$?
if [ $rc -ne 0 ] ; then
echo
echo "The VFD specified by the HDF5_DRIVER environment variable"
echo "does not support SWMR."
echo
echo "flush/refresh tests skipped"
echo
exit 0
fi
# ========================
# Launch the Test Program.
# ========================
./flushrefresh &
pid_main=$!
# =================================================
# Set up/initialize some variables to be used later
# =================================================
testfile=flushrefresh.h5
startsignal=flushrefresh_VERIFICATION_START
endsignal=flushrefresh_VERIFICATION_DONE
timeout_length=300
timedout=0
verification_done=0
if [ -e $testfile ]; then
rm $testfile
fi
# =======================================
# Run flush verification on test program.
# =======================================
until [ $verification_done -eq 1 ]; do
# Wait for signal from test program that verification routine can run.
before=`TimeStamp`
until [ -s $startsignal ]; do
after=`TimeStamp`
timediff=`expr $after - $before`
if [ $timediff -gt $timeout_length ]; then
nerrors=`expr $nerrors + 1`
timedout=1
break
fi
done
# Check to see if we timed out looking for the signal before continuing.
if [ $timedout -gt 0 ]; then
echo timed out waiting for signal from test program.
break
fi
# Read in test routine parameters from signal file, then delete signal file.
param1=`head -1 $startsignal`
param2=`tail -1 $startsignal`
rm $startsignal
# Check if we're done with verifications, otherwise run the specified verification.
if [ "$param1" = "VERIFICATION_DONE" ]; then
verification_done=1
echo "all flush verification complete" > $endsignal
else
./flushrefresh $param1 $param2
echo "verification flush process done" > $endsignal
fi
done
# =========================================
# Run refresh verification on test program.
# =========================================
if [ $timedout -eq 0 ]; then
until [ $verification_done -eq 2 ]; do
# Wait for signal from test program that verification routine can run.
before=`TimeStamp`
until [ -s $startsignal ]; do
after=`TimeStamp`
timediff=`expr $after - $before`
if [ $timediff -gt $timeout_length ]; then
nerrors=`expr $nerrors + 1`
timedout=1
break
fi
done
# Check to see if we timed out looking for the signal before continuing.
if [ $timedout -gt 0 ]; then
echo timed out waiting for signal from test program.
break
fi
# Read in test routine parameter from signal file, then delete signal file.
param1=`head -n 1 $startsignal`
rm $startsignal
# Check if we're done with verifications, otherwise run the specified verification.
if [ "$param1" = "VERIFICATION_DONE" ]; then
verification_done=2
echo "all refresh verification complete" > $endsignal
else
./flushrefresh $param1
echo "refresh verifiction process done" > $endsignal
fi
done
fi
# ============================================
# Wait for main to finish up, and end testing.
# ============================================
wait $pid_main
if test $? -ne 0; then
echo flushrefresh had error
nerrors=`expr $nerrors + 1`
fi
###############################################################################
## Report and exit
###############################################################################
if test $nerrors -eq 0 ; then
echo "flush/refresh objects tests passed."
exit 0
else
echo "flush/refresh objects tests failed with $nerrors errors."
exit 1
fi