aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2017-05-26 11:56:58 +0100
committerYao Qi <yao.qi@linaro.org>2017-06-20 11:34:13 +0100
commit809ac8acb172bf2cb05dd8a6b1f72cd38f3e58fa (patch)
treec517e0546c123de94c9a09fdfd5a82efec1bd813
parente45a9c42f78b648a694070acdf89acb1fbaee564 (diff)
downloadgdb-809ac8acb172bf2cb05dd8a6b1f72cd38f3e58fa.zip
gdb-809ac8acb172bf2cb05dd8a6b1f72cd38f3e58fa.tar.gz
gdb-809ac8acb172bf2cb05dd8a6b1f72cd38f3e58fa.tar.bz2
[RFC] GDBserver self test
This patch uses GDB self test in GDBserver. The self tests are run if GDBserver is started with option --self-test. gdb/gdbserver: 2017-05-26 Yao Qi <yao.qi@linaro.org> * configure.ac: AC_DEFINE GDB_SELF_TEST if $development. * configure, config.in: Re-generated. * server.c: Include sefltest.h and selftest.c. (captured_main): Handle option --self-test. gdb: 2017-05-26 Yao Qi <yao.qi@linaro.org> * selftest.c: Adjust it for GDBserver. gdb/testsuite: 2017-05-26 Yao Qi <yao.qi@linaro.org> * gdb.server/unittest.exp: New.
-rw-r--r--gdb/gdbserver/config.in3
-rwxr-xr-xgdb/gdbserver/configure6
-rw-r--r--gdb/gdbserver/configure.ac5
-rw-r--r--gdb/gdbserver/server.c18
-rw-r--r--gdb/selftest.c18
-rw-r--r--gdb/testsuite/gdb.server/unittest.exp41
6 files changed, 89 insertions, 2 deletions
diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in
index 34a7443..5dacbac 100644
--- a/gdb/gdbserver/config.in
+++ b/gdb/gdbserver/config.in
@@ -8,6 +8,9 @@
/* Define to 1 if using `alloca.c'. */
#undef C_ALLOCA
+/* Define if self-testing features should be enabled */
+#undef GDB_SELF_TEST
+
/* Define to 1 if you have `alloca', as a function or macro. */
#undef HAVE_ALLOCA
diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure
index 35aeabc..30aa95b 100755
--- a/gdb/gdbserver/configure
+++ b/gdb/gdbserver/configure
@@ -5813,6 +5813,12 @@ fi
fi
+if $development; then
+
+$as_echo "#define GDB_SELF_TEST 1" >>confdefs.h
+
+fi
+
case ${build_alias} in
"") build_noncanonical=${build} ;;
*) build_noncanonical=${build_alias} ;;
diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac
index 4ea7913..36e21c5 100644
--- a/gdb/gdbserver/configure.ac
+++ b/gdb/gdbserver/configure.ac
@@ -56,6 +56,11 @@ else
fi
GDB_AC_LIBMCHECK(${libmcheck_default})
+if $development; then
+ AC_DEFINE(GDB_SELF_TEST, 1,
+ [Define if self-testing features should be enabled])
+fi
+
ACX_NONCANONICAL_TARGET
ACX_NONCANONICAL_HOST
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index 1d7a8b0..d0dcbee 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -3507,6 +3507,9 @@ detach_or_kill_for_exit_cleanup (void *ignore)
END_CATCH
}
+#include "../selftest.h"
+#include "../selftest.c"
+
/* Main function. This is called by the real "main" function,
wrapped in a TRY_CATCH that handles any uncaught exceptions. */
@@ -3521,6 +3524,7 @@ captured_main (int argc, char *argv[])
volatile int multi_mode = 0;
volatile int attach = 0;
int was_running;
+ bool selftest = false;
while (*next_arg != NULL && **next_arg == '-')
{
@@ -3639,6 +3643,11 @@ captured_main (int argc, char *argv[])
startup_with_shell = false;
else if (strcmp (*next_arg, "--once") == 0)
run_once = 1;
+ else if (strcmp (*next_arg, "--self-test") == 0)
+ {
+ selftest = true;
+ break;
+ }
else
{
fprintf (stderr, "Unknown argument: %s\n", *next_arg);
@@ -3654,7 +3663,8 @@ captured_main (int argc, char *argv[])
port = *next_arg;
next_arg++;
}
- if (port == NULL || (!attach && !multi_mode && *next_arg == NULL))
+ if ((port == NULL || (!attach && !multi_mode && *next_arg == NULL))
+ && !selftest)
{
gdbserver_usage (stderr);
exit (1);
@@ -3712,6 +3722,12 @@ captured_main (int argc, char *argv[])
own_buf = (char *) xmalloc (PBUFSIZ + 1);
mem_buf = (unsigned char *) xmalloc (PBUFSIZ);
+ if (selftest)
+ {
+ run_self_tests ();
+ throw_quit ("Quit");
+ }
+
if (pid == 0 && *next_arg != NULL)
{
int i, n;
diff --git a/gdb/selftest.c b/gdb/selftest.c
index 14b76f6..c947749 100644
--- a/gdb/selftest.c
+++ b/gdb/selftest.c
@@ -15,8 +15,15 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
+#include "config.h"
+#ifdef GDBSERVER
+#define QUIT do {} while (0)
+#else
#include "defs.h"
+#endif
+#include "common-defs.h"
+#include "common-exceptions.h"
+#include "common-debug.h"
#include "selftest.h"
#include <vector>
@@ -50,15 +57,24 @@ run_self_tests (void)
CATCH (ex, RETURN_MASK_ERROR)
{
++failed;
+ #ifndef GDBSERVER
exception_fprintf (gdb_stderr, ex, _("Self test failed: "));
+ #endif
}
END_CATCH
+#ifndef GDBSERVER
/* Clear GDB internal state. */
registers_changed ();
reinit_frame_cache ();
+#endif
}
+ #ifdef GDBSERVER
+ debug_printf ("Ran %lu unit tests, %d failed\n",
+ (long) tests.size (), failed);
+ #else
printf_filtered (_("Ran %lu unit tests, %d failed\n"),
(long) tests.size (), failed);
+ #endif
}
diff --git a/gdb/testsuite/gdb.server/unittest.exp b/gdb/testsuite/gdb.server/unittest.exp
new file mode 100644
index 0000000..6dc4b6e
--- /dev/null
+++ b/gdb/testsuite/gdb.server/unittest.exp
@@ -0,0 +1,41 @@
+# This testcase is part of GDB, the GNU debugger.
+
+# Copyright 2017 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+load_lib gdbserver-support.exp
+
+standard_testfile
+
+if { [skip_gdbserver_tests] } {
+ return 0
+}
+
+global server_spawn_id
+
+set gdbserver [find_gdbserver]
+set gdbserver_command "$gdbserver --self-test"
+
+set server_spawn_id [remote_spawn target $gdbserver_command]
+
+gdb_expect {
+ -i $server_spawn_id
+ -re "Ran $decimal unit tests, 0 failed" {
+ pass "unit tests"
+ }
+ -re "Ran $decimal unit tests, $decimal failed" {
+ fail "unit tests"
+ }
+}