mgorny created this revision. mgorny added reviewers: labath, emaste, krytarowski. mgorny requested review of this revision.
The TestGdbRemote_vContThreads.py were introduced to test NetBSD process plugin's capability of sending per-thread and per-process signals. However, at some point the tests started failing. From retrospective, it is possible that they were relying on some bug in the plugin's original signal handling. Fix the tests not to expect the process to terminate after receiving the signals. Instead, scan for output indicating that the signals were received and match thread IDs in it. Enable 'signal to all threads' test everywhere as it works fine on Linux. Add a new test for vCont packet without specific thread IDs. While this does not fix all the problems on NetBSD, it enables a subset of the tests on other systems. I am planning to add more tests to the group while implementing multiprocess extension for vCont. https://reviews.llvm.org/D98749 Files: lldb/test/API/tools/lldb-server/TestGdbRemote_vContThreads.py Index: lldb/test/API/tools/lldb-server/TestGdbRemote_vContThreads.py =================================================================== --- lldb/test/API/tools/lldb-server/TestGdbRemote_vContThreads.py +++ lldb/test/API/tools/lldb-server/TestGdbRemote_vContThreads.py @@ -31,6 +31,28 @@ self.reset_test_sequence() return threads + @expectedFailureNetBSD + def test_signal_process_without_tid(self): + self.build() + self.set_inferior_startup_launch() + + threads = self.start_threads(1) + self.test_sequence.add_log_lines([ + "read packet: $vCont;C{0:x}#00".format( + lldbutil.get_signal_number('SIGUSR1')), + {"type": "output_match", + "regex": self.maybe_strict_output_regex( + r"received SIGUSR1 on thread id: ([0-9a-f]+)\r\n" + r"received SIGUSR1 on thread id: ([0-9a-f]+)\r\n"), + "capture": {1: "tid1", 2: "tid2"}, + }, + ], True) + + context = self.expect_gdbremote_sequence() + self.assertIsNotNone(context) + tids = sorted(int(context[x], 16) for x in ("tid1", "tid2")) + self.assertEqual(tids, sorted(threads)) + @skipUnlessPlatform(["netbsd"]) @expectedFailureNetBSD def test_signal_one_thread(self): @@ -42,13 +64,17 @@ self.test_sequence.add_log_lines([ "read packet: $vCont;C{0:x}:{1:x};c#00".format( lldbutil.get_signal_number('SIGUSR1'), threads[0]), - {"direction": "send", "regex": r"^\$W00#b7$"}, + {"type": "output_match", + "regex": self.maybe_strict_output_regex( + r"received SIGUSR1 on thread id: ([0-9a-f]+)\r\n"), + "capture": {1: "tid"}, + }, ], True) context = self.expect_gdbremote_sequence() self.assertIsNotNone(context) + self.assertEqual(int(context["tid"], 16), threads[0]) - @skipUnlessPlatform(["netbsd"]) @expectedFailureNetBSD def test_signal_all_threads(self): self.build() @@ -60,11 +86,18 @@ "read packet: $vCont;C{0:x}:{1:x};C{0:x}:{2:x}#00".format( lldbutil.get_signal_number('SIGUSR1'), threads[0], threads[1]), - {"direction": "send", "regex": r"^\$W00#b7$"}, + {"type": "output_match", + "regex": self.maybe_strict_output_regex( + r"received SIGUSR1 on thread id: ([0-9a-f]+)\r\n" + r"received SIGUSR1 on thread id: ([0-9a-f]+)\r\n"), + "capture": {1: "tid1", 2: "tid2"}, + }, ], True) context = self.expect_gdbremote_sequence() self.assertIsNotNone(context) + tids = sorted(int(context[x], 16) for x in ("tid1", "tid2")) + self.assertEqual(tids, sorted(threads)) @skipUnlessPlatform(["netbsd"]) def test_signal_two_of_three_threads(self):
Index: lldb/test/API/tools/lldb-server/TestGdbRemote_vContThreads.py =================================================================== --- lldb/test/API/tools/lldb-server/TestGdbRemote_vContThreads.py +++ lldb/test/API/tools/lldb-server/TestGdbRemote_vContThreads.py @@ -31,6 +31,28 @@ self.reset_test_sequence() return threads + @expectedFailureNetBSD + def test_signal_process_without_tid(self): + self.build() + self.set_inferior_startup_launch() + + threads = self.start_threads(1) + self.test_sequence.add_log_lines([ + "read packet: $vCont;C{0:x}#00".format( + lldbutil.get_signal_number('SIGUSR1')), + {"type": "output_match", + "regex": self.maybe_strict_output_regex( + r"received SIGUSR1 on thread id: ([0-9a-f]+)\r\n" + r"received SIGUSR1 on thread id: ([0-9a-f]+)\r\n"), + "capture": {1: "tid1", 2: "tid2"}, + }, + ], True) + + context = self.expect_gdbremote_sequence() + self.assertIsNotNone(context) + tids = sorted(int(context[x], 16) for x in ("tid1", "tid2")) + self.assertEqual(tids, sorted(threads)) + @skipUnlessPlatform(["netbsd"]) @expectedFailureNetBSD def test_signal_one_thread(self): @@ -42,13 +64,17 @@ self.test_sequence.add_log_lines([ "read packet: $vCont;C{0:x}:{1:x};c#00".format( lldbutil.get_signal_number('SIGUSR1'), threads[0]), - {"direction": "send", "regex": r"^\$W00#b7$"}, + {"type": "output_match", + "regex": self.maybe_strict_output_regex( + r"received SIGUSR1 on thread id: ([0-9a-f]+)\r\n"), + "capture": {1: "tid"}, + }, ], True) context = self.expect_gdbremote_sequence() self.assertIsNotNone(context) + self.assertEqual(int(context["tid"], 16), threads[0]) - @skipUnlessPlatform(["netbsd"]) @expectedFailureNetBSD def test_signal_all_threads(self): self.build() @@ -60,11 +86,18 @@ "read packet: $vCont;C{0:x}:{1:x};C{0:x}:{2:x}#00".format( lldbutil.get_signal_number('SIGUSR1'), threads[0], threads[1]), - {"direction": "send", "regex": r"^\$W00#b7$"}, + {"type": "output_match", + "regex": self.maybe_strict_output_regex( + r"received SIGUSR1 on thread id: ([0-9a-f]+)\r\n" + r"received SIGUSR1 on thread id: ([0-9a-f]+)\r\n"), + "capture": {1: "tid1", 2: "tid2"}, + }, ], True) context = self.expect_gdbremote_sequence() self.assertIsNotNone(context) + tids = sorted(int(context[x], 16) for x in ("tid1", "tid2")) + self.assertEqual(tids, sorted(threads)) @skipUnlessPlatform(["netbsd"]) def test_signal_two_of_three_threads(self):
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits