labath created this revision.
labath added a reviewer: tfiala.
labath added a subscriber: lldb-commits.

Some tests (Hc_then_Csignal_signals_correct_thread, at least) were sending a 
"continue" packet in
one expect_gdbremote_sequence invocation, and "expecting" the stop-reply in 
another call. This
posed a problem, because the were packets were not persisted between the two 
invocations, and if
the stub was exceptionally fast to respond, the packet would be received in the 
first invocation
(where it would be ignored) and then the second invocation would fail because 
it could not find
the packet.

Since doing matching in two invocations seems like a reasonable use of the 
packet pump, instead
of fixing the test, I make sure the packet_pump supports this usage by making 
the list of
captured packets persistent.

http://reviews.llvm.org/D18140

Files:
  packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
  packages/Python/lldbsuite/test/tools/lldb-server/lldbgdbserverutils.py
  packages/Python/lldbsuite/test/tools/lldb-server/socket_packet_pump.py

Index: packages/Python/lldbsuite/test/tools/lldb-server/socket_packet_pump.py
===================================================================
--- packages/Python/lldbsuite/test/tools/lldb-server/socket_packet_pump.py
+++ packages/Python/lldbsuite/test/tools/lldb-server/socket_packet_pump.py
@@ -26,6 +26,33 @@
         print(codecs.encode(the_queue.get(True), "string_escape"))
         print("\n")
 
+class PumpQueues(object):
+    def __init__(self):
+        self._output_queue = queue.Queue()
+        self._packet_queue = queue.Queue()
+
+    def output_queue(self):
+        return self._output_queue
+
+    def packet_queue(self):
+        return self._packet_queue
+
+    def verify_queues_empty(self):
+        # Warn if there is any content left in any of the queues.
+        # That would represent unmatched packets.
+        if not self.output_queue().empty():
+            print("warning: output queue entries still exist:")
+            _dump_queue(self.output_queue())
+            print("from here:")
+            traceback.print_stack()
+
+        if not self.packet_queue().empty():
+            print("warning: packet queue entries still exist:")
+            _dump_queue(self.packet_queue())
+            print("from here:")
+            traceback.print_stack()
+
+
 class SocketPacketPump(object):
     """A threaded packet reader that partitions packets into two streams.
 
@@ -40,18 +67,17 @@
 
     _GDB_REMOTE_PACKET_REGEX = re.compile(r'^\$([^\#]*)#[0-9a-fA-F]{2}')
 
-    def __init__(self, pump_socket, logger=None):
+    def __init__(self, pump_socket, pump_queues, logger=None):
         if not pump_socket:
             raise Exception("pump_socket cannot be None")
 
-        self._output_queue = queue.Queue()
-        self._packet_queue = queue.Queue()
         self._thread = None
         self._stop_thread = False
         self._socket = pump_socket
         self._logger = logger
         self._receive_buffer = ""
         self._accumulated_output = ""
+        self._pump_queues = pump_queues
 
     def __enter__(self):
         """Support the python 'with' statement.
@@ -66,20 +92,6 @@
         Shut down the pump thread."""
         self.stop_pump_thread()
 
-        # Warn if there is any content left in any of the queues.
-        # That would represent unmatched packets.
-        if not self.output_queue().empty():
-            print("warning: output queue entries still exist:")
-            _dump_queue(self.output_queue())
-            print("from here:")
-            traceback.print_stack()
-
-        if not self.packet_queue().empty():
-            print("warning: packet queue entries still exist:")
-            _dump_queue(self.packet_queue())
-            print("from here:")
-            traceback.print_stack()
-
     def start_pump_thread(self):
         if self._thread:
             raise Exception("pump thread is already running")
@@ -92,12 +104,6 @@
         if self._thread:
             self._thread.join()
 
-    def output_queue(self):
-        return self._output_queue
-
-    def packet_queue(self):
-        return self._packet_queue
-
     def _process_new_bytes(self, new_bytes):
         if not new_bytes:
             return
@@ -114,7 +120,7 @@
                 has_more = False
             # handle '+' ack
             elif self._receive_buffer[0] == "+":
-                self._packet_queue.put("+")
+                self._pump_queues.packet_queue().put("+")
                 self._receive_buffer = self._receive_buffer[1:]
                 if self._logger:
                     self._logger.debug(
@@ -132,10 +138,10 @@
                     if new_output_content:
                         # This was an $O packet with new content.
                         self._accumulated_output += new_output_content
-                        self._output_queue.put(self._accumulated_output)
+                        self._pump_queues.output_queue().put(self._accumulated_output)
                     else:
                         # Any packet other than $O.
-                        self._packet_queue.put(packet_match.group(0))
+                        self._pump_queues.packet_queue().put(packet_match.group(0))
 
                     # Remove the parsed packet from the receive
                     # buffer.
Index: packages/Python/lldbsuite/test/tools/lldb-server/lldbgdbserverutils.py
===================================================================
--- packages/Python/lldbsuite/test/tools/lldb-server/lldbgdbserverutils.py
+++ packages/Python/lldbsuite/test/tools/lldb-server/lldbgdbserverutils.py
@@ -154,6 +154,7 @@
     asserter,
     sock,
     test_sequence,
+    pump_queues,
     timeout_seconds,
     logger=None):
     """Replay socket communication with lldb-gdbserver and verify responses.
@@ -193,7 +194,7 @@
         return {}
 
     context = {"O_count":0, "O_content":""}
-    with socket_packet_pump.SocketPacketPump(sock, logger) as pump:
+    with socket_packet_pump.SocketPacketPump(sock, pump_queues, logger) as pump:
         # Grab the first sequence entry.
         sequence_entry = test_sequence.entries.pop(0)
         
@@ -220,14 +221,14 @@
                 if sequence_entry.is_output_matcher():
                     try:
                         # Grab next entry from the output queue.
-                        content = pump.output_queue().get(True, timeout_seconds)
+                        content = pump_queues.output_queue().get(True, timeout_seconds)
                     except queue.Empty:
                         if logger:
                             logger.warning("timeout waiting for stub output (accumulated output:{})".format(pump.get_accumulated_output()))
                         raise Exception("timed out while waiting for output match (accumulated output: {})".format(pump.get_accumulated_output()))
                 else:
                     try:
-                        content = pump.packet_queue().get(True, timeout_seconds)
+                        content = pump_queues.packet_queue().get(True, timeout_seconds)
                     except queue.Empty:
                         if logger:
                             logger.warning("timeout waiting for packet match (receive buffer: {})".format(pump.get_receive_buffer()))
Index: packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
===================================================================
--- packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
+++ packages/Python/lldbsuite/test/tools/lldb-server/gdbremote_testcase.py
@@ -75,6 +75,7 @@
         self.setUpBaseLogging()
         self._remote_server_log_file = None
         self.debug_monitor_extra_args = []
+        self._pump_queues = socket_packet_pump.PumpQueues()
 
         if self.isVerboseLoggingRequested():
             # If requested, full logs go to a log file
@@ -106,6 +107,8 @@
             self.stub_hostname = "localhost"
 
     def tearDown(self):
+        self._pump_queues.verify_queues_empty()
+
         if self._remote_server_log_file is not None:
             lldb.remote_platform.Get(lldb.SBFileSpec(self._remote_server_log_file),
                     lldb.SBFileSpec(self.getLocalServerLogFile()))
@@ -603,7 +606,8 @@
     def expect_gdbremote_sequence(self, timeout_seconds=None):
         if not timeout_seconds:
             timeout_seconds = self._TIMEOUT_SECONDS
-        return expect_lldb_gdbserver_replay(self, self.sock, self.test_sequence, timeout_seconds, self.logger)
+        return expect_lldb_gdbserver_replay(self, self.sock, self.test_sequence,
+                self._pump_queues, timeout_seconds, self.logger)
 
     _KNOWN_REGINFO_KEYS = [
         "name",
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to