From: Tom de Vries via Gdb-patches <gdb-patches@sourceware.org>
To: gdb-patches@sourceware.org
Subject: [PATCH][gdb/testsuite] Reimplement gdb.gdb/python-interrupts.exp as unittest
Date: Sat, 11 Sep 2021 14:02:56 +0200 [thread overview]
Message-ID: <20210911120254.GA19083@delia.home> (raw)
Hi,
The test-case gdb.gdb/python-interrupts.exp:
- runs to captured_command_loop
- sets a breakpoint at set_active_ext_lang
- calls a python command
- verifies the command triggers the breakpoint
- sends a signal and verifies the result
The test-case is fragile, because (f.i. with -flto) it cannot be guaranteed
that captured_command_loop and set_active_ext_lang are available for setting
breakpoints.
Reimplement the test-case as unittest, using:
- execute_command_to_string to capture the output
- try/catch to catch the "Error while executing Python code" exception
- a new hook selftests::hook_set_active_ext_lang to raise the signal
Tested on x86_64-linux.
Any comments?
Thanks,
- Tom
[gdb/testsuite] Reimplement gdb.gdb/python-interrupts.exp as unittest
---
gdb/extension.c | 12 +++++++++++
gdb/python/python.c | 62 ++++++++++++++++++++++++++++++++++++++++-------------
2 files changed, 59 insertions(+), 15 deletions(-)
diff --git a/gdb/extension.c b/gdb/extension.c
index 27dce9befa0..3edecb21d6b 100644
--- a/gdb/extension.c
+++ b/gdb/extension.c
@@ -682,6 +682,13 @@ install_gdb_sigint_handler (struct signal_handler *previous)
previous->handler_saved = 0;
}
+#if GDB_SELF_TEST
+namespace selftests {
+extern void (*hook_set_active_ext_lang) (void);
+void (*hook_set_active_ext_lang) (void) = nullptr;
+}
+#endif
+
/* Set the currently active extension language to NOW_ACTIVE.
The result is a pointer to a malloc'd block of memory to pass to
restore_active_ext_lang.
@@ -708,6 +715,11 @@ install_gdb_sigint_handler (struct signal_handler *previous)
struct active_ext_lang_state *
set_active_ext_lang (const struct extension_language_defn *now_active)
{
+#if GDB_SELF_TEST
+ if (selftests::hook_set_active_ext_lang)
+ selftests::hook_set_active_ext_lang ();
+#endif
+
struct active_ext_lang_state *previous
= XCNEW (struct active_ext_lang_state);
diff --git a/gdb/python/python.c b/gdb/python/python.c
index 34c1be76a16..b17b6b69268 100644
--- a/gdb/python/python.c
+++ b/gdb/python/python.c
@@ -1883,6 +1883,14 @@ do_start_initialization ()
#if GDB_SELF_TEST
namespace selftests {
+extern void (*hook_set_active_ext_lang) (void);
+
+static void
+raise_sigint (void)
+{
+ raise (SIGINT);
+}
+
/* Entry point for python unit tests. */
static void
@@ -1897,21 +1905,45 @@ test_python ()
output.clear ();
bool saw_exception = false;
- scoped_restore reset_gdb_python_initialized
- = make_scoped_restore (&gdb_python_initialized, 0);
- try
- {
- CMD (output);
- }
- catch (const gdb_exception &e)
- {
- saw_exception = true;
- SELF_CHECK (e.reason == RETURN_ERROR);
- SELF_CHECK (e.error == GENERIC_ERROR);
- SELF_CHECK (*e.message == "Python not initialized");
- }
- SELF_CHECK (saw_exception);
- SELF_CHECK (output.empty ());
+ {
+ scoped_restore reset_gdb_python_initialized
+ = make_scoped_restore (&gdb_python_initialized, 0);
+ try
+ {
+ CMD (output);
+ }
+ catch (const gdb_exception &e)
+ {
+ saw_exception = true;
+ SELF_CHECK (e.reason == RETURN_ERROR);
+ SELF_CHECK (e.error == GENERIC_ERROR);
+ SELF_CHECK (*e.message == "Python not initialized");
+ }
+ SELF_CHECK (saw_exception);
+ SELF_CHECK (output.empty ());
+ }
+
+ saw_exception = false;
+ {
+ scoped_restore save_hook
+ = make_scoped_restore (&hook_set_active_ext_lang, raise_sigint);
+ try
+ {
+ CMD (output);
+ }
+ catch (const gdb_exception &e)
+ {
+ saw_exception = true;
+ SELF_CHECK (e.reason == RETURN_ERROR);
+ SELF_CHECK (e.error == GENERIC_ERROR);
+ SELF_CHECK (*e.message == "Error while executing Python code.");
+ }
+ SELF_CHECK (saw_exception);
+ std::string ref_output("Traceback (most recent call last):\n"
+ " File \"<string>\", line 1, in <module>\n"
+ "KeyboardInterrupt\n");
+ SELF_CHECK (output == ref_output);
+ }
#undef CMD
}
next reply other threads:[~2021-09-11 12:03 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-11 12:02 Tom de Vries via Gdb-patches [this message]
2021-09-22 10:17 ` Tom de Vries via Gdb-patches
2021-10-07 14:36 ` [PING][PATCH][gdb/testsuite] " Tom de Vries via Gdb-patches
2021-10-19 18:10 ` [PATCH][gdb/testsuite] " Tom Tromey
2021-10-19 22:00 ` Tom de Vries via Gdb-patches
2021-10-19 18:09 ` Tom Tromey
2021-10-19 21:56 ` Tom de Vries via Gdb-patches
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210911120254.GA19083@delia.home \
--to=gdb-patches@sourceware.org \
--cc=tdevries@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox