Index: lldb/trunk/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/TestGDBRemoteClient.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/TestGDBRemoteClient.py +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/TestGDBRemoteClient.py @@ -1,4 +1,5 @@ import lldb +import binascii from lldbsuite.test.lldbtest import * from lldbsuite.test.decorators import * from gdbclientutils import * @@ -25,7 +26,7 @@ # Then, when we are asked to attach, error out. def vAttach(self, pid): - return "E42;" + error_msg.encode("hex") + return "E42;" + binascii.hexlify(error_msg.encode()).decode() self.server.responder = MyResponder() Index: lldb/trunk/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/gdbclientutils.py =================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/gdbclientutils.py +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/gdb_remote_client/gdbclientutils.py @@ -76,7 +76,7 @@ class MockGDBServerResponder: """ - A base class for handing client packets and issuing server responses for + A base class for handling client packets and issuing server responses for GDB tests. This handles many typical situations, while still allowing subclasses to @@ -278,10 +278,14 @@ data = self._client.recv(4096) if data is None or len(data) == 0: break + # In Python 2, sockets return byte strings. In Python 3, sockets return bytes. + # If we got bytes (and not a byte string), decode them to a string for later handling. + if isinstance(data, bytes) and not isinstance(data, str): + data = data.decode() + self._receive(data) except Exception as e: self._client.close() break - self._receive(data) def _receive(self, data): """ @@ -329,7 +333,7 @@ i += 1 else: raise self.InvalidPacketException( - "Unexexpected leading byte: %s" % data[0]) + "Unexpected leading byte: %s" % data[0]) # If we're looking beyond the start of the received data, then we're # looking for the end of the packet content, denoted by a #. @@ -370,9 +374,9 @@ return response = "" # We'll handle the ack stuff here since it's not something any of the - # tests will be concerned about, and it'll get turned off quicly anyway. + # tests will be concerned about, and it'll get turned off quickly anyway. if self._shouldSendAck: - self._client.sendall('+') + self._client.sendall('+'.encode()) if packet == "QStartNoAckMode": self._shouldSendAck = False response = "OK" @@ -382,6 +386,10 @@ # Handle packet framing since we don't want to bother tests with it. if response is not None: framed = frame_packet(response) + # In Python 2, sockets send byte strings. In Python 3, sockets send bytes. + # If we got a string (and not a byte string), encode it before sending. + if isinstance(framed, str) and not isinstance(framed, bytes): + framed = framed.encode() self._client.sendall(framed) PACKET_ACK = object() @@ -459,6 +467,7 @@ i = 0 j = 0 log = self.server.responder.packetLog + while i < len(packets) and j < len(log): if log[j] == packets[i]: i += 1 Index: lldb/trunk/unittests/Utility/LogTest.cpp =================================================================== --- lldb/trunk/unittests/Utility/LogTest.cpp +++ lldb/trunk/unittests/Utility/LogTest.cpp @@ -225,12 +225,17 @@ EXPECT_EQ(1, sscanf(Msg.str().c_str(), "%d Hello World", &seq_no)); } - EXPECT_TRUE(EnableChannel(getStream(), LLDB_LOG_OPTION_PREPEND_FILE_FUNCTION, - "chan", {}, Err)); - EXPECT_EQ( - "LogTest.cpp:logAndTakeOutput Hello " - "World\n", - logAndTakeOutput("Hello World")); + { + EXPECT_TRUE(EnableChannel(getStream(), LLDB_LOG_OPTION_PREPEND_FILE_FUNCTION, + "chan", {}, Err)); + llvm::StringRef Msg = logAndTakeOutput("Hello World"); + char File[12]; + char Function[17]; + + sscanf(Msg.str().c_str(), "%[^:]:%s Hello World", File, Function); + EXPECT_STRCASEEQ("LogTest.cpp", File); + EXPECT_STREQ("logAndTakeOutput", Function); + } EXPECT_TRUE(EnableChannel( getStream(), LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD, "chan", {}, Err));