summaryrefslogtreecommitdiff
path: root/unittest
diff options
context:
space:
mode:
authorlars/lthalmann@dl145j.mysql.com <>2006-09-11 13:34:44 +0200
committerlars/lthalmann@dl145j.mysql.com <>2006-09-11 13:34:44 +0200
commit1dfc84986e14d75679c1571ae2cc1caeb25ba4a3 (patch)
treef80b248bcf597dedabf6357709b641d65d21ae5b /unittest
parent28b90bfab5104efa3c1a4a80fb9e85b64880dabb (diff)
parentf480cb0d670c6ff91e6976fc7a41dea4cd9c8882 (diff)
downloadmariadb-git-1dfc84986e14d75679c1571ae2cc1caeb25ba4a3.tar.gz
Merge mysql.com:/users/lthalmann/bkroot/mysql-5.1-new-rpl
into mysql.com:/users/lthalmann/bk/MERGE/mysql-5.1-merge
Diffstat (limited to 'unittest')
-rw-r--r--unittest/Makefile.am11
-rw-r--r--unittest/README.txt7
-rw-r--r--unittest/examples/Makefile.am2
-rw-r--r--unittest/examples/core-t.c19
-rw-r--r--unittest/mytap/tap.c50
-rw-r--r--unittest/mytap/tap.h51
6 files changed, 124 insertions, 16 deletions
diff --git a/unittest/Makefile.am b/unittest/Makefile.am
index ca3291efde0..f2f7fc0bf7d 100644
--- a/unittest/Makefile.am
+++ b/unittest/Makefile.am
@@ -1,15 +1,12 @@
SUBDIRS = mytap . mysys examples
-noinst_SCRIPTS = unit
EXTRA_DIST = unit.pl
CLEANFILES = unit
unittests = mytap mysys
-test: unit
- ./unit run $(unittests)
-
-unit: $(srcdir)/unit.pl
- cp $(srcdir)/unit.pl $@
- chmod 700 $@
+test:
+ perl unit.pl run $(unittests)
+test-verbose:
+ HARNESS_VERBOSE=1 perl unit.pl run $(unittests)
diff --git a/unittest/README.txt b/unittest/README.txt
index 5cbc6b02f05..e862a54e443 100644
--- a/unittest/README.txt
+++ b/unittest/README.txt
@@ -9,7 +9,9 @@ mytap Source for the MyTAP library
mysys Tests for mysys components
bitmap-t.c Unit test for MY_BITMAP
base64-t.c Unit test for base64 encoding functions
-examples Example unit tests
+examples Example unit tests.
+ core-t.c Example of raising a signal in the middle of the test
+ THIS TEST WILL STOP ALL FURTHER TESTING!
simple-t.c Example of a standard TAP unit test
skip-t.c Example where some test points are skipped
skip_all-t.c Example of a test where the entire test is skipped
@@ -24,6 +26,9 @@ To make and execute all unit tests in the directory:
make test
+Observe that the tests in the examples/ directory are just various
+examples of tests and are not expected to pass.
+
Adding unit tests
-----------------
diff --git a/unittest/examples/Makefile.am b/unittest/examples/Makefile.am
index f3c70b654a1..8aefb351220 100644
--- a/unittest/examples/Makefile.am
+++ b/unittest/examples/Makefile.am
@@ -5,5 +5,5 @@ AM_LDFLAGS = -L$(top_builddir)/unittest/mytap
LDADD = -lmytap
-noinst_PROGRAMS = simple-t skip-t todo-t skip_all-t no_plan-t
+noinst_PROGRAMS = simple-t skip-t todo-t skip_all-t no_plan-t core-t
diff --git a/unittest/examples/core-t.c b/unittest/examples/core-t.c
new file mode 100644
index 00000000000..3572d72868b
--- /dev/null
+++ b/unittest/examples/core-t.c
@@ -0,0 +1,19 @@
+
+#include "my_config.h"
+
+#include <stdlib.h>
+#include <tap.h>
+
+/*
+ This is a simple test to demonstrate what happens if a signal that
+ generates a core is raised.
+
+ Note that this test will stop all further testing!
+ */
+
+int main() {
+ plan(3);
+ ok(1, "First test");
+ abort();
+ return exit_status();
+}
diff --git a/unittest/mytap/tap.c b/unittest/mytap/tap.c
index d3f5013b4c9..17ec51863d9 100644
--- a/unittest/mytap/tap.c
+++ b/unittest/mytap/tap.c
@@ -20,10 +20,13 @@
#include "tap.h"
+#include "my_config.h"
+
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
+#include <signal.h>
/**
Test data structure.
@@ -70,7 +73,7 @@ emit_tap(int pass, char const *fmt, va_list ap)
/**
Emit a TAP directive.
- TAP directives are comments after a have the form
+ TAP directives are comments after that have the form:
@code
ok 1 # skip reason for skipping
@@ -96,6 +99,25 @@ emit_endl()
fprintf(tapout, "\n");
}
+static void
+handle_core_signal(int signo)
+{
+ BAIL_OUT("Signal %d thrown", signo);
+}
+
+void
+BAIL_OUT(char const *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ fprintf(tapout, "Bail out! ");
+ vfprintf(tapout, fmt, ap);
+ emit_endl();
+ va_end(ap);
+ exit(255);
+}
+
+
void
diag(char const *fmt, ...)
{
@@ -103,14 +125,38 @@ diag(char const *fmt, ...)
va_start(ap, fmt);
fprintf(tapout, "# ");
vfprintf(tapout, fmt, ap);
- fprintf(tapout, "\n");
+ emit_endl();
va_end(ap);
}
+typedef struct signal_entry {
+ int signo;
+ void (*handler)(int);
+} signal_entry;
+
+static signal_entry install_signal[]= {
+ { SIGQUIT, handle_core_signal },
+ { SIGILL, handle_core_signal },
+ { SIGABRT, handle_core_signal },
+ { SIGFPE, handle_core_signal },
+ { SIGSEGV, handle_core_signal },
+ { SIGBUS, handle_core_signal },
+ { SIGXCPU, handle_core_signal },
+ { SIGXFSZ, handle_core_signal },
+ { SIGSYS, handle_core_signal },
+ { SIGTRAP, handle_core_signal }
+};
void
plan(int const count)
{
+ /*
+ Install signal handler
+ */
+ size_t i;
+ for (i= 0; i < sizeof(install_signal)/sizeof(*install_signal); ++i)
+ signal(install_signal[i].signo, install_signal[i].handler);
+
g_test.plan= count;
switch (count)
{
diff --git a/unittest/mytap/tap.h b/unittest/mytap/tap.h
index cc1d0926012..51b8c7df04d 100644
--- a/unittest/mytap/tap.h
+++ b/unittest/mytap/tap.h
@@ -24,8 +24,8 @@
#include "my_global.h"
/*
- @defgroup MyTAP MySQL support for performing unit tests according to TAP.
-
+ @defgroup MyTAP MySQL support for performing unit tests according to
+ the Test Anything Protocol (TAP).
*/
#define NO_PLAN (0)
@@ -36,6 +36,7 @@
@internal We are using the "typedef struct X { ... } X" idiom to
create class/struct X both in C and C++.
*/
+
typedef struct TEST_DATA {
/**
Number of tests that is planned to execute.
@@ -67,8 +68,13 @@ extern "C" {
it was called with <code>NO_PLAN</code>, i.e., the test plan will
be printed after all the test lines.
+ The plan() function will install signal handlers for all signals
+ that generate a core, so if you want to override these signals, do
+ it <em>after</em> you have called the plan() function.
+
@param count The planned number of tests to run.
*/
+
void plan(int count);
@@ -87,9 +93,11 @@ void plan(int count);
@param fmt Format string in printf() format. NULL is allowed, in
which case nothing is printed.
*/
+
void ok(int pass, char const *fmt, ...)
__attribute__((format(printf,2,3)));
+
/**
Skip a determined number of tests.
@@ -114,6 +122,7 @@ void ok(int pass, char const *fmt, ...)
@param how_many Number of tests that are to be skipped.
@param reason A reason for skipping the tests
*/
+
void skip(int how_many, char const *reason, ...)
__attribute__((format(printf,2,3)));
@@ -130,22 +139,47 @@ void skip(int how_many, char const *reason, ...)
for (i = 0 ; i < 2 ; ++i)
ok(duck[i] == paddling, "is duck %d paddling?", i);
}
+ @endcode
@see skip
-
- @endcode
*/
+
#define SKIP_BLOCK_IF(SKIP_IF_TRUE, COUNT, REASON) \
if (SKIP_IF_TRUE) skip((COUNT),(REASON)); else
+
/**
Print a diagnostics message.
@param fmt Diagnostics message in printf() format.
*/
+
void diag(char const *fmt, ...)
__attribute__((format(printf,1,2)));
+
+/**
+ Print a bail out message.
+
+ A bail out message can be issued when no further testing can be
+ done, e.g., when there are missing dependencies.
+
+ The test will exit with status 255. This function does not return.
+
+ @code
+ BAIL_OUT("Lost connection to server %s", server_name);
+ @endcode
+
+ @note A bail out message is printed if a signal that generates a
+ core is raised.
+
+ @param fmt Bail out message in printf() format.
+*/
+
+void BAIL_OUT(char const *fmt, ...)
+ __attribute__((noreturn, format(printf,1,2)));
+
+
/**
Print summary report and return exit status.
@@ -161,6 +195,7 @@ void diag(char const *fmt, ...)
@returns EXIT_SUCCESS if all tests passed, EXIT_FAILURE if one or
more tests failed.
*/
+
int exit_status(void);
@@ -171,9 +206,11 @@ int exit_status(void);
automatically call exit(), so there is no need to have checks
around it.
*/
+
void skip_all(char const *reason, ...)
__attribute__((noreturn, format(printf, 1, 2)));
+
/**
Start section of tests that are not yet ready.
@@ -194,14 +231,18 @@ void skip_all(char const *reason, ...)
@param message Message that will be printed before the todo tests.
*/
+
void todo_start(char const *message, ...)
- __attribute__((format (printf, 1, 2)));
+ __attribute__((format(printf, 1, 2)));
+
/**
End a section of tests that are not yet ready.
*/
+
void todo_end();
+
#ifdef __cplusplus
}
#endif