gdb-remote test noise suppression on MacOSX.
authorTodd Fiala <todd.fiala@gmail.com>
Wed, 16 Jul 2014 16:15:42 +0000 (16:15 +0000)
committerTodd Fiala <todd.fiala@gmail.com>
Wed, 16 Jul 2014 16:15:42 +0000 (16:15 +0000)
This change adds a member to the base test case for gdb-remote that
indicates whether a stub makes two X stop notification reports on kill
commands.  This is set to true for debugserver tests.

The test for killing an attached process after it's first stop notification
has been modified to look at that flag and add an extra X packet matcher
so the "unmatched packet warning" doesn't get emitted for the second X on
MacOSX with debugserver.

I also broke those tests out of the monolithic TestLldbGdbServer mega test
case and put it in its own, new TestGdbRemoteKill.py file and test case.

Tested:
Ubuntu 14.04 x86_64, clang-3.5 built lldb, no test failures.
MacOSX 10.9.4, Xcode 6.0 Beta 3 built lldb, no test failures.

llvm-svn: 213166

lldb/test/tools/lldb-gdbserver/TestGdbRemoteKill.py [new file with mode: 0644]
lldb/test/tools/lldb-gdbserver/TestLldbGdbServer.py
lldb/test/tools/lldb-gdbserver/gdbremote_testcase.py

diff --git a/lldb/test/tools/lldb-gdbserver/TestGdbRemoteKill.py b/lldb/test/tools/lldb-gdbserver/TestGdbRemoteKill.py
new file mode 100644 (file)
index 0000000..121093a
--- /dev/null
@@ -0,0 +1,49 @@
+import unittest2
+
+import gdbremote_testcase
+import lldbgdbserverutils
+
+from lldbtest import *
+
+class TestGdbRemoteKill(gdbremote_testcase.GdbRemoteTestCaseBase):
+    def attach_commandline_kill_after_initial_stop(self):
+        procs = self.prep_debug_monitor_and_inferior()
+        self.test_sequence.add_log_lines([
+            "read packet: $k#6b",
+            {"direction":"send", "regex":r"^\$X[0-9a-fA-F]+([^#]*)#[0-9A-Fa-f]{2}" },
+            ], True)
+
+        if self.stub_sends_two_stop_notifications_on_kill:
+            # Add an expectation for a second X result for stubs that send two of these.
+            self.test_sequence.add_log_lines([
+                {"direction":"send", "regex":r"^\$X[0-9a-fA-F]+([^#]*)#[0-9A-Fa-f]{2}" },
+                ], True)
+
+        self.expect_gdbremote_sequence()
+
+        # Wait a moment for completed and now-detached inferior process to clear.
+        time.sleep(1)
+
+        # Process should be dead now.  Reap results.
+        poll_result = procs["inferior"].poll()
+        self.assertIsNotNone(poll_result)
+
+        # Where possible, verify at the system level that the process is not running.
+        self.assertFalse(lldbgdbserverutils.process_is_running(procs["inferior"].pid, False))
+
+    @debugserver_test
+    @dsym_test
+    def test_attach_commandline_kill_after_initial_stop_debugserver_dsym(self):
+        self.init_debugserver_test()
+        self.buildDsym()
+        self.set_inferior_startup_attach()
+        self.attach_commandline_kill_after_initial_stop()
+
+    @llgs_test
+    @dwarf_test
+    def test_attach_commandline_kill_after_initial_stop_llgs_dwarf(self):
+        self.init_llgs_test()
+        self.buildDwarf()
+        self.set_inferior_startup_attach()
+        self.attach_commandline_kill_after_initial_stop()
+
index d45589c..56f542d 100644 (file)
@@ -406,40 +406,6 @@ class LldbGdbServerTestCase(gdbremote_testcase.GdbRemoteTestCaseBase):
         self.set_inferior_startup_attach()
         self.attach_commandline_continue_app_exits()
 
-    def attach_commandline_kill_after_initial_stop(self):
-        procs = self.prep_debug_monitor_and_inferior()
-        self.test_sequence.add_log_lines(
-            ["read packet: $k#6b",
-             "send packet: $X09#00"],
-            True)
-        self.expect_gdbremote_sequence()
-
-        # Wait a moment for completed and now-detached inferior process to clear.
-        time.sleep(1)
-
-        # Process should be dead now.  Reap results.
-        poll_result = procs["inferior"].poll()
-        self.assertIsNotNone(poll_result)
-
-        # Where possible, verify at the system level that the process is not running.
-        self.assertFalse(lldbgdbserverutils.process_is_running(procs["inferior"].pid, False))
-
-    @debugserver_test
-    @dsym_test
-    def test_attach_commandline_kill_after_initial_stop_debugserver_dsym(self):
-        self.init_debugserver_test()
-        self.buildDsym()
-        self.set_inferior_startup_attach()
-        self.attach_commandline_kill_after_initial_stop()
-
-    @llgs_test
-    @dwarf_test
-    def test_attach_commandline_kill_after_initial_stop_llgs_dwarf(self):
-        self.init_llgs_test()
-        self.buildDwarf()
-        self.set_inferior_startup_attach()
-        self.attach_commandline_kill_after_initial_stop()
-
     def qRegisterInfo_returns_one_valid_result(self):
         server = self.connect_to_debug_monitor()
         self.assertIsNotNone(server)
index fe23b5a..b0e9512 100644 (file)
@@ -55,6 +55,7 @@ class GdbRemoteTestCaseBase(TestBase):
         self.named_pipe_path = None
         self.named_pipe = None
         self.named_pipe_fd = None
+        self.stub_sends_two_stop_notifications_on_kill = False
 
     def get_next_port(self):
         return 12000 + random.randint(0,3999)
@@ -142,6 +143,9 @@ class GdbRemoteTestCaseBase(TestBase):
         self.debug_monitor_extra_args = " --log-file=/tmp/packets-{}.log --log-flags=0x800000".format(self._testMethodName)
         if use_named_pipe:
             (self.named_pipe_path, self.named_pipe, self.named_pipe_fd) = self.create_named_pipe()
+        # The debugserver stub has a race on handling the 'k' command, so it sends an X09 right away, then sends the real X notification
+        # when the process truly dies.
+        self.stub_sends_two_stop_notifications_on_kill = True
 
     def create_socket(self):
         sock = socket.socket()