Skip to content

Commit b13e26f

Browse files
committed
fixup: Merge the MockGDBServer packetLog into the existing MockGDBServerResponder's packetLog
1 parent eeb8527 commit b13e26f

File tree

3 files changed

+57
-38
lines changed

3 files changed

+57
-38
lines changed

lldb/packages/Python/lldbsuite/test/gdbclientutils.py

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import traceback
88
from enum import Enum
99
from lldbsuite.support import seven
10-
from typing import Optional, List, Tuple, Literal, Union, Sequence
10+
from typing import Optional, List, Tuple, Union, Sequence
1111

1212

1313
def checksum(message):
@@ -77,6 +77,35 @@ def hex_decode_bytes(hex_bytes):
7777
return out
7878

7979

80+
class PacketDirection(Enum):
81+
RECV = "recv"
82+
SEND = "send"
83+
84+
85+
class PacketLog:
86+
def __init__(self):
87+
self._packets: list[tuple[PacketDirection, str]] = []
88+
89+
def add_sent(self, packet: str):
90+
self._packets.append((PacketDirection.SEND, packet))
91+
92+
def add_received(self, packet: str):
93+
self._packets.append((PacketDirection.RECV, packet))
94+
95+
def get_sent(self):
96+
return [
97+
pkt for direction, pkt in self._packets if direction == PacketDirection.SEND
98+
]
99+
100+
def get_received(self):
101+
return [
102+
pkt for direction, pkt in self._packets if direction == PacketDirection.RECV
103+
]
104+
105+
def __iter__(self):
106+
return iter(self._packets)
107+
108+
80109
class MockGDBServerResponder:
81110
"""
82111
A base class for handling client packets and issuing server responses for
@@ -100,17 +129,21 @@ class SpecialResponse(Enum):
100129
type Response = Union[str, SpecialResponse]
101130

102131
def __init__(self):
103-
self.packetLog: List[str] = []
132+
self.packetLog = PacketLog()
104133

105134
def respond(self, packet: str) -> Sequence[Response]:
106135
"""
107136
Return the unframed packet data that the server should issue in response
108137
to the given packet received from the client.
109138
"""
110-
self.packetLog.append(packet)
139+
self.packetLog.add_received(packet)
111140
response = self._respond_impl(packet)
112141
if not isinstance(response, list):
113142
response = [response]
143+
for part in response:
144+
if isinstance(part, self.SpecialResponse):
145+
continue
146+
self.packetLog.add_sent(part)
114147
return response
115148

116149
def _respond_impl(self, packet) -> Union[Response, List[Response]]:
@@ -529,12 +562,10 @@ class MockGDBServer:
529562
_receivedData = None
530563
_receivedDataOffset = None
531564
_shouldSendAck = True
532-
packetLog: list[tuple[Literal["recv"] | Literal["send"], str | bytes]]
533565

534566
def __init__(self, socket):
535567
self._socket = socket
536568
self.responder = MockGDBServerResponder()
537-
self.packetLog = []
538569

539570
def start(self):
540571
# Start a thread that waits for a client connection.
@@ -661,13 +692,11 @@ def _parsePacket(self):
661692
# can start on the next packet the next time around
662693
self._receivedData = data[i:]
663694
self._receivedDataOffset = 0
664-
self.packetLog.append(("recv", packet))
665695
return packet
666696

667697
def _sendPacket(self, packet: str):
668698
assert self._socket is not None
669699
framed_packet = seven.bitcast_to_bytes(frame_packet(packet))
670-
self.packetLog.append(("send", framed_packet))
671700
self._socket.sendall(framed_packet)
672701

673702
def _handlePacket(self, packet):

lldb/packages/Python/lldbsuite/test/lldbgdbclient.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def connect(self, target, plugin="gdb-remote"):
6060
self.assertTrue(process, PROCESS_IS_VALID)
6161
return process
6262

63-
def assertPacketLogReceived(self, packets, log=None):
63+
def assertPacketLogReceived(self, packets, log: PacketLog = None):
6464
"""
6565
Assert that the mock server's packet log received the given packets.
6666
@@ -72,18 +72,20 @@ def assertPacketLogReceived(self, packets, log=None):
7272
require that they are ordered in the log as they ordered in the arg.
7373
"""
7474
if log is None:
75-
log = self.server.responder.packetLog
75+
received = self.server.responder.packetLog.get_received()
76+
else:
77+
received = log.get_received()
7678
i = 0
7779
j = 0
7880

79-
while i < len(packets) and j < len(log):
80-
if log[j] == packets[i]:
81+
while i < len(packets) and j < len(received):
82+
if received[j] == packets[i]:
8183
i += 1
8284
j += 1
8385
if i < len(packets):
8486
self.fail(
8587
"Did not receive: %s\nLast 10 packets:\n\t%s"
86-
% (packets[i], "\n\t".join(log))
88+
% (packets[i], "\n\t".join(received))
8789
)
8890

8991

lldb/test/API/functionalities/gdb_remote_client/TestGDBRemoteClient.py

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -142,29 +142,24 @@ def test_read_registers_using_g_packets(self):
142142
# But there certainly should be no p packets after the g packet.
143143

144144
self.read_registers(process)
145-
print(f"\nPACKET LOG:\n{self.server.responder.packetLog}\n")
145+
received = self.server.responder.packetLog.get_received()
146+
print(f"\nPACKET LOG:\n{received}\n")
146147
g_pos = 0
147148
try:
148-
g_pos = self.server.responder.packetLog.index("g")
149+
g_pos = received.index("g")
149150
except err:
150151
self.fail("'g' packet not found after fetching registers")
151152

152153
try:
153-
second_g = self.server.responder.packetLog.index("g", g_pos)
154+
second_g = received.index("g", g_pos + 1)
154155
self.fail("Found more than one 'g' packet")
155156
except:
156157
pass
157158

158159
# Make sure there aren't any `p` packets after the `g` packet:
159160
self.assertEqual(
160161
0,
161-
len(
162-
[
163-
p
164-
for p in self.server.responder.packetLog[g_pos:]
165-
if p.startswith("p")
166-
]
167-
),
162+
len([p for p in received[g_pos:] if p.startswith("p")]),
168163
)
169164

170165
def test_read_registers_using_p_packets(self):
@@ -177,10 +172,9 @@ def test_read_registers_using_p_packets(self):
177172
process = self.connect(target)
178173

179174
self.read_registers(process)
180-
self.assertNotIn("g", self.server.responder.packetLog)
181-
self.assertGreater(
182-
len([p for p in self.server.responder.packetLog if p.startswith("p")]), 0
183-
)
175+
received = self.server.responder.packetLog.get_received()
176+
self.assertNotIn("g", received)
177+
self.assertGreater(len([p for p in received if p.startswith("p")]), 0)
184178

185179
def test_write_registers_using_P_packets(self):
186180
"""Test writing registers using 'P' packets (default behavior)"""
@@ -189,12 +183,9 @@ def test_write_registers_using_P_packets(self):
189183
process = self.connect(target)
190184

191185
self.write_registers(process)
192-
self.assertEqual(
193-
0, len([p for p in self.server.responder.packetLog if p.startswith("G")])
194-
)
195-
self.assertGreater(
196-
len([p for p in self.server.responder.packetLog if p.startswith("P")]), 0
197-
)
186+
received = self.server.responder.packetLog.get_received()
187+
self.assertEqual(0, len([p for p in received if p.startswith("G")]))
188+
self.assertGreater(len([p for p in received if p.startswith("P")]), 0)
198189

199190
def test_write_registers_using_G_packets(self):
200191
"""Test writing registers using 'G' packets"""
@@ -209,12 +200,9 @@ def readRegister(self, register):
209200
process = self.connect(target)
210201

211202
self.write_registers(process)
212-
self.assertEqual(
213-
0, len([p for p in self.server.responder.packetLog if p.startswith("P")])
214-
)
215-
self.assertGreater(
216-
len([p for p in self.server.responder.packetLog if p.startswith("G")]), 0
217-
)
203+
received = self.server.responder.packetLog.get_received()
204+
self.assertEqual(0, len([p for p in received if p.startswith("P")]))
205+
self.assertGreater(len([p for p in received if p.startswith("G")]), 0)
218206

219207
def read_registers(self, process):
220208
self.for_each_gpr(

0 commit comments

Comments
 (0)