summaryrefslogtreecommitdiff
path: root/unittest
diff options
context:
space:
mode:
authormkindahl@production.mysql.com[mkindahl] <>2006-08-25 13:53:16 +0200
committermkindahl@production.mysql.com[mkindahl] <>2006-08-25 13:53:16 +0200
commit794dba439e6d4fe748e42457e9d5ab63807da81c (patch)
tree40f1768c74aae4d307ce161e2ecc33463c0a9f81 /unittest
parent317bc36fd991ddfab447917015af3a66105f9462 (diff)
downloadmariadb-git-794dba439e6d4fe748e42457e9d5ab63807da81c.tar.gz
mytap-changes.patch
Diffstat (limited to 'unittest')
-rw-r--r--unittest/Makefile.am7
-rw-r--r--unittest/README.txt7
-rw-r--r--unittest/examples/Makefile.am2
-rw-r--r--unittest/mytap/tap.c50
-rw-r--r--unittest/mytap/tap.h27
5 files changed, 81 insertions, 12 deletions
diff --git a/unittest/Makefile.am b/unittest/Makefile.am
index ca3291efde0..6cca1165cfe 100644
--- a/unittest/Makefile.am
+++ b/unittest/Makefile.am
@@ -6,10 +6,9 @@ CLEANFILES = unit
unittests = mytap mysys
-test: unit
- ./unit run $(unittests)
+test:
+ perl unit.pl run $(unittests)
unit: $(srcdir)/unit.pl
- cp $(srcdir)/unit.pl $@
- chmod 700 $@
+ install $(srcdir)/unit.pl $@
diff --git a/unittest/README.txt b/unittest/README.txt
index 0d8bb9025d8..cefa8753f8f 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/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..5e24c1c8c99 100644
--- a/unittest/mytap/tap.h
+++ b/unittest/mytap/tap.h
@@ -21,8 +21,6 @@
#ifndef TAP_H
#define TAP_H
-#include "my_global.h"
-
/*
@defgroup MyTAP MySQL support for performing unit tests according to TAP.
@@ -67,6 +65,10 @@ 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);
@@ -130,10 +132,9 @@ 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
@@ -147,6 +148,24 @@ 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.
+
+ @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.
This function will print a summary report of how many tests passed,