QUIC Protocol Implementation 1.0
A Python implementation of the QUIC (Quick UDP Internet Connections) protocol.
Loading...
Searching...
No Matches
test_frame.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2"""
3@file test_frame.py
4@brief Unit tests for the frame module.
5"""
6
7import unittest
8import sys
9import os
10
11# Add the parent directory to sys.path to import the modules
12sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
13
14from frame import FrameStream
15from constants import Constants
16
17
18class TestFrameStream(unittest.TestCase):
19 """
20 @brief Test cases for the FrameStream class.
21 """
22
23 def setUp(self):
24 self.stream_id = 38
25 self.offset = 100
26 self.length = 10
27 self.test_data = b'Test data!'
29 stream_id=self.stream_id,
30 offset=self.offset,
31 length=self.length,
32 fin=False,
33 data=self.test_data
34 )
36 stream_id=self.stream_id,
37 offset=self.offset,
38 length=self.length,
39 fin=True,
40 data=self.test_data
41 )
42
43 def test_init(self):
44 """Test initialization of FrameStream"""
45 self.assertEqual(self.frame.stream_id, self.stream_id)
46 self.assertEqual(self.frame.offset, self.offset)
47 self.assertEqual(self.frame.length, self.length)
48 self.assertFalse(self.frame.fin)
49 self.assertEqual(self.frame.data, self.test_data)
50
52 """Test encoding and decoding of frames"""
53 encoded_frame = self.frame.encode()
54 decoded_frame = FrameStream.decode(encoded_frame)
55
56 self.assertEqual(decoded_frame.stream_id, self.stream_id)
57 self.assertEqual(decoded_frame.offset, self.offset)
58 self.assertEqual(decoded_frame.length, self.length)
59 self.assertFalse(decoded_frame.fin)
60 self.assertEqual(decoded_frame.data, self.test_data)
61
63 """Test encoding and decoding of frames with FIN flag"""
64 encoded_frame = self.fin_frame.encode()
65 decoded_frame = FrameStream.decode(encoded_frame)
66
67 self.assertEqual(decoded_frame.stream_id, self.stream_id)
68 self.assertEqual(decoded_frame.offset, self.offset)
69 self.assertEqual(decoded_frame.length, self.length)
70 self.assertTrue(decoded_frame.fin)
71 self.assertEqual(decoded_frame.data, self.test_data)
72
74 """Test frame with zero offset"""
75 frame = FrameStream(
76 stream_id=self.stream_id,
77 offset=0,
78 length=self.length,
79 fin=False,
80 data=self.test_data
81 )
82
83 encoded_frame = frame.encode()
84 decoded_frame = FrameStream.decode(encoded_frame)
85
86 self.assertEqual(decoded_frame.offset, 0)
87
89 """Test frame with zero length"""
90 frame = FrameStream(
91 stream_id=self.stream_id,
92 offset=self.offset,
93 length=0,
94 fin=False,
95 data=self.test_data
96 )
97
98 encoded_frame = frame.encode()
99 decoded_frame = FrameStream.decode(encoded_frame)
100
101 self.assertEqual(decoded_frame.length, 0)
102
104 """Test end_of_attrs method"""
105 encoded_frame = self.frame.encode()
106 end_attrs = FrameStream.end_of_attrs(encoded_frame[:Constants.FRAME_TYPE_FIELD_LENGTH])
107
108 # For a frame with offset and length, the end of attributes should be:
109 # type field (1) + stream_id (8) + offset (8) + length (8)
110 expected_end = Constants.FRAME_TYPE_FIELD_LENGTH + Constants.STREAM_ID_LENGTH + Constants.OFFSET_LENGTH + Constants.LEN_LENGTH
111 self.assertEqual(end_attrs, expected_end)
112
114 """Test end_of_attrs method with no offset and no length"""
115 frame = FrameStream(
116 stream_id=self.stream_id,
117 offset=0,
118 length=0,
119 fin=False,
120 data=self.test_data
121 )
122
123 encoded_frame = frame.encode()
124 end_attrs = FrameStream.end_of_attrs(encoded_frame[:Constants.FRAME_TYPE_FIELD_LENGTH])
125
126 # For a frame with no offset and no length, the end of attributes should be:
127 # type field (1) + stream_id (8)
128 expected_end = Constants.FRAME_TYPE_FIELD_LENGTH + Constants.STREAM_ID_LENGTH
129 self.assertEqual(end_attrs, expected_end)
130
132 """Test length_from_attrs method"""
133 encoded_frame = self.frame.encode()
134 end_attrs = FrameStream.end_of_attrs(encoded_frame[:Constants.FRAME_TYPE_FIELD_LENGTH])
135 length = FrameStream.length_from_attrs(encoded_frame[:end_attrs], end_attrs)
136
137 self.assertEqual(length, self.length)
138
140 """Test length_from_attrs method with zero length"""
141 test_frame_header = bytes([0x08]) # MIN_TYPE_FIELD without LEN_BIT
142 test_frame_header += bytes([0] * Constants.STREAM_ID_LENGTH)
143
144 end_attrs = FrameStream.end_of_attrs(test_frame_header)
145 length = FrameStream.length_from_attrs(test_frame_header, end_attrs)
146
147 self.assertEqual(length, 0)
148
150 """Test all combinations of offset, length, and fin flags"""
151 combinations = [
152 # (offset, length, fin)
153 (0, 0, False),
154 (0, 0, True),
155 (0, 10, False),
156 (0, 10, True),
157 (100, 0, False),
158 (100, 0, True),
159 (100, 10, False),
160 (100, 10, True),
161 ]
162
163 for offset, length, fin in combinations:
164 frame = FrameStream(
165 stream_id=self.stream_id,
166 offset=offset,
167 length=length,
168 fin=fin,
169 data=self.test_data
170 )
171
172 encoded_frame = frame.encode()
173 decoded_frame = FrameStream.decode(encoded_frame)
174
175 self.assertEqual(decoded_frame.stream_id, self.stream_id)
176 self.assertEqual(decoded_frame.offset, offset)
177 self.assertEqual(decoded_frame.length, length)
178 self.assertEqual(decoded_frame.fin, fin)
179 self.assertEqual(decoded_frame.data, self.test_data)
180
182 """Test with large values for stream_id, offset, and length"""
183 large_stream_id = 2 ** 63 - 1 # Max value for 8 bytes
184 large_offset = 2 ** 63 - 1
185 large_length = 2 ** 63 - 1
186
187 frame = FrameStream(
188 stream_id=large_stream_id,
189 offset=large_offset,
190 length=large_length,
191 fin=True,
192 data=self.test_data
193 )
194
195 encoded_frame = frame.encode()
196 decoded_frame = FrameStream.decode(encoded_frame)
197
198 self.assertEqual(decoded_frame.stream_id, large_stream_id)
199 self.assertEqual(decoded_frame.offset, large_offset)
200 self.assertEqual(decoded_frame.length, large_length)
201 self.assertTrue(decoded_frame.fin)
202 self.assertEqual(decoded_frame.data, self.test_data)
203
204
205if __name__ == '__main__':
206 unittest.main()
test_end_of_attrs_no_offset_no_length(self)