OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "net/quic/quic_protocol.h" | |
6 | |
7 #include <sstream> | |
8 | |
9 #include "base/stl_util.h" | |
10 #include "net/quic/quic_flags.h" | |
11 #include "net/quic/quic_utils.h" | |
12 #include "testing/gtest/include/gtest/gtest.h" | |
13 | |
14 namespace net { | |
15 namespace test { | |
16 namespace { | |
17 | |
18 TEST(QuicProtocolTest, AdjustErrorForVersion) { | |
19 ASSERT_EQ(14, QUIC_STREAM_LAST_ERROR) | |
20 << "Any additions to QuicRstStreamErrorCode require an addition to " | |
21 << "AdjustErrorForVersion and this associated test."; | |
22 | |
23 // If we ever add different RST codes, we should have a test akin to the | |
24 // following. | |
25 // EXPECT_EQ(QUIC_RST_ACKNOWLEDGEMENT, AdjustErrorForVersion( | |
26 // QUIC_RST_ACKNOWLEDGEMENT, | |
27 // QUIC_VERSION_28)); | |
28 } | |
29 | |
30 TEST(QuicProtocolTest, MakeQuicTag) { | |
31 QuicTag tag = MakeQuicTag('A', 'B', 'C', 'D'); | |
32 char bytes[4]; | |
33 memcpy(bytes, &tag, 4); | |
34 EXPECT_EQ('A', bytes[0]); | |
35 EXPECT_EQ('B', bytes[1]); | |
36 EXPECT_EQ('C', bytes[2]); | |
37 EXPECT_EQ('D', bytes[3]); | |
38 } | |
39 | |
40 TEST(QuicProtocolTest, IsAawaitingPacket) { | |
41 QuicAckFrame ack_frame; | |
42 ack_frame.largest_observed = 10u; | |
43 EXPECT_TRUE(IsAwaitingPacket(ack_frame, 11u, 0u)); | |
44 EXPECT_FALSE(IsAwaitingPacket(ack_frame, 1u, 0u)); | |
45 | |
46 ack_frame.packets.Add(10); | |
47 EXPECT_TRUE(IsAwaitingPacket(ack_frame, 10u, 0u)); | |
48 | |
49 QuicAckFrame ack_frame1; | |
50 ack_frame1.missing = false; | |
51 ack_frame1.largest_observed = 10u; | |
52 ack_frame1.packets.Add(1, 11); | |
53 EXPECT_TRUE(IsAwaitingPacket(ack_frame1, 11u, 0u)); | |
54 EXPECT_FALSE(IsAwaitingPacket(ack_frame1, 1u, 0u)); | |
55 | |
56 ack_frame1.packets.Remove(10); | |
57 EXPECT_TRUE(IsAwaitingPacket(ack_frame1, 10u, 0u)); | |
58 | |
59 QuicAckFrame ack_frame2; | |
60 ack_frame2.missing = false; | |
61 ack_frame2.largest_observed = 100u; | |
62 ack_frame2.packets.Add(21, 100); | |
63 EXPECT_FALSE(IsAwaitingPacket(ack_frame2, 11u, 20u)); | |
64 EXPECT_FALSE(IsAwaitingPacket(ack_frame2, 80u, 20u)); | |
65 EXPECT_TRUE(IsAwaitingPacket(ack_frame2, 101u, 20u)); | |
66 | |
67 ack_frame2.packets.Remove(50); | |
68 EXPECT_TRUE(IsAwaitingPacket(ack_frame2, 50u, 20u)); | |
69 } | |
70 | |
71 TEST(QuicProtocolTest, QuicVersionToQuicTag) { | |
72 // If you add a new version to the QuicVersion enum you will need to add a new | |
73 // case to QuicVersionToQuicTag, otherwise this test will fail. | |
74 | |
75 // TODO(rtenneti): Enable checking of Log(ERROR) messages. | |
76 #if 0 | |
77 // Any logs would indicate an unsupported version which we don't expect. | |
78 ScopedMockLog log(kDoNotCaptureLogsYet); | |
79 EXPECT_CALL(log, Log(_, _, _)).Times(0); | |
80 log.StartCapturingLogs(); | |
81 #endif | |
82 | |
83 // Explicitly test a specific version. | |
84 EXPECT_EQ(MakeQuicTag('Q', '0', '3', '0'), | |
85 QuicVersionToQuicTag(QUIC_VERSION_30)); | |
86 | |
87 // Loop over all supported versions and make sure that we never hit the | |
88 // default case (i.e. all supported versions should be successfully converted | |
89 // to valid QuicTags). | |
90 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
91 QuicVersion version = kSupportedQuicVersions[i]; | |
92 EXPECT_LT(0u, QuicVersionToQuicTag(version)); | |
93 } | |
94 } | |
95 | |
96 TEST(QuicProtocolTest, QuicVersionToQuicTagUnsupported) { | |
97 // TODO(rtenneti): Enable checking of Log(ERROR) messages. | |
98 #if 0 | |
99 // TODO(rjshade): Change to DFATAL once we actually support multiple versions, | |
100 // and QuicConnectionTest::SendVersionNegotiationPacket can be changed to use | |
101 // mis-matched versions rather than relying on QUIC_VERSION_UNSUPPORTED. | |
102 ScopedMockLog log(kDoNotCaptureLogsYet); | |
103 EXPECT_CALL(log, Log(base_logging::ERROR, _, "Unsupported QuicVersion: 0")) | |
104 .Times(1); | |
105 log.StartCapturingLogs(); | |
106 #endif | |
107 | |
108 EXPECT_EQ(0u, QuicVersionToQuicTag(QUIC_VERSION_UNSUPPORTED)); | |
109 } | |
110 | |
111 TEST(QuicProtocolTest, QuicTagToQuicVersion) { | |
112 // If you add a new version to the QuicVersion enum you will need to add a new | |
113 // case to QuicTagToQuicVersion, otherwise this test will fail. | |
114 | |
115 // TODO(rtenneti): Enable checking of Log(ERROR) messages. | |
116 #if 0 | |
117 // Any logs would indicate an unsupported version which we don't expect. | |
118 ScopedMockLog log(kDoNotCaptureLogsYet); | |
119 EXPECT_CALL(log, Log(_, _, _)).Times(0); | |
120 log.StartCapturingLogs(); | |
121 #endif | |
122 | |
123 // Explicitly test specific versions. | |
124 EXPECT_EQ(QUIC_VERSION_30, | |
125 QuicTagToQuicVersion(MakeQuicTag('Q', '0', '3', '0'))); | |
126 | |
127 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
128 QuicVersion version = kSupportedQuicVersions[i]; | |
129 | |
130 // Get the tag from the version (we can loop over QuicVersions easily). | |
131 QuicTag tag = QuicVersionToQuicTag(version); | |
132 EXPECT_LT(0u, tag); | |
133 | |
134 // Now try converting back. | |
135 QuicVersion tag_to_quic_version = QuicTagToQuicVersion(tag); | |
136 EXPECT_EQ(version, tag_to_quic_version); | |
137 EXPECT_NE(QUIC_VERSION_UNSUPPORTED, tag_to_quic_version); | |
138 } | |
139 } | |
140 | |
141 TEST(QuicProtocolTest, QuicTagToQuicVersionUnsupported) { | |
142 // TODO(rtenneti): Enable checking of Log(ERROR) messages. | |
143 #if 0 | |
144 ScopedMockLog log(kDoNotCaptureLogsYet); | |
145 #ifndef NDEBUG | |
146 EXPECT_CALL(log, | |
147 Log(base_logging::INFO, _, "Unsupported QuicTag version: FAKE")) | |
148 .Times(1); | |
149 #endif | |
150 log.StartCapturingLogs(); | |
151 #endif | |
152 | |
153 EXPECT_EQ(QUIC_VERSION_UNSUPPORTED, | |
154 QuicTagToQuicVersion(MakeQuicTag('F', 'A', 'K', 'E'))); | |
155 } | |
156 | |
157 TEST(QuicProtocolTest, QuicVersionToString) { | |
158 EXPECT_EQ("QUIC_VERSION_30", QuicVersionToString(QUIC_VERSION_30)); | |
159 EXPECT_EQ("QUIC_VERSION_UNSUPPORTED", | |
160 QuicVersionToString(QUIC_VERSION_UNSUPPORTED)); | |
161 | |
162 QuicVersion single_version[] = {QUIC_VERSION_30}; | |
163 QuicVersionVector versions_vector; | |
164 for (size_t i = 0; i < arraysize(single_version); ++i) { | |
165 versions_vector.push_back(single_version[i]); | |
166 } | |
167 EXPECT_EQ("QUIC_VERSION_30", QuicVersionVectorToString(versions_vector)); | |
168 | |
169 QuicVersion multiple_versions[] = {QUIC_VERSION_UNSUPPORTED, QUIC_VERSION_30}; | |
170 versions_vector.clear(); | |
171 for (size_t i = 0; i < arraysize(multiple_versions); ++i) { | |
172 versions_vector.push_back(multiple_versions[i]); | |
173 } | |
174 EXPECT_EQ("QUIC_VERSION_UNSUPPORTED,QUIC_VERSION_30", | |
175 QuicVersionVectorToString(versions_vector)); | |
176 | |
177 // Make sure that all supported versions are present in QuicVersionToString. | |
178 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
179 QuicVersion version = kSupportedQuicVersions[i]; | |
180 EXPECT_NE("QUIC_VERSION_UNSUPPORTED", QuicVersionToString(version)); | |
181 } | |
182 } | |
183 | |
184 TEST(QuicProtocolTest, AckFrameToString) { | |
185 QuicAckFrame frame; | |
186 frame.entropy_hash = 1; | |
187 frame.largest_observed = 2; | |
188 frame.ack_delay_time = QuicTime::Delta::FromMicroseconds(3); | |
189 frame.packets.Add(4); | |
190 frame.packets.Add(5); | |
191 frame.received_packet_times = { | |
192 {6, QuicTime::Zero() + QuicTime::Delta::FromMicroseconds(7)}}; | |
193 std::ostringstream stream; | |
194 stream << frame; | |
195 EXPECT_EQ( | |
196 "{ entropy_hash: 1, largest_observed: 2, ack_delay_time: 3, " | |
197 "packets: [ 4 5 ], is_truncated: 0, received_packets: [ 6 at 7 ] }\n", | |
198 stream.str()); | |
199 } | |
200 | |
201 TEST(QuicProtocolTest, PaddingFrameToString) { | |
202 QuicPaddingFrame frame; | |
203 frame.num_padding_bytes = 1; | |
204 std::ostringstream stream; | |
205 stream << frame; | |
206 EXPECT_EQ("{ num_padding_bytes: 1 }\n", stream.str()); | |
207 } | |
208 | |
209 TEST(QuicProtocolTest, RstStreamFrameToString) { | |
210 QuicRstStreamFrame frame; | |
211 frame.stream_id = 1; | |
212 frame.error_code = QUIC_STREAM_CANCELLED; | |
213 std::ostringstream stream; | |
214 stream << frame; | |
215 EXPECT_EQ("{ stream_id: 1, error_code: 6 }\n", stream.str()); | |
216 } | |
217 | |
218 TEST(QuicProtocolTest, ConnectionCloseFrameToString) { | |
219 QuicConnectionCloseFrame frame; | |
220 frame.error_code = QUIC_NETWORK_IDLE_TIMEOUT; | |
221 frame.error_details = "No recent network activity."; | |
222 std::ostringstream stream; | |
223 stream << frame; | |
224 EXPECT_EQ( | |
225 "{ error_code: 25, error_details: 'No recent network activity.' }\n", | |
226 stream.str()); | |
227 } | |
228 | |
229 TEST(QuicProtocolTest, GoAwayFrameToString) { | |
230 QuicGoAwayFrame frame; | |
231 frame.error_code = QUIC_NETWORK_IDLE_TIMEOUT; | |
232 frame.last_good_stream_id = 2; | |
233 frame.reason_phrase = "Reason"; | |
234 std::ostringstream stream; | |
235 stream << frame; | |
236 EXPECT_EQ( | |
237 "{ error_code: 25, last_good_stream_id: 2, reason_phrase: 'Reason' }\n", | |
238 stream.str()); | |
239 } | |
240 | |
241 TEST(QuicProtocolTest, WindowUpdateFrameToString) { | |
242 QuicWindowUpdateFrame frame; | |
243 std::ostringstream stream; | |
244 frame.stream_id = 1; | |
245 frame.byte_offset = 2; | |
246 stream << frame; | |
247 EXPECT_EQ("{ stream_id: 1, byte_offset: 2 }\n", stream.str()); | |
248 } | |
249 | |
250 TEST(QuicProtocolTest, BlockedFrameToString) { | |
251 QuicBlockedFrame frame; | |
252 frame.stream_id = 1; | |
253 std::ostringstream stream; | |
254 stream << frame; | |
255 EXPECT_EQ("{ stream_id: 1 }\n", stream.str()); | |
256 } | |
257 | |
258 TEST(QuicProtocolTest, StreamFrameToString) { | |
259 QuicStreamFrame frame; | |
260 frame.stream_id = 1; | |
261 frame.fin = false; | |
262 frame.offset = 2; | |
263 frame.data_length = 3; | |
264 std::ostringstream stream; | |
265 stream << frame; | |
266 EXPECT_EQ("{ stream_id: 1, fin: 0, offset: 2, length: 3 }\n", stream.str()); | |
267 } | |
268 | |
269 TEST(QuicProtocolTest, StopWaitingFrameToString) { | |
270 QuicStopWaitingFrame frame; | |
271 frame.entropy_hash = 1; | |
272 frame.least_unacked = 2; | |
273 std::ostringstream stream; | |
274 stream << frame; | |
275 EXPECT_EQ("{ entropy_hash: 1, least_unacked: 2 }\n", stream.str()); | |
276 } | |
277 | |
278 TEST(QuicProtocolTest, PathCloseFrameToString) { | |
279 QuicPathCloseFrame frame; | |
280 frame.path_id = 1; | |
281 std::ostringstream stream; | |
282 stream << frame; | |
283 EXPECT_EQ("{ path_id: 1 }\n", stream.str()); | |
284 } | |
285 | |
286 TEST(QuicProtocolTest, FilterSupportedVersions) { | |
287 QuicVersionVector all_versions = { | |
288 QUIC_VERSION_30, QUIC_VERSION_31, QUIC_VERSION_32, QUIC_VERSION_33, | |
289 QUIC_VERSION_34, QUIC_VERSION_35, QUIC_VERSION_36}; | |
290 | |
291 FLAGS_quic_enable_version_35 = false; | |
292 FLAGS_quic_enable_version_36 = false; | |
293 | |
294 QuicVersionVector filtered_versions = FilterSupportedVersions(all_versions); | |
295 ASSERT_EQ(5u, filtered_versions.size()); | |
296 EXPECT_EQ(QUIC_VERSION_30, filtered_versions[0]); | |
297 EXPECT_EQ(QUIC_VERSION_31, filtered_versions[1]); | |
298 EXPECT_EQ(QUIC_VERSION_32, filtered_versions[2]); | |
299 EXPECT_EQ(QUIC_VERSION_33, filtered_versions[3]); | |
300 EXPECT_EQ(QUIC_VERSION_34, filtered_versions[4]); | |
301 } | |
302 | |
303 // Tests that a queue contains the expected data after calls to Add(). | |
304 TEST(PacketNumberQueueTest, AddRange) { | |
305 PacketNumberQueue queue; | |
306 queue.Add(1, 51); | |
307 queue.Add(53); | |
308 | |
309 EXPECT_FALSE(queue.Contains(0)); | |
310 for (int i = 1; i < 51; ++i) { | |
311 EXPECT_TRUE(queue.Contains(i)); | |
312 } | |
313 EXPECT_FALSE(queue.Contains(51)); | |
314 EXPECT_FALSE(queue.Contains(52)); | |
315 EXPECT_TRUE(queue.Contains(53)); | |
316 EXPECT_FALSE(queue.Contains(54)); | |
317 EXPECT_EQ(51u, queue.NumPacketsSlow()); | |
318 EXPECT_EQ(1u, queue.Min()); | |
319 EXPECT_EQ(53u, queue.Max()); | |
320 | |
321 queue.Add(70); | |
322 EXPECT_EQ(70u, queue.Max()); | |
323 } | |
324 | |
325 // Tests that a queue contains the expected data after calls to Remove(). | |
326 TEST(PacketNumberQueueTest, Removal) { | |
327 PacketNumberQueue queue; | |
328 queue.Add(0, 100); | |
329 | |
330 EXPECT_TRUE(queue.RemoveUpTo(51)); | |
331 EXPECT_FALSE(queue.RemoveUpTo(51)); | |
332 queue.Remove(53); | |
333 | |
334 EXPECT_FALSE(queue.Contains(0)); | |
335 for (int i = 1; i < 51; ++i) { | |
336 EXPECT_FALSE(queue.Contains(i)); | |
337 } | |
338 EXPECT_TRUE(queue.Contains(51)); | |
339 EXPECT_TRUE(queue.Contains(52)); | |
340 EXPECT_FALSE(queue.Contains(53)); | |
341 EXPECT_TRUE(queue.Contains(54)); | |
342 EXPECT_EQ(48u, queue.NumPacketsSlow()); | |
343 EXPECT_EQ(51u, queue.Min()); | |
344 EXPECT_EQ(99u, queue.Max()); | |
345 | |
346 queue.Remove(51); | |
347 EXPECT_EQ(52u, queue.Min()); | |
348 queue.Remove(99); | |
349 EXPECT_EQ(98u, queue.Max()); | |
350 } | |
351 | |
352 // Tests that a queue is empty when all of its elements are removed. | |
353 TEST(PacketNumberQueueTest, Empty) { | |
354 PacketNumberQueue queue; | |
355 EXPECT_TRUE(queue.Empty()); | |
356 EXPECT_EQ(0u, queue.NumPacketsSlow()); | |
357 | |
358 queue.Add(1, 100); | |
359 EXPECT_TRUE(queue.RemoveUpTo(100)); | |
360 EXPECT_TRUE(queue.Empty()); | |
361 EXPECT_EQ(0u, queue.NumPacketsSlow()); | |
362 } | |
363 | |
364 // Tests that logging the state of a PacketNumberQueue does not crash. | |
365 TEST(PacketNumberQueueTest, LogDoesNotCrash) { | |
366 std::ostringstream oss; | |
367 PacketNumberQueue queue; | |
368 oss << queue; | |
369 | |
370 queue.Add(1); | |
371 queue.Add(50, 100); | |
372 oss << queue; | |
373 } | |
374 | |
375 // Tests that the iterators returned from a packet queue iterate over the queue. | |
376 TEST(PacketNumberQueueTest, Iterators) { | |
377 PacketNumberQueue queue; | |
378 queue.Add(1, 100); | |
379 | |
380 const std::vector<QuicPacketNumber> actual_numbers(queue.begin(), | |
381 queue.end()); | |
382 const std::vector<Interval<QuicPacketNumber>> actual_intervals( | |
383 queue.begin_intervals(), queue.end_intervals()); | |
384 | |
385 std::vector<QuicPacketNumber> expected_numbers; | |
386 for (int i = 1; i < 100; ++i) { | |
387 expected_numbers.push_back(i); | |
388 } | |
389 | |
390 std::vector<Interval<QuicPacketNumber>> expected_intervals; | |
391 expected_intervals.push_back(Interval<QuicPacketNumber>(1, 100)); | |
392 | |
393 EXPECT_EQ(expected_intervals, actual_intervals); | |
394 EXPECT_EQ(expected_numbers, actual_numbers); | |
395 | |
396 PacketNumberQueue::const_iterator it_low = queue.lower_bound(10); | |
397 EXPECT_EQ(10u, *it_low); | |
398 | |
399 it_low = queue.lower_bound(101); | |
400 EXPECT_TRUE(queue.end() == it_low); | |
401 } | |
402 | |
403 TEST(PacketNumberQueueTest, IntervalLengthAndRemoveInterval) { | |
404 PacketNumberQueue queue; | |
405 queue.Add(1, 10); | |
406 queue.Add(20, 30); | |
407 queue.Add(40, 50); | |
408 EXPECT_EQ(3u, queue.NumIntervals()); | |
409 EXPECT_EQ(10u, queue.LastIntervalLength()); | |
410 queue.Remove(9, 21); | |
411 EXPECT_EQ(3u, queue.NumIntervals()); | |
412 EXPECT_FALSE(queue.Contains(9)); | |
413 EXPECT_FALSE(queue.Contains(20)); | |
414 } | |
415 | |
416 TEST(PacketNumberQueueTest, Complement) { | |
417 PacketNumberQueue queue; | |
418 queue.Add(1, 10); | |
419 queue.Add(12, 20); | |
420 queue.Add(22, 30); | |
421 queue.Complement(); | |
422 EXPECT_EQ(2u, queue.NumIntervals()); | |
423 EXPECT_TRUE(queue.Contains(10)); | |
424 EXPECT_TRUE(queue.Contains(11)); | |
425 EXPECT_TRUE(queue.Contains(20)); | |
426 EXPECT_TRUE(queue.Contains(21)); | |
427 } | |
428 | |
429 } // namespace | |
430 } // namespace test | |
431 } // namespace net | |
OLD | NEW |