aboutsummaryrefslogtreecommitdiff
path: root/support/test-driver.c
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2016-12-09 08:18:27 +0100
committerFlorian Weimer <fweimer@redhat.com>2016-12-09 08:18:27 +0100
commitc23de0aacbeaa7a091609b35764bed931475a16d (patch)
treebe4396f71292ee7a509912d70e74323d1587d227 /support/test-driver.c
parentc03073774f915fe7841c2b551fe304544143470f (diff)
downloadglibc-c23de0aacbeaa7a091609b35764bed931475a16d.zip
glibc-c23de0aacbeaa7a091609b35764bed931475a16d.tar.gz
glibc-c23de0aacbeaa7a091609b35764bed931475a16d.tar.bz2
support: Introduce new subdirectory for test infrastructure
The new test driver in <support/test-driver.c> has feature parity with the old one. The main difference is that its hooking mechanism is based on functions and function pointers instead of macros. This commit also implements a new environment variable, TEST_COREDUMPS, which disables the code which disables coredumps (that is, it enables them if the invocation environment has not disabled them). <test-skeleton.c> defines wrapper functions so that it is possible to use existing macros with the new-style hook functionality. This commit changes only a few test cases to the new test driver, to make sure that it works as expected.
Diffstat (limited to 'support/test-driver.c')
-rw-r--r--support/test-driver.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/support/test-driver.c b/support/test-driver.c
new file mode 100644
index 0000000..3a61b7b
--- /dev/null
+++ b/support/test-driver.c
@@ -0,0 +1,158 @@
+/* Main function for test programs.
+ Copyright (C) 2016 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* This file should be included from test cases. It will define a
+ main function which provides the test wrapper.
+
+ It assumes that the test case defines a function
+
+ int do_test (void);
+
+ and arranges for that function being called under the test wrapper.
+ The do_test function should return 0 to indicate a passing test, 1
+ to indicate a failing test, or 77 to indicate an unsupported test.
+ Other result values could be used to indicate a failing test, but
+ the result of the expression is passed to exit and exit only
+ returns the lower 8 bits of its input. A non-zero return with some
+ values could cause a test to incorrectly be considered passing when
+ it really failed. For this reason, the function should always
+ return 0 (EXIT_SUCCESS), 1 (EXIT_FAILURE), or 77
+ (EXIT_UNSUPPORTED).
+
+ The test function may print out diagnostic or warning messages as well
+ as messages about failures. These messages should be printed to stdout
+ and not stderr so that the output is properly ordered with respect to
+ the rest of the glibc testsuite run output.
+
+ Several preprocessors macros can be defined before including this
+ file.
+
+ The name of the do_test function can be changed with the
+ TEST_FUNCTION macro. It must expand to the desired function name.
+
+ If the test case needs access to command line parameters, it must
+ define the TEST_FUNCTION_ARGV macro with the name of the test
+ function. It must have the following type:
+
+ int TEST_FUNCTION_ARGV (int argc, char **argv);
+
+ This overrides the do_test default function and is incompatible
+ with the TEST_FUNCTION macro.
+
+ If PREPARE is defined, it must expand to the name of a function of
+ the type
+
+ void PREPARE (int argc, char **);
+
+ This function will be called early, after parsing the command line,
+ but before running the test, in the parent process which acts as
+ the test supervisor.
+
+ If CLEANUP_HANDLER is defined, it must expand to the name of a
+ function of the type
+
+ void CLEANUP_HANDLER (void);
+
+ This function will be called from the timeout (SIGALRM) signal
+ handler.
+
+ If EXPECTED_SIGNAL is defined, it must expanded to a constant which
+ denotes the expected signal number.
+
+ If EXPECTED_STATUS is defined, it must expand to the expected exit
+ status.
+
+ If TIMEOUT is defined, it must be positive constant. It overrides
+ the default test timeout and is measured in seconds.
+
+ If TEST_NO_MALLOPT is defined, the test wrapper will not call
+ mallopt.
+
+ Custom command line handling can be implemented by defining the
+ CMDLINE_OPTION macro (after including the <getopt.h> header; this
+ requires _GNU_SOURCE to be defined). This macro must expand to a
+ to a comma-separated list of braced initializers for struct option
+ from <getopt.h>, with a trailing comma. CMDLINE_PROCESS can be
+ defined as the name of a function which is called to process these
+ options. The function is passed the option character/number and
+ has this type:
+
+ void CMDLINE_PROCESS (int);
+*/
+
+#include <support/test-driver.h>
+
+#include <string.h>
+
+int
+main (int argc, char **argv)
+{
+ struct test_config test_config;
+ memset (&test_config, 0, sizeof (test_config));
+
+#ifdef PREPARE
+ test_config.prepare_function = (PREPARE);
+#endif
+
+#if defined (TEST_FUNCTION) && defined (TEST_FUNCTON_ARGV)
+# error TEST_FUNCTION and TEST_FUNCTION_ARGV cannot be defined at the same time
+#endif
+#if defined (TEST_FUNCTION)
+ test_config.test_function = TEST_FUNCTION;
+#elif defined (TEST_FUNCTION_ARGV)
+ test_config.test_function_argv = TEST_FUNCTION_ARGV;
+#else
+ test_config.test_function = do_test;
+#endif
+
+#ifdef CLEANUP_HANDLER
+ test_config.cleanup_function = CLEANUP_HANDLER;
+#endif
+
+#ifdef EXPECTED_SIGNAL
+ test_config.expected_signal = (EXPECTED_SIGNAL);
+#endif
+
+#ifdef EXPECTED_STATUS
+ test_config.expected_status = (EXPECTED_STATUS);
+#endif
+
+#ifdef TEST_NO_MALLOPT
+ test_config.no_mallopt = 1;
+#endif
+
+#ifdef TIMEOUT
+ test_config.timeout = TIMEOUT;
+#endif
+
+#ifdef CMDLINE_OPTIONS
+ struct option options[] =
+ {
+ CMDLINE_OPTIONS
+ { "direct", no_argument, NULL, OPT_DIRECT },
+ { "test-dir", required_argument, NULL, OPT_TESTDIR },
+ { NULL, 0, NULL, 0 }
+ };
+ test_config.options = &options;
+#endif
+#ifdef CMDLINE_PROCESS
+ test_config.cmdline_function = CMDLINE_PROCESS;
+#endif
+
+ return support_test_main (argc, argv, &test_config);
+}