1
0
mirror of https://github.com/pgbackrest/pgbackrest.git synced 2024-12-14 10:13:05 +02:00
pgbackrest/test/src/test.c
David Steele ade2c3102d Ignore SIGPIPE signals and check EPIPE result instead.
SIGPIPE immediately terminates the process but we would rather catch the EPIPE error and gracefully shutdown.

Ignore SIGPIPE and throw the EPIPE error via normal error handling.
2019-01-06 17:42:44 +02:00

133 lines
4.2 KiB
C

/***********************************************************************************************************************************
C Test Wrapper
This wrapper runs the the C unit tests.
***********************************************************************************************************************************/
/***********************************************************************************************************************************
C files to be tested
The files are included directly so the test can see and manipulate variables and functions in the module without the need to extern.
If a .c file does not exist for a module then the header file will be included instead. They are included first so they won't see
the includes which are required for the test code.
***********************************************************************************************************************************/
{[C_INCLUDE]}
/***********************************************************************************************************************************
The test code is included directly so it can freely interact with the included C files
***********************************************************************************************************************************/
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#ifndef NO_ERROR
#include "common/debug.h"
#include "common/error.h"
#endif
#include "common/harnessDebug.h"
#include "common/harnessTest.h"
#ifndef NO_LOG
#include "common/harnessLog.h"
void harnessLogLevelDefaultSet(LogLevel logLevel);
#endif
#ifndef NO_MEM_CONTEXT
#include "common/memContext.h"
#endif
{[C_TEST_INCLUDE]}
/***********************************************************************************************************************************
Include assert.h here since it is not generally used by tests
***********************************************************************************************************************************/
#include <assert.h>
/***********************************************************************************************************************************
main - run the tests
***********************************************************************************************************************************/
int
main(int argListSize, const char *argList[])
{
// Basic sanity test on input parameters
if (argListSize == 0 || argList[0] == NULL)
{
fprintf(stderr, "at least one argument expected");
fflush(stderr);
exit(25);
}
// Initialize stack trace for the harness
FUNCTION_HARNESS_INIT(argList[0]);
FUNCTION_HARNESS_BEGIN();
FUNCTION_HARNESS_PARAM(INT, argListSize);
FUNCTION_HARNESS_PARAM(CHARPY, argList);
FUNCTION_HARNESS_END();
int result = 0;
// Set neutral umask for testing
umask(0000);
// Ignore SIGPIPE and check for EPIPE errors on write() instead
signal(SIGPIPE, SIG_IGN);
// Set globals
testExeSet(argList[0]);
testPathSet("{[C_TEST_PATH]}");
testRepoPathSet("{[C_TEST_REPO_PATH]}");
testExpectPathSet("{[C_TEST_EXPECT_PATH]}");
// Set default test log level
#ifndef NO_LOG
harnessLogLevelDefaultSet({[C_LOG_LEVEL_TEST]});
#endif
// Initialize tests
// run, selected
{[C_TEST_LIST]}
#ifndef NO_ERROR
TRY_BEGIN()
{
#endif
// Run the tests
testRun();
// End test run and make sure all tests completed
testComplete();
printf("\nTESTS COMPLETED SUCCESSFULLY\n");
fflush(stdout);
#ifndef NO_ERROR
}
CATCH_ANY()
{
fprintf(
stderr,
"\nTEST FAILED WITH %s:\n\n"
"--------------------------------------------------------------------------------\n"
"%s\n"
"--------------------------------------------------------------------------------\n"
"\nTHROWN AT:\n%s\n",
errorName(), errorMessage(), errorStackTrace());
fflush(stderr);
result = errorCode();
}
#ifndef NO_MEM_CONTEXT
FINALLY()
{
memContextFree(memContextTop());
}
#endif
TRY_END();
#endif
FUNCTION_HARNESS_RESULT(INT, result);
}