def test_receiver_already_partially_consumed_2(self): stream = QuicStream(stream_id=0) self.assertEqual( stream.receiver.handle_frame( QuicStreamFrame(offset=0, data=b"01234567")), StreamDataReceived(data=b"01234567", end_stream=False, stream_id=0), ) self.assertEqual( stream.receiver.handle_frame( QuicStreamFrame(offset=16, data=b"abcdefgh")), None, ) self.assertEqual( stream.receiver.handle_frame( QuicStreamFrame(offset=2, data=b"23456789012345")), StreamDataReceived(data=b"89012345abcdefgh", end_stream=False, stream_id=0), ) self.assertEqual(bytes(stream.receiver._buffer), b"") self.assertEqual(list(stream.receiver._ranges), []) self.assertEqual(stream.receiver._buffer_start, 24)
def test_receiver_already_fully_consumed(self): stream = QuicStream(stream_id=0) # add data at offset 0 self.assertEqual( stream.receiver.handle_frame( QuicStreamFrame(offset=0, data=b"01234567")), StreamDataReceived(data=b"01234567", end_stream=False, stream_id=0), ) self.assertEqual(bytes(stream.receiver._buffer), b"") self.assertEqual(list(stream.receiver._ranges), []) self.assertEqual(stream.receiver._buffer_start, 8) # add data again at offset 0 self.assertEqual( stream.receiver.handle_frame( QuicStreamFrame(offset=0, data=b"01234567")), None, ) self.assertEqual(bytes(stream.receiver._buffer), b"") self.assertEqual(list(stream.receiver._ranges), []) self.assertEqual(stream.receiver._buffer_start, 8) # add data again at offset 0 self.assertEqual( stream.receiver.handle_frame(QuicStreamFrame(offset=0, data=b"01")), None) self.assertEqual(bytes(stream.receiver._buffer), b"") self.assertEqual(list(stream.receiver._ranges), []) self.assertEqual(stream.receiver._buffer_start, 8)
def test_recv_ordered(self): stream = QuicStream() # add data at start stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")) self.assertEqual(bytes(stream._recv_buffer), b"01234567") self.assertEqual(list(stream._recv_ranges), [range(0, 8)]) self.assertEqual(stream._recv_buffer_start, 0) # pull data self.assertEqual(stream.pull_data(), b"01234567") self.assertEqual(bytes(stream._recv_buffer), b"") self.assertEqual(list(stream._recv_ranges), []) self.assertEqual(stream._recv_buffer_start, 8) # add more data stream.add_frame(QuicStreamFrame(offset=8, data=b"89012345")) self.assertEqual(bytes(stream._recv_buffer), b"89012345") self.assertEqual(list(stream._recv_ranges), [range(8, 16)]) self.assertEqual(stream._recv_buffer_start, 8) # pull data self.assertEqual(stream.pull_data(), b"89012345") self.assertEqual(bytes(stream._recv_buffer), b"") self.assertEqual(list(stream._recv_ranges), []) self.assertEqual(stream._recv_buffer_start, 16)
def test_receiver_unordered(self): stream = QuicStream(stream_id=0) # add data at offset 8 self.assertEqual( stream.receiver.handle_frame( QuicStreamFrame(offset=8, data=b"89012345")), None, ) self.assertEqual(bytes(stream.receiver._buffer), b"\x00\x00\x00\x00\x00\x00\x00\x0089012345") self.assertEqual(list(stream.receiver._ranges), [range(8, 16)]) self.assertEqual(stream.receiver._buffer_start, 0) self.assertEqual(stream.receiver.highest_offset, 16) # add data at offset 0 self.assertEqual( stream.receiver.handle_frame( QuicStreamFrame(offset=0, data=b"01234567")), StreamDataReceived(data=b"0123456789012345", end_stream=False, stream_id=0), ) self.assertEqual(bytes(stream.receiver._buffer), b"") self.assertEqual(list(stream.receiver._ranges), []) self.assertEqual(stream.receiver._buffer_start, 16) self.assertEqual(stream.receiver.highest_offset, 16)
def test_recv_fin_twice(self): stream = QuicStream(stream_id=0) stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")) stream.add_frame(QuicStreamFrame(offset=8, data=b"89012345", fin=True)) stream.add_frame(QuicStreamFrame(offset=8, data=b"89012345", fin=True)) self.assertEqual(stream.pull_data(), b"0123456789012345")
def test_recv_ordered(self): stream = QuicStream(stream_id=0) # add data at start self.assertEqual( stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")), StreamDataReceived(data=b"01234567", end_stream=False, stream_id=0), ) self.assertEqual(bytes(stream._recv_buffer), b"") self.assertEqual(list(stream._recv_ranges), []) self.assertEqual(stream._recv_buffer_start, 8) # add more data self.assertEqual( stream.add_frame(QuicStreamFrame(offset=8, data=b"89012345")), StreamDataReceived(data=b"89012345", end_stream=False, stream_id=0), ) self.assertEqual(bytes(stream._recv_buffer), b"") self.assertEqual(list(stream._recv_ranges), []) self.assertEqual(stream._recv_buffer_start, 16) # add data and fin self.assertEqual( stream.add_frame( QuicStreamFrame(offset=16, data=b"67890123", fin=True)), StreamDataReceived(data=b"67890123", end_stream=True, stream_id=0), ) self.assertEqual(bytes(stream._recv_buffer), b"") self.assertEqual(list(stream._recv_ranges), []) self.assertEqual(stream._recv_buffer_start, 24)
def test_recv_fin(self): stream = QuicStream(stream_id=0) self.assertEqual( stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")), StreamDataReceived(data=b"01234567", end_stream=False, stream_id=0), ) self.assertEqual( stream.add_frame(QuicStreamFrame(offset=8, data=b"89012345", fin=True)), StreamDataReceived(data=b"89012345", end_stream=True, stream_id=0), )
def test_recv_fin_then_data(self): stream = QuicStream(stream_id=0) stream.add_frame(QuicStreamFrame(offset=0, data=b"0123", fin=True)) # data beyond final size with self.assertRaises(FinalSizeError) as cm: stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")) self.assertEqual(str(cm.exception), "Data received beyond final size") # final size would be lowered with self.assertRaises(FinalSizeError) as cm: stream.add_frame(QuicStreamFrame(offset=0, data=b"01", fin=True)) self.assertEqual(str(cm.exception), "Cannot change final size")
def test_recv_already_partially_consumed(self): stream = QuicStream() stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")) self.assertEqual(stream.pull_data(), b"01234567") stream.add_frame(QuicStreamFrame(offset=0, data=b"0123456789012345")) self.assertEqual(bytes(stream._recv_buffer), b"89012345") self.assertEqual(list(stream._recv_ranges), [range(8, 16)]) self.assertEqual(stream._recv_buffer_start, 8) self.assertEqual(stream.pull_data(), b"89012345") self.assertEqual(stream._recv_buffer_start, 16)
def test_recv_fin_out_of_order(self): stream = QuicStream(stream_id=0) # add data at offset 8 with FIN self.assertEqual( stream.add_frame(QuicStreamFrame(offset=8, data=b"89012345", fin=True)), None, ) # add data at offset 0 self.assertEqual( stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")), StreamDataReceived(data=b"0123456789012345", end_stream=True, stream_id=0), )
def test_sender_data_lost_fin(self): stream = QuicStream() # nothing to send yet frame = stream.sender.get_frame(8) self.assertIsNone(frame) # write data and EOF stream.sender.write(b"0123456789012345", end_stream=True) self.assertEqual(list(stream.sender._pending), [range(0, 16)]) self.assertEqual(stream.sender.next_offset, 0) # send a chunk self.assertEqual( stream.sender.get_frame(8), QuicStreamFrame(data=b"01234567", fin=False, offset=0), ) self.assertEqual(list(stream.sender._pending), [range(8, 16)]) self.assertEqual(stream.sender.next_offset, 8) # send another chunk self.assertEqual( stream.sender.get_frame(8), QuicStreamFrame(data=b"89012345", fin=True, offset=8), ) self.assertEqual(list(stream.sender._pending), []) self.assertEqual(stream.sender.next_offset, 16) # nothing more to send self.assertIsNone(stream.sender.get_frame(8)) self.assertEqual(list(stream.sender._pending), []) self.assertEqual(stream.sender.next_offset, 16) # a chunk gets lost stream.sender.on_data_delivery(QuicDeliveryState.LOST, 8, 16) self.assertEqual(list(stream.sender._pending), [range(8, 16)]) self.assertEqual(stream.sender.next_offset, 8) # send chunk again self.assertEqual( stream.sender.get_frame(8), QuicStreamFrame(data=b"89012345", fin=True, offset=8), ) self.assertEqual(list(stream.sender._pending), []) self.assertEqual(stream.sender.next_offset, 16) # both chunks gets acknowledged stream.sender.on_data_delivery(QuicDeliveryState.ACKED, 0, 16) self.assertTrue(stream.sender.is_finished)
def test_recv_already_partially_consumed(self): stream = QuicStream(stream_id=0) self.assertEqual( stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")), StreamDataReceived(data=b"01234567", end_stream=False, stream_id=0), ) self.assertEqual( stream.add_frame(QuicStreamFrame(offset=0, data=b"0123456789012345")), StreamDataReceived(data=b"89012345", end_stream=False, stream_id=0), ) self.assertEqual(bytes(stream._recv_buffer), b"") self.assertEqual(list(stream._recv_ranges), []) self.assertEqual(stream._recv_buffer_start, 16)
def test_recv_offset_only(self): stream = QuicStream(stream_id=0) # add data at offset 0 self.assertEqual(stream.add_frame(QuicStreamFrame(offset=0, data=b"")), None) self.assertEqual(bytes(stream._recv_buffer), b"") self.assertEqual(list(stream._recv_ranges), []) self.assertEqual(stream._recv_buffer_start, 0) # add data at offset 8 self.assertEqual(stream.add_frame(QuicStreamFrame(offset=8, data=b"")), None) self.assertEqual( bytes(stream._recv_buffer), b"\x00\x00\x00\x00\x00\x00\x00\x00" ) self.assertEqual(list(stream._recv_ranges), []) self.assertEqual(stream._recv_buffer_start, 0)
def test_receiver_fin_without_data(self): stream = QuicStream(stream_id=0) self.assertEqual( stream.receiver.handle_frame( QuicStreamFrame(offset=0, data=b"", fin=True)), StreamDataReceived(data=b"", end_stream=True, stream_id=0), )
def test_recv_reset_after_fin(self): stream = QuicStream(stream_id=0) stream.add_frame(QuicStreamFrame(offset=0, data=b"0123", fin=True)), self.assertEqual( stream.handle_reset(final_size=4), StreamReset(error_code=QuicErrorCode.NO_ERROR, stream_id=0), )
def test_send_data_lost(self): stream = QuicStream() # nothing to send yet frame = stream.get_frame(8) self.assertIsNone(frame) # write data and EOF stream.write(b"0123456789012345", end_stream=True) self.assertEqual(list(stream._send_pending), [range(0, 16)]) self.assertEqual(stream.next_send_offset, 0) # send a chunk self.assertEqual( stream.get_frame(8), QuicStreamFrame(data=b"01234567", fin=False, offset=0) ) self.assertEqual(list(stream._send_pending), [range(8, 16)]) self.assertEqual(stream.next_send_offset, 8) # send another chunk self.assertEqual( stream.get_frame(8), QuicStreamFrame(data=b"89012345", fin=True, offset=8) ) self.assertEqual(list(stream._send_pending), []) self.assertEqual(stream.next_send_offset, 16) # nothing more to send self.assertIsNone(stream.get_frame(8)) self.assertEqual(list(stream._send_pending), []) self.assertEqual(stream.next_send_offset, 16) # a chunk gets lost stream.on_data_delivery(QuicDeliveryState.LOST, 0, 8) self.assertEqual(list(stream._send_pending), [range(0, 8)]) self.assertEqual(stream.next_send_offset, 0) # send chunk again self.assertEqual( stream.get_frame(8), QuicStreamFrame(data=b"01234567", fin=False, offset=0) ) self.assertEqual(list(stream._send_pending), []) self.assertEqual(stream.next_send_offset, 16)
def test_recv_empty(self): stream = QuicStream(stream_id=0) self.assertEqual(bytes(stream._recv_buffer), b"") self.assertEqual(list(stream._recv_ranges), []) self.assertEqual(stream._recv_buffer_start, 0) # empty self.assertEqual(stream.add_frame(QuicStreamFrame(offset=0, data=b"")), None) self.assertEqual(bytes(stream._recv_buffer), b"") self.assertEqual(list(stream._recv_ranges), []) self.assertEqual(stream._recv_buffer_start, 0)
def test_receiver_fin_out_of_order(self): stream = QuicStream(stream_id=0) # add data at offset 8 with FIN self.assertEqual( stream.receiver.handle_frame( QuicStreamFrame(offset=8, data=b"89012345", fin=True)), None, ) self.assertEqual(stream.receiver.highest_offset, 16) self.assertFalse(stream.receiver.is_finished) # add data at offset 0 self.assertEqual( stream.receiver.handle_frame( QuicStreamFrame(offset=0, data=b"01234567")), StreamDataReceived(data=b"0123456789012345", end_stream=True, stream_id=0), ) self.assertEqual(stream.receiver.highest_offset, 16) self.assertTrue(stream.receiver.is_finished)
def test_recv_fin_then_data(self): stream = QuicStream(stream_id=0) stream.add_frame(QuicStreamFrame(offset=0, data=b"", fin=True)) with self.assertRaises(Exception) as cm: stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")) self.assertEqual(str(cm.exception), "Data received beyond FIN")
def test_recv_fin_without_data(self): stream = QuicStream(stream_id=0) stream.add_frame(QuicStreamFrame(offset=0, data=b"", fin=True)) self.assertEqual(stream.pull_data(), b"")