Skip to content

Commit a6d91fb

Browse files
committed
Make packet builder tests more realistic
Real usage of QuicPacketBuilder involve call to `start_packet()` for which no frames actually get written.
1 parent 33e4cf2 commit a6d91fb

File tree

1 file changed

+92
-9
lines changed

1 file changed

+92
-9
lines changed

tests/test_packet_builder.py

Lines changed: 92 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from typing import List
12
from unittest import TestCase
23

34
from aioquic.quic.configuration import SMALLEST_MAX_DATAGRAM_SIZE
@@ -38,6 +39,10 @@ def create_crypto():
3839
return crypto
3940

4041

42+
def datagram_sizes(datagrams: List[bytes]) -> List[int]:
43+
return [len(x) for x in datagrams]
44+
45+
4146
class QuicPacketBuilderTest(TestCase):
4247
def test_long_header_empty(self):
4348
builder = create_builder()
@@ -55,7 +60,7 @@ def test_long_header_empty(self):
5560
# check builder
5661
self.assertEqual(builder.packet_number, 0)
5762

58-
def test_long_header_padding(self):
63+
def test_long_header_initial_client(self):
5964
builder = create_builder(is_client=True)
6065
crypto = create_crypto()
6166

@@ -72,8 +77,7 @@ def test_long_header_padding(self):
7277

7378
# check datagrams
7479
datagrams, packets = builder.flush()
75-
self.assertEqual(len(datagrams), 1)
76-
self.assertEqual(len(datagrams[0]), 1200)
80+
self.assertEqual(datagram_sizes(datagrams), [1200])
7781
self.assertEqual(
7882
packets,
7983
[
@@ -103,7 +107,7 @@ def test_long_header_initial_client_2(self):
103107
buf.push_bytes(bytes(builder.remaining_flight_space))
104108
self.assertFalse(builder.packet_is_empty)
105109

106-
# INITIAL
110+
# INITIAL, full length
107111
builder.start_packet(PACKET_TYPE_INITIAL, crypto)
108112
self.assertEqual(builder.remaining_flight_space, 1156)
109113
buf = builder.start_frame(QuicFrameType.CRYPTO)
@@ -116,9 +120,7 @@ def test_long_header_initial_client_2(self):
116120

117121
# check datagrams
118122
datagrams, packets = builder.flush()
119-
self.assertEqual(len(datagrams), 2)
120-
self.assertEqual(len(datagrams[0]), 1200)
121-
self.assertEqual(len(datagrams[1]), 1200)
123+
self.assertEqual(datagram_sizes(datagrams), [1200, 1200])
122124
self.assertEqual(
123125
packets,
124126
[
@@ -150,6 +152,84 @@ def test_long_header_initial_server(self):
150152
builder = create_builder()
151153
crypto = create_crypto()
152154

155+
# INITIAL with ACK + CRYPTO + PADDING
156+
builder.start_packet(PACKET_TYPE_INITIAL, crypto)
157+
self.assertEqual(builder.remaining_flight_space, 1156)
158+
159+
buf = builder.start_frame(QuicFrameType.ACK)
160+
buf.push_bytes(bytes(16))
161+
162+
buf = builder.start_frame(QuicFrameType.CRYPTO)
163+
buf.push_bytes(bytes(100))
164+
self.assertFalse(builder.packet_is_empty)
165+
166+
# INITIAL, empty
167+
builder.start_packet(PACKET_TYPE_INITIAL, crypto)
168+
self.assertTrue(builder.packet_is_empty)
169+
170+
# HANDSHAKE with CRYPTO
171+
builder.start_packet(PACKET_TYPE_HANDSHAKE, crypto)
172+
self.assertEqual(builder.remaining_flight_space, 1157)
173+
174+
buf = builder.start_frame(QuicFrameType.CRYPTO)
175+
buf.push_bytes(bytes(1156))
176+
self.assertFalse(builder.packet_is_empty)
177+
178+
# HANDSHAKE with CRYPTO
179+
builder.start_packet(PACKET_TYPE_HANDSHAKE, crypto)
180+
self.assertEqual(builder.remaining_flight_space, 1157)
181+
182+
buf = builder.start_frame(QuicFrameType.CRYPTO)
183+
buf.push_bytes(bytes(800))
184+
self.assertFalse(builder.packet_is_empty)
185+
186+
# HANDSHAKE, empty
187+
builder.start_packet(PACKET_TYPE_HANDSHAKE, crypto)
188+
self.assertTrue(builder.packet_is_empty)
189+
190+
# check datagrams
191+
datagrams, packets = builder.flush()
192+
self.assertEqual(datagram_sizes(datagrams), [1200, 1200, 844])
193+
self.assertEqual(
194+
packets,
195+
[
196+
QuicSentPacket(
197+
epoch=Epoch.INITIAL,
198+
in_flight=True,
199+
is_ack_eliciting=True,
200+
is_crypto_packet=True,
201+
packet_number=0,
202+
packet_type=PACKET_TYPE_INITIAL,
203+
sent_bytes=1200,
204+
),
205+
QuicSentPacket(
206+
epoch=Epoch.HANDSHAKE,
207+
in_flight=True,
208+
is_ack_eliciting=True,
209+
is_crypto_packet=True,
210+
packet_number=1,
211+
packet_type=PACKET_TYPE_HANDSHAKE,
212+
sent_bytes=1200,
213+
),
214+
QuicSentPacket(
215+
epoch=Epoch.HANDSHAKE,
216+
in_flight=True,
217+
is_ack_eliciting=True,
218+
is_crypto_packet=True,
219+
packet_number=2,
220+
packet_type=PACKET_TYPE_HANDSHAKE,
221+
sent_bytes=844,
222+
),
223+
],
224+
)
225+
226+
# check builder
227+
self.assertEqual(builder.packet_number, 3)
228+
229+
def test_long_header_initial_server_without_handshake(self):
230+
builder = create_builder()
231+
crypto = create_crypto()
232+
153233
# INITIAL
154234
builder.start_packet(PACKET_TYPE_INITIAL, crypto)
155235
self.assertEqual(builder.remaining_flight_space, 1156)
@@ -161,10 +241,13 @@ def test_long_header_initial_server(self):
161241
builder.start_packet(PACKET_TYPE_INITIAL, crypto)
162242
self.assertTrue(builder.packet_is_empty)
163243

244+
# HANDSHAKE, empty
245+
builder.start_packet(PACKET_TYPE_HANDSHAKE, crypto)
246+
self.assertTrue(builder.packet_is_empty)
247+
164248
# check datagrams
165249
datagrams, packets = builder.flush()
166-
self.assertEqual(len(datagrams), 1)
167-
self.assertEqual(len(datagrams[0]), 1200)
250+
self.assertEqual(datagram_sizes(datagrams), [1200])
168251
self.assertEqual(
169252
packets,
170253
[

0 commit comments

Comments
 (0)