예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
    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),
        )
예제 #4
0
    def test_recv_fin_twice(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),
        )

        self.assertEqual(
            stream.add_frame(
                QuicStreamFrame(offset=8, data=b"89012345", fin=True)),
            StreamDataReceived(data=b"", end_stream=True, stream_id=0),
        )
예제 #5
0
    def test_recv_already_fully_consumed(self):
        stream = QuicStream(stream_id=0)

        # add data at offset 0
        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 data again at offset 0
        self.assertEqual(
            stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")), None
        )
        self.assertEqual(bytes(stream._recv_buffer), b"")
        self.assertEqual(list(stream._recv_ranges), [])
        self.assertEqual(stream._recv_buffer_start, 8)
예제 #6
0
    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)
예제 #7
0
    def test_recv_ordered_2(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)

        # add more data
        stream.add_frame(QuicStreamFrame(offset=8, data=b"89012345"))
        self.assertEqual(bytes(stream._recv_buffer), b"0123456789012345")
        self.assertEqual(list(stream._recv_ranges), [range(0, 16)])
        self.assertEqual(stream._recv_buffer_start, 0)

        # pull data
        self.assertEqual(stream.pull_data(), b"0123456789012345")
        self.assertEqual(bytes(stream._recv_buffer), b"")
        self.assertEqual(list(stream._recv_ranges), [])
        self.assertEqual(stream._recv_buffer_start, 16)
예제 #8
0
    def test_recv_unordered(self):
        stream = QuicStream(stream_id=0)

        # add data at offset 8
        self.assertEqual(
            stream.add_frame(QuicStreamFrame(offset=8, data=b"89012345")), None
        )
        self.assertEqual(
            bytes(stream._recv_buffer), b"\x00\x00\x00\x00\x00\x00\x00\x0089012345"
        )
        self.assertEqual(list(stream._recv_ranges), [range(8, 16)])
        self.assertEqual(stream._recv_buffer_start, 0)

        # add data at offset 0
        self.assertEqual(
            stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567")),
            StreamDataReceived(data=b"0123456789012345", 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)
예제 #9
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")
예제 #10
0
 def test_recv_fin_without_data(self):
     stream = QuicStream(stream_id=0)
     self.assertEqual(
         stream.add_frame(QuicStreamFrame(offset=0, data=b"", fin=True)),
         StreamDataReceived(data=b"", end_stream=True, stream_id=0),
     )
예제 #11
0
 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")
예제 #12
0
    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"")
예제 #13
0
    def test_recv_fin_out_of_order(self):
        stream = QuicStream(stream_id=0)
        stream.add_frame(QuicStreamFrame(offset=8, data=b"89012345", fin=True))
        stream.add_frame(QuicStreamFrame(offset=0, data=b"01234567"))

        self.assertEqual(stream.pull_data(), b"0123456789012345")