1+ from typing import List
12from unittest import TestCase
23
34from 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+
4146class 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