Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(272)

Side by Side Diff: net/quic/quic_framer_test.cc

Issue 1782143003: Remove FEC code from receive path. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@115997404
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_framer.cc ('k') | net/quic/quic_multipath_received_packet_manager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/quic_framer.h" 5 #include "net/quic/quic_framer.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <map> 9 #include <map>
10 #include <string> 10 #include <string>
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 } 99 }
100 100
101 size_t GetPrivateFlagsOffset(bool include_version, 101 size_t GetPrivateFlagsOffset(bool include_version,
102 bool include_path_id, 102 bool include_path_id,
103 QuicPacketNumberLength packet_number_length) { 103 QuicPacketNumberLength packet_number_length) {
104 return GetPacketNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version, 104 return GetPacketNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version,
105 include_path_id) + 105 include_path_id) +
106 packet_number_length; 106 packet_number_length;
107 } 107 }
108 108
109 // Index into the fec group offset in the header.
110 size_t GetFecGroupOffset(QuicConnectionIdLength connection_id_length,
111 bool include_version,
112 bool include_path_id) {
113 return GetPrivateFlagsOffset(connection_id_length, include_version,
114 include_path_id) +
115 kPrivateFlagsSize;
116 }
117
118 size_t GetFecGroupOffset(bool include_version, bool include_path_id) {
119 return GetPrivateFlagsOffset(PACKET_8BYTE_CONNECTION_ID, include_version,
120 include_path_id) +
121 kPrivateFlagsSize;
122 }
123
124 size_t GetFecGroupOffset(bool include_version,
125 bool include_path_id,
126 QuicPacketNumberLength packet_number_length) {
127 return GetPrivateFlagsOffset(include_version, include_path_id,
128 packet_number_length) +
129 kPrivateFlagsSize;
130 }
131
132 // Index into the message tag of the public reset packet. 109 // Index into the message tag of the public reset packet.
133 // Public resets always have full connection_ids. 110 // Public resets always have full connection_ids.
134 const size_t kPublicResetPacketMessageTagOffset = 111 const size_t kPublicResetPacketMessageTagOffset =
135 kConnectionIdOffset + PACKET_8BYTE_CONNECTION_ID; 112 kConnectionIdOffset + PACKET_8BYTE_CONNECTION_ID;
136 113
137 class TestEncrypter : public QuicEncrypter { 114 class TestEncrypter : public QuicEncrypter {
138 public: 115 public:
139 ~TestEncrypter() override {} 116 ~TestEncrypter() override {}
140 bool SetKey(StringPiece key) override { return true; } 117 bool SetKey(StringPiece key) override { return true; }
141 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } 118 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 string ciphertext_; 178 string ciphertext_;
202 }; 179 };
203 180
204 class TestQuicVisitor : public QuicFramerVisitorInterface { 181 class TestQuicVisitor : public QuicFramerVisitorInterface {
205 public: 182 public:
206 TestQuicVisitor() 183 TestQuicVisitor()
207 : error_count_(0), 184 : error_count_(0),
208 version_mismatch_(0), 185 version_mismatch_(0),
209 packet_count_(0), 186 packet_count_(0),
210 frame_count_(0), 187 frame_count_(0),
211 fec_count_(0),
212 complete_packets_(0), 188 complete_packets_(0),
213 revived_packets_(0),
214 accept_packet_(true), 189 accept_packet_(true),
215 accept_public_header_(true) {} 190 accept_public_header_(true) {}
216 191
217 ~TestQuicVisitor() override { 192 ~TestQuicVisitor() override {
218 STLDeleteElements(&stream_frames_); 193 STLDeleteElements(&stream_frames_);
219 STLDeleteElements(&ack_frames_); 194 STLDeleteElements(&ack_frames_);
220 STLDeleteElements(&stop_waiting_frames_); 195 STLDeleteElements(&stop_waiting_frames_);
221 STLDeleteElements(&ping_frames_); 196 STLDeleteElements(&ping_frames_);
222 STLDeleteElements(&stream_data_); 197 STLDeleteElements(&stream_data_);
223 } 198 }
224 199
225 void OnError(QuicFramer* f) override { 200 void OnError(QuicFramer* f) override {
226 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) 201 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error())
227 << " (" << f->error() << ")"; 202 << " (" << f->error() << ")";
228 ++error_count_; 203 ++error_count_;
229 } 204 }
230 205
231 void OnPacket() override {} 206 void OnPacket() override {}
232 207
233 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override { 208 void OnPublicResetPacket(const QuicPublicResetPacket& packet) override {
234 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); 209 public_reset_packet_.reset(new QuicPublicResetPacket(packet));
235 } 210 }
236 211
237 void OnVersionNegotiationPacket( 212 void OnVersionNegotiationPacket(
238 const QuicVersionNegotiationPacket& packet) override { 213 const QuicVersionNegotiationPacket& packet) override {
239 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); 214 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet));
240 } 215 }
241 216
242 void OnRevivedPacket() override { ++revived_packets_; }
243
244 bool OnProtocolVersionMismatch(QuicVersion version) override { 217 bool OnProtocolVersionMismatch(QuicVersion version) override {
245 DVLOG(1) << "QuicFramer Version Mismatch, version: " << version; 218 DVLOG(1) << "QuicFramer Version Mismatch, version: " << version;
246 ++version_mismatch_; 219 ++version_mismatch_;
247 return true; 220 return true;
248 } 221 }
249 222
250 bool OnUnauthenticatedPublicHeader( 223 bool OnUnauthenticatedPublicHeader(
251 const QuicPacketPublicHeader& header) override { 224 const QuicPacketPublicHeader& header) override {
252 public_header_.reset(new QuicPacketPublicHeader(header)); 225 public_header_.reset(new QuicPacketPublicHeader(header));
253 return accept_public_header_; 226 return accept_public_header_;
254 } 227 }
255 228
256 bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override { 229 bool OnUnauthenticatedHeader(const QuicPacketHeader& header) override {
257 return true; 230 return true;
258 } 231 }
259 232
260 void OnDecryptedPacket(EncryptionLevel level) override {} 233 void OnDecryptedPacket(EncryptionLevel level) override {}
261 234
262 bool OnPacketHeader(const QuicPacketHeader& header) override { 235 bool OnPacketHeader(const QuicPacketHeader& header) override {
236 if (header.fec_flag) {
237 // Drop any FEC packet.
238 return false;
239 }
263 ++packet_count_; 240 ++packet_count_;
264 header_.reset(new QuicPacketHeader(header)); 241 header_.reset(new QuicPacketHeader(header));
265 return accept_packet_; 242 return accept_packet_;
266 } 243 }
267 244
268 bool OnStreamFrame(const QuicStreamFrame& frame) override { 245 bool OnStreamFrame(const QuicStreamFrame& frame) override {
269 ++frame_count_; 246 ++frame_count_;
270 // Save a copy of the data so it is valid after the packet is processed. 247 // Save a copy of the data so it is valid after the packet is processed.
271 string* string_data = new string(); 248 string* string_data = new string();
272 StringPiece(frame.frame_buffer, frame.frame_length) 249 StringPiece(frame.frame_buffer, frame.frame_length)
273 .AppendToString(string_data); 250 .AppendToString(string_data);
274 stream_data_.push_back(string_data); 251 stream_data_.push_back(string_data);
275 stream_frames_.push_back(new QuicStreamFrame(frame.stream_id, frame.fin, 252 stream_frames_.push_back(new QuicStreamFrame(frame.stream_id, frame.fin,
276 frame.offset, *string_data)); 253 frame.offset, *string_data));
277 return true; 254 return true;
278 } 255 }
279 256
280 void OnFecProtectedPayload(StringPiece payload) override {
281 fec_protected_payload_ = payload.as_string();
282 }
283
284 bool OnAckFrame(const QuicAckFrame& frame) override { 257 bool OnAckFrame(const QuicAckFrame& frame) override {
285 ++frame_count_; 258 ++frame_count_;
286 ack_frames_.push_back(new QuicAckFrame(frame)); 259 ack_frames_.push_back(new QuicAckFrame(frame));
287 return true; 260 return true;
288 } 261 }
289 262
290 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override { 263 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override {
291 ++frame_count_; 264 ++frame_count_;
292 stop_waiting_frames_.push_back(new QuicStopWaitingFrame(frame)); 265 stop_waiting_frames_.push_back(new QuicStopWaitingFrame(frame));
293 return true; 266 return true;
294 } 267 }
295 268
296 bool OnPingFrame(const QuicPingFrame& frame) override { 269 bool OnPingFrame(const QuicPingFrame& frame) override {
297 ++frame_count_; 270 ++frame_count_;
298 ping_frames_.push_back(new QuicPingFrame(frame)); 271 ping_frames_.push_back(new QuicPingFrame(frame));
299 return true; 272 return true;
300 } 273 }
301 274
302 void OnFecData(StringPiece redundancy) override {
303 ++fec_count_;
304 fec_data_redundancy_.push_back(redundancy.as_string());
305 }
306
307 void OnPacketComplete() override { ++complete_packets_; } 275 void OnPacketComplete() override { ++complete_packets_; }
308 276
309 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override { 277 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override {
310 rst_stream_frame_ = frame; 278 rst_stream_frame_ = frame;
311 return true; 279 return true;
312 } 280 }
313 281
314 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override { 282 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override {
315 connection_close_frame_ = frame; 283 connection_close_frame_ = frame;
316 return true; 284 return true;
(...skipping 17 matching lines...) Expand all
334 bool OnPathCloseFrame(const QuicPathCloseFrame& frame) override { 302 bool OnPathCloseFrame(const QuicPathCloseFrame& frame) override {
335 path_close_frame_ = frame; 303 path_close_frame_ = frame;
336 return true; 304 return true;
337 } 305 }
338 306
339 // Counters from the visitor_ callbacks. 307 // Counters from the visitor_ callbacks.
340 int error_count_; 308 int error_count_;
341 int version_mismatch_; 309 int version_mismatch_;
342 int packet_count_; 310 int packet_count_;
343 int frame_count_; 311 int frame_count_;
344 int fec_count_;
345 int complete_packets_; 312 int complete_packets_;
346 int revived_packets_;
347 bool accept_packet_; 313 bool accept_packet_;
348 bool accept_public_header_; 314 bool accept_public_header_;
349 315
350 scoped_ptr<QuicPacketHeader> header_; 316 scoped_ptr<QuicPacketHeader> header_;
351 scoped_ptr<QuicPacketPublicHeader> public_header_; 317 scoped_ptr<QuicPacketPublicHeader> public_header_;
352 scoped_ptr<QuicPublicResetPacket> public_reset_packet_; 318 scoped_ptr<QuicPublicResetPacket> public_reset_packet_;
353 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_; 319 scoped_ptr<QuicVersionNegotiationPacket> version_negotiation_packet_;
354 vector<QuicStreamFrame*> stream_frames_; 320 vector<QuicStreamFrame*> stream_frames_;
355 vector<QuicAckFrame*> ack_frames_; 321 vector<QuicAckFrame*> ack_frames_;
356 vector<QuicStopWaitingFrame*> stop_waiting_frames_; 322 vector<QuicStopWaitingFrame*> stop_waiting_frames_;
357 vector<QuicPingFrame*> ping_frames_; 323 vector<QuicPingFrame*> ping_frames_;
358 string fec_protected_payload_;
359 QuicRstStreamFrame rst_stream_frame_; 324 QuicRstStreamFrame rst_stream_frame_;
360 QuicConnectionCloseFrame connection_close_frame_; 325 QuicConnectionCloseFrame connection_close_frame_;
361 QuicGoAwayFrame goaway_frame_; 326 QuicGoAwayFrame goaway_frame_;
362 QuicWindowUpdateFrame window_update_frame_; 327 QuicWindowUpdateFrame window_update_frame_;
363 QuicBlockedFrame blocked_frame_; 328 QuicBlockedFrame blocked_frame_;
364 QuicPathCloseFrame path_close_frame_; 329 QuicPathCloseFrame path_close_frame_;
365 vector<string*> stream_data_; 330 vector<string*> stream_data_;
366 vector<string> fec_data_redundancy_;
367 }; 331 };
368 332
369 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> { 333 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> {
370 public: 334 public:
371 QuicFramerTest() 335 QuicFramerTest()
372 : encrypter_(new test::TestEncrypter()), 336 : encrypter_(new test::TestEncrypter()),
373 decrypter_(new test::TestDecrypter()), 337 decrypter_(new test::TestDecrypter()),
374 start_(QuicTime::Zero().Add(QuicTime::Delta::FromMicroseconds(0x10))), 338 start_(QuicTime::Zero().Add(QuicTime::Delta::FromMicroseconds(0x10))),
375 framer_(QuicSupportedVersions(), start_, Perspective::IS_SERVER) { 339 framer_(QuicSupportedVersions(), start_, Perspective::IS_SERVER) {
376 version_ = GetParam(); 340 version_ = GetParam();
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 expected_error = "Unable to read stream_id."; 438 expected_error = "Unable to read stream_id.";
475 } else if (i < kQuicFrameTypeSize + stream_id_size + 439 } else if (i < kQuicFrameTypeSize + stream_id_size +
476 kQuicMaxStreamOffsetSize) { 440 kQuicMaxStreamOffsetSize) {
477 expected_error = "Unable to read offset."; 441 expected_error = "Unable to read offset.";
478 } else { 442 } else {
479 expected_error = "Unable to read frame data."; 443 expected_error = "Unable to read frame data.";
480 } 444 }
481 CheckProcessingFails( 445 CheckProcessingFails(
482 packet, 446 packet,
483 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, include_version, 447 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, include_version,
484 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 448 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
485 NOT_IN_FEC_GROUP),
486 expected_error, QUIC_INVALID_STREAM_DATA); 449 expected_error, QUIC_INVALID_STREAM_DATA);
487 } 450 }
488 } 451 }
489 452
490 void CheckCalculatePacketNumber(QuicPacketNumber expected_packet_number, 453 void CheckCalculatePacketNumber(QuicPacketNumber expected_packet_number,
491 QuicPacketNumber last_packet_number) { 454 QuicPacketNumber last_packet_number) {
492 QuicPacketNumber wire_packet_number = expected_packet_number & kMask; 455 QuicPacketNumber wire_packet_number = expected_packet_number & kMask;
493 QuicFramerPeer::SetLastPacketNumber(&framer_, last_packet_number); 456 QuicFramerPeer::SetLastPacketNumber(&framer_, last_packet_number);
494 EXPECT_EQ( 457 EXPECT_EQ(
495 expected_packet_number, 458 expected_packet_number,
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
641 // connection_id 604 // connection_id
642 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 605 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
643 // packet number 606 // packet number
644 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 607 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
645 // private flags 608 // private flags
646 0x00, 609 0x00,
647 }; 610 };
648 611
649 memset(packet + GetPacketHeaderSize( 612 memset(packet + GetPacketHeaderSize(
650 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId, 613 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId,
651 PACKET_6BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP), 0, 614 PACKET_6BYTE_PACKET_NUMBER), 0,
652 kMaxPacketSize - GetPacketHeaderSize( 615 kMaxPacketSize - GetPacketHeaderSize(
653 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId, 616 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId,
654 PACKET_6BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP) + 1); 617 PACKET_6BYTE_PACKET_NUMBER) + 1);
655 // clang-format on 618 // clang-format on
656 619
657 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 620 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
658 EXPECT_DFATAL(framer_.ProcessPacket(encrypted), "Packet too large:1"); 621 EXPECT_DFATAL(framer_.ProcessPacket(encrypted), "Packet too large:1");
659 622
660 ASSERT_TRUE(visitor_.header_.get()); 623 ASSERT_TRUE(visitor_.header_.get());
661 // Make sure we've parsed the packet header, so we can send an error. 624 // Make sure we've parsed the packet header, so we can send an error.
662 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); 625 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
663 // Make sure the correct error is propagated. 626 // Make sure the correct error is propagated.
664 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error()); 627 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error());
(...skipping 24 matching lines...) Expand all
689 EXPECT_FALSE(visitor_.header_->fec_flag); 652 EXPECT_FALSE(visitor_.header_->fec_flag);
690 EXPECT_FALSE(visitor_.header_->entropy_flag); 653 EXPECT_FALSE(visitor_.header_->entropy_flag);
691 EXPECT_EQ(0, visitor_.header_->entropy_hash); 654 EXPECT_EQ(0, visitor_.header_->entropy_hash);
692 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 655 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
693 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 656 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
694 EXPECT_EQ(0u, visitor_.header_->fec_group); 657 EXPECT_EQ(0u, visitor_.header_->fec_group);
695 658
696 // Now test framing boundaries. 659 // Now test framing boundaries.
697 for (size_t i = 0; 660 for (size_t i = 0;
698 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 661 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
699 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 662 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
700 NOT_IN_FEC_GROUP);
701 ++i) { 663 ++i) {
702 string expected_error; 664 string expected_error;
703 if (i < kConnectionIdOffset) { 665 if (i < kConnectionIdOffset) {
704 expected_error = "Unable to read public flags."; 666 expected_error = "Unable to read public flags.";
705 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { 667 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) {
706 expected_error = "Unable to read ConnectionId."; 668 expected_error = "Unable to read ConnectionId.";
707 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId)) { 669 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId)) {
708 expected_error = "Unable to read packet number."; 670 expected_error = "Unable to read packet number.";
709 } else if (i < GetFecGroupOffset(!kIncludeVersion, !kIncludePathId)) { 671 } else {
710 expected_error = "Unable to read private flags."; 672 expected_error = "Unable to read private flags.";
711 } else {
712 expected_error = "Unable to read first fec protected packet offset.";
713 } 673 }
714 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 674 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
715 } 675 }
716 } 676 }
717 677
718 TEST_P(QuicFramerTest, PacketHeaderWith4ByteConnectionId) { 678 TEST_P(QuicFramerTest, PacketHeaderWith4ByteConnectionId) {
719 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId); 679 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId);
720 680
721 // clang-format off 681 // clang-format off
722 unsigned char packet[] = { 682 unsigned char packet[] = {
(...skipping 19 matching lines...) Expand all
742 EXPECT_FALSE(visitor_.header_->fec_flag); 702 EXPECT_FALSE(visitor_.header_->fec_flag);
743 EXPECT_FALSE(visitor_.header_->entropy_flag); 703 EXPECT_FALSE(visitor_.header_->entropy_flag);
744 EXPECT_EQ(0, visitor_.header_->entropy_hash); 704 EXPECT_EQ(0, visitor_.header_->entropy_hash);
745 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 705 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
746 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 706 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
747 EXPECT_EQ(0u, visitor_.header_->fec_group); 707 EXPECT_EQ(0u, visitor_.header_->fec_group);
748 708
749 // Now test framing boundaries. 709 // Now test framing boundaries.
750 for (size_t i = 0; 710 for (size_t i = 0;
751 i < GetPacketHeaderSize(PACKET_4BYTE_CONNECTION_ID, !kIncludeVersion, 711 i < GetPacketHeaderSize(PACKET_4BYTE_CONNECTION_ID, !kIncludeVersion,
752 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 712 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
753 NOT_IN_FEC_GROUP);
754 ++i) { 713 ++i) {
755 string expected_error; 714 string expected_error;
756 if (i < kConnectionIdOffset) { 715 if (i < kConnectionIdOffset) {
757 expected_error = "Unable to read public flags."; 716 expected_error = "Unable to read public flags.";
758 } else if (i < GetPacketNumberOffset(PACKET_4BYTE_CONNECTION_ID, 717 } else if (i < GetPacketNumberOffset(PACKET_4BYTE_CONNECTION_ID,
759 !kIncludeVersion, !kIncludePathId)) { 718 !kIncludeVersion, !kIncludePathId)) {
760 expected_error = "Unable to read ConnectionId."; 719 expected_error = "Unable to read ConnectionId.";
761 } else if (i < GetPrivateFlagsOffset(PACKET_4BYTE_CONNECTION_ID, 720 } else if (i < GetPrivateFlagsOffset(PACKET_4BYTE_CONNECTION_ID,
762 !kIncludeVersion, !kIncludePathId)) { 721 !kIncludeVersion, !kIncludePathId)) {
763 expected_error = "Unable to read packet number."; 722 expected_error = "Unable to read packet number.";
764 } else if (i < GetFecGroupOffset(PACKET_4BYTE_CONNECTION_ID, 723 } else {
765 !kIncludeVersion, !kIncludePathId)) {
766 expected_error = "Unable to read private flags."; 724 expected_error = "Unable to read private flags.";
767 } else {
768 expected_error = "Unable to read first fec protected packet offset.";
769 } 725 }
770 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 726 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
771 } 727 }
772 } 728 }
773 729
774 TEST_P(QuicFramerTest, PacketHeader1ByteConnectionId) { 730 TEST_P(QuicFramerTest, PacketHeader1ByteConnectionId) {
775 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId); 731 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId);
776 732
777 // clang-format off 733 // clang-format off
778 unsigned char packet[] = { 734 unsigned char packet[] = {
(...skipping 19 matching lines...) Expand all
798 EXPECT_FALSE(visitor_.header_->fec_flag); 754 EXPECT_FALSE(visitor_.header_->fec_flag);
799 EXPECT_FALSE(visitor_.header_->entropy_flag); 755 EXPECT_FALSE(visitor_.header_->entropy_flag);
800 EXPECT_EQ(0, visitor_.header_->entropy_hash); 756 EXPECT_EQ(0, visitor_.header_->entropy_hash);
801 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 757 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
802 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 758 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
803 EXPECT_EQ(0u, visitor_.header_->fec_group); 759 EXPECT_EQ(0u, visitor_.header_->fec_group);
804 760
805 // Now test framing boundaries. 761 // Now test framing boundaries.
806 for (size_t i = 0; 762 for (size_t i = 0;
807 i < GetPacketHeaderSize(PACKET_1BYTE_CONNECTION_ID, !kIncludeVersion, 763 i < GetPacketHeaderSize(PACKET_1BYTE_CONNECTION_ID, !kIncludeVersion,
808 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 764 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
809 NOT_IN_FEC_GROUP);
810 ++i) { 765 ++i) {
811 string expected_error; 766 string expected_error;
812 if (i < kConnectionIdOffset) { 767 if (i < kConnectionIdOffset) {
813 expected_error = "Unable to read public flags."; 768 expected_error = "Unable to read public flags.";
814 } else if (i < GetPacketNumberOffset(PACKET_1BYTE_CONNECTION_ID, 769 } else if (i < GetPacketNumberOffset(PACKET_1BYTE_CONNECTION_ID,
815 !kIncludeVersion, !kIncludePathId)) { 770 !kIncludeVersion, !kIncludePathId)) {
816 expected_error = "Unable to read ConnectionId."; 771 expected_error = "Unable to read ConnectionId.";
817 } else if (i < GetPrivateFlagsOffset(PACKET_1BYTE_CONNECTION_ID, 772 } else if (i < GetPrivateFlagsOffset(PACKET_1BYTE_CONNECTION_ID,
818 !kIncludeVersion, !kIncludePathId)) { 773 !kIncludeVersion, !kIncludePathId)) {
819 expected_error = "Unable to read packet number."; 774 expected_error = "Unable to read packet number.";
820 } else if (i < GetFecGroupOffset(PACKET_1BYTE_CONNECTION_ID, 775 } else {
821 !kIncludeVersion, !kIncludePathId)) {
822 expected_error = "Unable to read private flags."; 776 expected_error = "Unable to read private flags.";
823 } else {
824 expected_error = "Unable to read first fec protected packet offset.";
825 } 777 }
826 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 778 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
827 } 779 }
828 } 780 }
829 781
830 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) { 782 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) {
831 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId); 783 QuicFramerPeer::SetLastSerializedConnectionId(&framer_, kConnectionId);
832 784
833 // clang-format off 785 // clang-format off
834 unsigned char packet[] = { 786 unsigned char packet[] = {
(...skipping 19 matching lines...) Expand all
854 EXPECT_FALSE(visitor_.header_->fec_flag); 806 EXPECT_FALSE(visitor_.header_->fec_flag);
855 EXPECT_FALSE(visitor_.header_->entropy_flag); 807 EXPECT_FALSE(visitor_.header_->entropy_flag);
856 EXPECT_EQ(0, visitor_.header_->entropy_hash); 808 EXPECT_EQ(0, visitor_.header_->entropy_hash);
857 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 809 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
858 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 810 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
859 EXPECT_EQ(0u, visitor_.header_->fec_group); 811 EXPECT_EQ(0u, visitor_.header_->fec_group);
860 812
861 // Now test framing boundaries. 813 // Now test framing boundaries.
862 for (size_t i = 0; 814 for (size_t i = 0;
863 i < GetPacketHeaderSize(PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion, 815 i < GetPacketHeaderSize(PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion,
864 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 816 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
865 NOT_IN_FEC_GROUP);
866 ++i) { 817 ++i) {
867 string expected_error; 818 string expected_error;
868 if (i < kConnectionIdOffset) { 819 if (i < kConnectionIdOffset) {
869 expected_error = "Unable to read public flags."; 820 expected_error = "Unable to read public flags.";
870 } else if (i < GetPacketNumberOffset(PACKET_0BYTE_CONNECTION_ID, 821 } else if (i < GetPacketNumberOffset(PACKET_0BYTE_CONNECTION_ID,
871 !kIncludeVersion, !kIncludePathId)) { 822 !kIncludeVersion, !kIncludePathId)) {
872 expected_error = "Unable to read ConnectionId."; 823 expected_error = "Unable to read ConnectionId.";
873 } else if (i < GetPrivateFlagsOffset(PACKET_0BYTE_CONNECTION_ID, 824 } else if (i < GetPrivateFlagsOffset(PACKET_0BYTE_CONNECTION_ID,
874 !kIncludeVersion, !kIncludePathId)) { 825 !kIncludeVersion, !kIncludePathId)) {
875 expected_error = "Unable to read packet number."; 826 expected_error = "Unable to read packet number.";
876 } else if (i < GetFecGroupOffset(PACKET_0BYTE_CONNECTION_ID, 827 } else {
877 !kIncludeVersion, !kIncludePathId)) {
878 expected_error = "Unable to read private flags."; 828 expected_error = "Unable to read private flags.";
879 } else {
880 expected_error = "Unable to read first fec protected packet offset.";
881 } 829 }
882 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 830 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
883 } 831 }
884 } 832 }
885 833
886 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) { 834 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) {
887 // clang-format off 835 // clang-format off
888 unsigned char packet[] = { 836 unsigned char packet[] = {
889 // public flags (version) 837 // public flags (version)
890 0x3D, 838 0x3D,
(...skipping 20 matching lines...) Expand all
911 EXPECT_FALSE(visitor_.header_->fec_flag); 859 EXPECT_FALSE(visitor_.header_->fec_flag);
912 EXPECT_FALSE(visitor_.header_->entropy_flag); 860 EXPECT_FALSE(visitor_.header_->entropy_flag);
913 EXPECT_EQ(0, visitor_.header_->entropy_hash); 861 EXPECT_EQ(0, visitor_.header_->entropy_hash);
914 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 862 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
915 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 863 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
916 EXPECT_EQ(0u, visitor_.header_->fec_group); 864 EXPECT_EQ(0u, visitor_.header_->fec_group);
917 865
918 // Now test framing boundaries. 866 // Now test framing boundaries.
919 for (size_t i = 0; 867 for (size_t i = 0;
920 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, 868 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion,
921 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 869 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
922 NOT_IN_FEC_GROUP);
923 ++i) { 870 ++i) {
924 string expected_error; 871 string expected_error;
925 if (i < kConnectionIdOffset) { 872 if (i < kConnectionIdOffset) {
926 expected_error = "Unable to read public flags."; 873 expected_error = "Unable to read public flags.";
927 } else if (i < kVersionOffset) { 874 } else if (i < kVersionOffset) {
928 expected_error = "Unable to read ConnectionId."; 875 expected_error = "Unable to read ConnectionId.";
929 } else if (i < GetPacketNumberOffset(kIncludeVersion, !kIncludePathId)) { 876 } else if (i < GetPacketNumberOffset(kIncludeVersion, !kIncludePathId)) {
930 expected_error = "Unable to read protocol version."; 877 expected_error = "Unable to read protocol version.";
931 } else if (i < GetPrivateFlagsOffset(kIncludeVersion, !kIncludePathId)) { 878 } else if (i < GetPrivateFlagsOffset(kIncludeVersion, !kIncludePathId)) {
932 expected_error = "Unable to read packet number."; 879 expected_error = "Unable to read packet number.";
933 } else if (i < GetFecGroupOffset(kIncludeVersion, !kIncludePathId)) { 880 } else {
934 expected_error = "Unable to read private flags."; 881 expected_error = "Unable to read private flags.";
935 } else {
936 expected_error = "Unable to read first fec protected packet offset.";
937 } 882 }
938 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 883 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
939 } 884 }
940 } 885 }
941 886
942 TEST_P(QuicFramerTest, PacketHeaderWithMultipathFlag) { 887 TEST_P(QuicFramerTest, PacketHeaderWithMultipathFlag) {
943 // clang-format off 888 // clang-format off
944 unsigned char packet[] = { 889 unsigned char packet[] = {
945 // public flags (version) 890 // public flags (version)
946 0x7C, 891 0x7C,
(...skipping 21 matching lines...) Expand all
968 EXPECT_FALSE(visitor_.header_->entropy_flag); 913 EXPECT_FALSE(visitor_.header_->entropy_flag);
969 EXPECT_EQ(0, visitor_.header_->entropy_hash); 914 EXPECT_EQ(0, visitor_.header_->entropy_hash);
970 EXPECT_EQ(kPathId, visitor_.header_->path_id); 915 EXPECT_EQ(kPathId, visitor_.header_->path_id);
971 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 916 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
972 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 917 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
973 EXPECT_EQ(0u, visitor_.header_->fec_group); 918 EXPECT_EQ(0u, visitor_.header_->fec_group);
974 919
975 // Now test framing boundaries. 920 // Now test framing boundaries.
976 for (size_t i = 0; 921 for (size_t i = 0;
977 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 922 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
978 kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 923 kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
979 NOT_IN_FEC_GROUP);
980 ++i) { 924 ++i) {
981 string expected_error; 925 string expected_error;
982 if (i < kConnectionIdOffset) { 926 if (i < kConnectionIdOffset) {
983 expected_error = "Unable to read public flags."; 927 expected_error = "Unable to read public flags.";
984 } else if (i < 928 } else if (i <
985 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion)) { 929 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion)) {
986 expected_error = "Unable to read ConnectionId."; 930 expected_error = "Unable to read ConnectionId.";
987 } else if (i < GetPacketNumberOffset(!kIncludeVersion, kIncludePathId)) { 931 } else if (i < GetPacketNumberOffset(!kIncludeVersion, kIncludePathId)) {
988 expected_error = "Unable to read path id."; 932 expected_error = "Unable to read path id.";
989 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, kIncludePathId)) { 933 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, kIncludePathId)) {
990 expected_error = "Unable to read packet number."; 934 expected_error = "Unable to read packet number.";
991 } else if (i < GetFecGroupOffset(!kIncludeVersion, kIncludePathId)) { 935 } else {
992 expected_error = "Unable to read private flags."; 936 expected_error = "Unable to read private flags.";
993 } else {
994 expected_error = "Unable to read first fec protected packet offset.";
995 } 937 }
996 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 938 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
997 } 939 }
998 } 940 }
999 941
1000 TEST_P(QuicFramerTest, PacketHeaderWithBothVersionFlagAndMultipathFlag) { 942 TEST_P(QuicFramerTest, PacketHeaderWithBothVersionFlagAndMultipathFlag) {
1001 // clang-format off 943 // clang-format off
1002 unsigned char packet[] = { 944 unsigned char packet[] = {
1003 // public flags (version) 945 // public flags (version)
1004 0x7D, 946 0x7D,
(...skipping 24 matching lines...) Expand all
1029 EXPECT_FALSE(visitor_.header_->entropy_flag); 971 EXPECT_FALSE(visitor_.header_->entropy_flag);
1030 EXPECT_EQ(0, visitor_.header_->entropy_hash); 972 EXPECT_EQ(0, visitor_.header_->entropy_hash);
1031 EXPECT_EQ(kPathId, visitor_.header_->path_id); 973 EXPECT_EQ(kPathId, visitor_.header_->path_id);
1032 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 974 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1033 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 975 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
1034 EXPECT_EQ(0u, visitor_.header_->fec_group); 976 EXPECT_EQ(0u, visitor_.header_->fec_group);
1035 977
1036 // Now test framing boundaries. 978 // Now test framing boundaries.
1037 for (size_t i = 0; 979 for (size_t i = 0;
1038 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 980 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1039 kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 981 kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
1040 NOT_IN_FEC_GROUP);
1041 ++i) { 982 ++i) {
1042 string expected_error; 983 string expected_error;
1043 if (i < kConnectionIdOffset) { 984 if (i < kConnectionIdOffset) {
1044 expected_error = "Unable to read public flags."; 985 expected_error = "Unable to read public flags.";
1045 } else if (i < kVersionOffset) { 986 } else if (i < kVersionOffset) {
1046 expected_error = "Unable to read ConnectionId."; 987 expected_error = "Unable to read ConnectionId.";
1047 } else if (i < 988 } else if (i <
1048 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion)) { 989 GetPathIdOffset(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion)) {
1049 expected_error = "Unable to read protocol version."; 990 expected_error = "Unable to read protocol version.";
1050 } else if (i < GetPacketNumberOffset(kIncludeVersion, kIncludePathId)) { 991 } else if (i < GetPacketNumberOffset(kIncludeVersion, kIncludePathId)) {
1051 expected_error = "Unable to read path id."; 992 expected_error = "Unable to read path id.";
1052 } else if (i < GetPrivateFlagsOffset(kIncludeVersion, kIncludePathId)) { 993 } else if (i < GetPrivateFlagsOffset(kIncludeVersion, kIncludePathId)) {
1053 expected_error = "Unable to read packet number."; 994 expected_error = "Unable to read packet number.";
1054 } else if (i < GetFecGroupOffset(kIncludeVersion, kIncludePathId)) { 995 } else {
1055 expected_error = "Unable to read private flags."; 996 expected_error = "Unable to read private flags.";
1056 } else {
1057 expected_error = "Unable to read first fec protected packet offset.";
1058 } 997 }
1059 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 998 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
1060 } 999 }
1061 } 1000 }
1062 1001
1063 TEST_P(QuicFramerTest, PacketHeaderWithPathChange) { 1002 TEST_P(QuicFramerTest, PacketHeaderWithPathChange) {
1064 // Packet 1 from path 0x42. 1003 // Packet 1 from path 0x42.
1065 // clang-format off 1004 // clang-format off
1066 unsigned char packet1[] = { 1005 unsigned char packet1[] = {
1067 // public flags (version) 1006 // public flags (version)
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1194 EXPECT_FALSE(visitor_.header_->fec_flag); 1133 EXPECT_FALSE(visitor_.header_->fec_flag);
1195 EXPECT_FALSE(visitor_.header_->entropy_flag); 1134 EXPECT_FALSE(visitor_.header_->entropy_flag);
1196 EXPECT_EQ(0, visitor_.header_->entropy_hash); 1135 EXPECT_EQ(0, visitor_.header_->entropy_hash);
1197 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 1136 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1198 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 1137 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
1199 EXPECT_EQ(0u, visitor_.header_->fec_group); 1138 EXPECT_EQ(0u, visitor_.header_->fec_group);
1200 1139
1201 // Now test framing boundaries. 1140 // Now test framing boundaries.
1202 for (size_t i = 0; 1141 for (size_t i = 0;
1203 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1142 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1204 !kIncludePathId, PACKET_4BYTE_PACKET_NUMBER, 1143 !kIncludePathId, PACKET_4BYTE_PACKET_NUMBER);
1205 NOT_IN_FEC_GROUP);
1206 ++i) { 1144 ++i) {
1207 string expected_error; 1145 string expected_error;
1208 if (i < kConnectionIdOffset) { 1146 if (i < kConnectionIdOffset) {
1209 expected_error = "Unable to read public flags."; 1147 expected_error = "Unable to read public flags.";
1210 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { 1148 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) {
1211 expected_error = "Unable to read ConnectionId."; 1149 expected_error = "Unable to read ConnectionId.";
1212 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId, 1150 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId,
1213 PACKET_4BYTE_PACKET_NUMBER)) { 1151 PACKET_4BYTE_PACKET_NUMBER)) {
1214 expected_error = "Unable to read packet number."; 1152 expected_error = "Unable to read packet number.";
1215 } else if (i < GetFecGroupOffset(!kIncludeVersion, !kIncludePathId, 1153 } else {
1216 PACKET_4BYTE_PACKET_NUMBER)) {
1217 expected_error = "Unable to read private flags."; 1154 expected_error = "Unable to read private flags.";
1218 } else {
1219 expected_error = "Unable to read first fec protected packet offset.";
1220 } 1155 }
1221 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 1156 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
1222 } 1157 }
1223 } 1158 }
1224 1159
1225 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) { 1160 TEST_P(QuicFramerTest, PacketHeaderWith2BytePacketNumber) {
1226 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); 1161 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2);
1227 1162
1228 // clang-format off 1163 // clang-format off
1229 unsigned char packet[] = { 1164 unsigned char packet[] = {
(...skipping 19 matching lines...) Expand all
1249 EXPECT_FALSE(visitor_.header_->fec_flag); 1184 EXPECT_FALSE(visitor_.header_->fec_flag);
1250 EXPECT_FALSE(visitor_.header_->entropy_flag); 1185 EXPECT_FALSE(visitor_.header_->entropy_flag);
1251 EXPECT_EQ(0, visitor_.header_->entropy_hash); 1186 EXPECT_EQ(0, visitor_.header_->entropy_hash);
1252 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 1187 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1253 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 1188 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
1254 EXPECT_EQ(0u, visitor_.header_->fec_group); 1189 EXPECT_EQ(0u, visitor_.header_->fec_group);
1255 1190
1256 // Now test framing boundaries. 1191 // Now test framing boundaries.
1257 for (size_t i = 0; 1192 for (size_t i = 0;
1258 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1193 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1259 !kIncludePathId, PACKET_2BYTE_PACKET_NUMBER, 1194 !kIncludePathId, PACKET_2BYTE_PACKET_NUMBER);
1260 NOT_IN_FEC_GROUP);
1261 ++i) { 1195 ++i) {
1262 string expected_error; 1196 string expected_error;
1263 if (i < kConnectionIdOffset) { 1197 if (i < kConnectionIdOffset) {
1264 expected_error = "Unable to read public flags."; 1198 expected_error = "Unable to read public flags.";
1265 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { 1199 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) {
1266 expected_error = "Unable to read ConnectionId."; 1200 expected_error = "Unable to read ConnectionId.";
1267 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId, 1201 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId,
1268 PACKET_2BYTE_PACKET_NUMBER)) { 1202 PACKET_2BYTE_PACKET_NUMBER)) {
1269 expected_error = "Unable to read packet number."; 1203 expected_error = "Unable to read packet number.";
1270 } else if (i < GetFecGroupOffset(!kIncludeVersion, !kIncludePathId, 1204 } else {
1271 PACKET_2BYTE_PACKET_NUMBER)) {
1272 expected_error = "Unable to read private flags."; 1205 expected_error = "Unable to read private flags.";
1273 } else {
1274 expected_error = "Unable to read first fec protected packet offset.";
1275 } 1206 }
1276 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 1207 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
1277 } 1208 }
1278 } 1209 }
1279 1210
1280 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) { 1211 TEST_P(QuicFramerTest, PacketHeaderWith1BytePacketNumber) {
1281 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2); 1212 QuicFramerPeer::SetLastPacketNumber(&framer_, kPacketNumber - 2);
1282 1213
1283 // clang-format off 1214 // clang-format off
1284 unsigned char packet[] = { 1215 unsigned char packet[] = {
(...skipping 19 matching lines...) Expand all
1304 EXPECT_FALSE(visitor_.header_->fec_flag); 1235 EXPECT_FALSE(visitor_.header_->fec_flag);
1305 EXPECT_FALSE(visitor_.header_->entropy_flag); 1236 EXPECT_FALSE(visitor_.header_->entropy_flag);
1306 EXPECT_EQ(0, visitor_.header_->entropy_hash); 1237 EXPECT_EQ(0, visitor_.header_->entropy_hash);
1307 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); 1238 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1308 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); 1239 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
1309 EXPECT_EQ(0u, visitor_.header_->fec_group); 1240 EXPECT_EQ(0u, visitor_.header_->fec_group);
1310 1241
1311 // Now test framing boundaries. 1242 // Now test framing boundaries.
1312 for (size_t i = 0; 1243 for (size_t i = 0;
1313 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1244 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1314 !kIncludePathId, PACKET_1BYTE_PACKET_NUMBER, 1245 !kIncludePathId, PACKET_1BYTE_PACKET_NUMBER);
1315 NOT_IN_FEC_GROUP);
1316 ++i) { 1246 ++i) {
1317 string expected_error; 1247 string expected_error;
1318 if (i < kConnectionIdOffset) { 1248 if (i < kConnectionIdOffset) {
1319 expected_error = "Unable to read public flags."; 1249 expected_error = "Unable to read public flags.";
1320 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) { 1250 } else if (i < GetPacketNumberOffset(!kIncludeVersion, !kIncludePathId)) {
1321 expected_error = "Unable to read ConnectionId."; 1251 expected_error = "Unable to read ConnectionId.";
1322 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId, 1252 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, !kIncludePathId,
1323 PACKET_1BYTE_PACKET_NUMBER)) { 1253 PACKET_1BYTE_PACKET_NUMBER)) {
1324 expected_error = "Unable to read packet number."; 1254 expected_error = "Unable to read packet number.";
1325 } else if (i < GetFecGroupOffset(!kIncludeVersion, !kIncludePathId, 1255 } else {
1326 PACKET_1BYTE_PACKET_NUMBER)) {
1327 expected_error = "Unable to read private flags."; 1256 expected_error = "Unable to read private flags.";
1328 } else {
1329 expected_error = "Unable to read first fec protected packet offset.";
1330 } 1257 }
1331 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); 1258 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
1332 } 1259 }
1333 } 1260 }
1334 1261
1335 TEST_P(QuicFramerTest, InvalidPublicFlag) { 1262 TEST_P(QuicFramerTest, InvalidPublicFlag) {
1336 // clang-format off 1263 // clang-format off
1337 unsigned char packet[] = { 1264 unsigned char packet[] = {
1338 // public flags: all flags set but the public reset flag and version flag. 1265 // public flags: all flags set but the public reset flag and version flag.
1339 0xFC, 1266 0xFC,
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1497 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1424 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1498 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1425 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1499 ASSERT_TRUE(visitor_.header_.get()); 1426 ASSERT_TRUE(visitor_.header_.get());
1500 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId)); 1427 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId));
1501 1428
1502 ASSERT_EQ(0u, visitor_.stream_frames_.size()); 1429 ASSERT_EQ(0u, visitor_.stream_frames_.size());
1503 EXPECT_EQ(0u, visitor_.ack_frames_.size()); 1430 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1504 // A packet with no frames is not acceptable. 1431 // A packet with no frames is not acceptable.
1505 CheckProcessingFails( 1432 CheckProcessingFails(
1506 packet, GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1433 packet, GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1507 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 1434 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
1508 NOT_IN_FEC_GROUP),
1509 "Packet has no frames.", QUIC_MISSING_PAYLOAD); 1435 "Packet has no frames.", QUIC_MISSING_PAYLOAD);
1510 } 1436 }
1511 1437
1512 TEST_P(QuicFramerTest, StreamFrame) { 1438 TEST_P(QuicFramerTest, StreamFrame) {
1513 // clang-format off 1439 // clang-format off
1514 unsigned char packet[] = { 1440 unsigned char packet[] = {
1515 // public flags (8 byte connection_id) 1441 // public flags (8 byte connection_id)
1516 0x3C, 1442 0x3C,
1517 // connection_id 1443 // connection_id
1518 0x10, 0x32, 0x54, 0x76, 1444 0x10, 0x32, 0x54, 0x76,
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
1816 // clang-format on 1742 // clang-format on
1817 1743
1818 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 1744 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1819 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 1745 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1820 1746
1821 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 1747 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1822 ASSERT_TRUE(visitor_.public_header_.get()); 1748 ASSERT_TRUE(visitor_.public_header_.get());
1823 ASSERT_FALSE(visitor_.header_.get()); 1749 ASSERT_FALSE(visitor_.header_.get());
1824 } 1750 }
1825 1751
1826 TEST_P(QuicFramerTest, RevivedStreamFrame) {
1827 // clang-format off
1828 unsigned char payload[] = {
1829 // frame type (stream frame with fin)
1830 0xFF,
1831 // stream id
1832 0x04, 0x03, 0x02, 0x01,
1833 // offset
1834 0x54, 0x76, 0x10, 0x32,
1835 0xDC, 0xFE, 0x98, 0xBA,
1836 // data length
1837 0x0c, 0x00,
1838 // data
1839 'h', 'e', 'l', 'l',
1840 'o', ' ', 'w', 'o',
1841 'r', 'l', 'd', '!',
1842 };
1843 // clang-format on
1844
1845 QuicPacketHeader header;
1846 header.public_header.connection_id = kConnectionId;
1847 header.public_header.reset_flag = false;
1848 header.public_header.version_flag = false;
1849 header.fec_flag = true;
1850 header.entropy_flag = true;
1851 header.packet_number = kPacketNumber;
1852 header.fec_group = 0;
1853
1854 // Do not encrypt the payload because the revived payload is post-encryption.
1855 EXPECT_TRUE(framer_.ProcessRevivedPacket(
1856 &header, StringPiece(AsChars(payload), arraysize(payload))));
1857
1858 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1859 ASSERT_EQ(1, visitor_.revived_packets_);
1860 ASSERT_TRUE(visitor_.header_.get());
1861 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id);
1862 EXPECT_FALSE(visitor_.header_->public_header.reset_flag);
1863 EXPECT_FALSE(visitor_.header_->public_header.version_flag);
1864 EXPECT_TRUE(visitor_.header_->fec_flag);
1865 EXPECT_TRUE(visitor_.header_->entropy_flag);
1866 EXPECT_EQ(1 << (header.packet_number % 8), visitor_.header_->entropy_hash);
1867 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number);
1868 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
1869 EXPECT_EQ(0u, visitor_.header_->fec_group);
1870
1871 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1872 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1873 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1874 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1875 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1876 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]);
1877 }
1878
1879 TEST_P(QuicFramerTest, StreamFrameInFecGroup) {
1880 // clang-format off
1881 unsigned char packet[] = {
1882 // public flags (8 byte connection_id)
1883 0x3C,
1884 // connection_id
1885 0x10, 0x32, 0x54, 0x76,
1886 0x98, 0xBA, 0xDC, 0xFE,
1887 // packet number
1888 0xBC, 0x9A, 0x78, 0x56,
1889 0x34, 0x12,
1890 // private flags (fec group)
1891 0x02,
1892 // first fec protected packet offset
1893 0x02,
1894
1895 // frame type (stream frame with fin)
1896 0xFF,
1897 // stream id
1898 0x04, 0x03, 0x02, 0x01,
1899 // offset
1900 0x54, 0x76, 0x10, 0x32,
1901 0xDC, 0xFE, 0x98, 0xBA,
1902 // data length
1903 0x0c, 0x00,
1904 // data
1905 'h', 'e', 'l', 'l',
1906 'o', ' ', 'w', 'o',
1907 'r', 'l', 'd', '!',
1908 };
1909 // clang-format on
1910
1911 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
1912 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
1913
1914 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
1915 ASSERT_TRUE(visitor_.header_.get());
1916 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId));
1917 EXPECT_EQ(IN_FEC_GROUP, visitor_.header_->is_in_fec_group);
1918 EXPECT_EQ(kPacketNumber - 2, visitor_.header_->fec_group);
1919 const size_t fec_offset =
1920 GetStartOfFecProtectedData(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
1921 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
1922 EXPECT_EQ(
1923 string(AsChars(packet) + fec_offset, arraysize(packet) - fec_offset),
1924 visitor_.fec_protected_payload_);
1925
1926 ASSERT_EQ(1u, visitor_.stream_frames_.size());
1927 EXPECT_EQ(0u, visitor_.ack_frames_.size());
1928 EXPECT_EQ(kStreamId, visitor_.stream_frames_[0]->stream_id);
1929 EXPECT_TRUE(visitor_.stream_frames_[0]->fin);
1930 EXPECT_EQ(kStreamOffset, visitor_.stream_frames_[0]->offset);
1931 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]);
1932 }
1933
1934 TEST_P(QuicFramerTest, AckFrameTwoTimestamp) { 1752 TEST_P(QuicFramerTest, AckFrameTwoTimestamp) {
1935 // clang-format off 1753 // clang-format off
1936 unsigned char packet[] = { 1754 unsigned char packet[] = {
1937 // public flags (8 byte connection_id) 1755 // public flags (8 byte connection_id)
1938 0x3C, 1756 0x3C,
1939 // connection_id 1757 // connection_id
1940 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, 1758 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
1941 // packet number 1759 // packet number
1942 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, 1760 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12,
1943 // private flags (entropy) 1761 // private flags (entropy)
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
2039 } else if (i < kMissingPacketsRange) { 1857 } else if (i < kMissingPacketsRange) {
2040 expected_error = "Unable to read missing packet number delta."; 1858 expected_error = "Unable to read missing packet number delta.";
2041 } else if (i < kRevivedPacketsLength) { 1859 } else if (i < kRevivedPacketsLength) {
2042 expected_error = "Unable to read missing packet number range."; 1860 expected_error = "Unable to read missing packet number range.";
2043 } else { 1861 } else {
2044 expected_error = "Unable to read num revived packets."; 1862 expected_error = "Unable to read num revived packets.";
2045 } 1863 }
2046 CheckProcessingFails( 1864 CheckProcessingFails(
2047 packet, 1865 packet,
2048 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1866 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2049 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 1867 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2050 NOT_IN_FEC_GROUP),
2051 expected_error, QUIC_INVALID_ACK_DATA); 1868 expected_error, QUIC_INVALID_ACK_DATA);
2052 } 1869 }
2053 } 1870 }
2054 1871
2055 TEST_P(QuicFramerTest, AckFrameOneTimestamp) { 1872 TEST_P(QuicFramerTest, AckFrameOneTimestamp) {
2056 // clang-format off 1873 // clang-format off
2057 unsigned char packet[] = { 1874 unsigned char packet[] = {
2058 // public flags (8 byte connection_id) 1875 // public flags (8 byte connection_id)
2059 0x3C, 1876 0x3C,
2060 // connection_id 1877 // connection_id
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
2146 } else if (i < kMissingPacketsRange) { 1963 } else if (i < kMissingPacketsRange) {
2147 expected_error = "Unable to read missing packet number delta."; 1964 expected_error = "Unable to read missing packet number delta.";
2148 } else if (i < kRevivedPacketsLength) { 1965 } else if (i < kRevivedPacketsLength) {
2149 expected_error = "Unable to read missing packet number range."; 1966 expected_error = "Unable to read missing packet number range.";
2150 } else { 1967 } else {
2151 expected_error = "Unable to read num revived packets."; 1968 expected_error = "Unable to read num revived packets.";
2152 } 1969 }
2153 CheckProcessingFails( 1970 CheckProcessingFails(
2154 packet, 1971 packet,
2155 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 1972 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2156 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 1973 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2157 NOT_IN_FEC_GROUP),
2158 expected_error, QUIC_INVALID_ACK_DATA); 1974 expected_error, QUIC_INVALID_ACK_DATA);
2159 } 1975 }
2160 } 1976 }
2161 1977
2162 TEST_P(QuicFramerTest, AckFrame) { 1978 TEST_P(QuicFramerTest, AckFrame) {
2163 // clang-format off 1979 // clang-format off
2164 unsigned char packet[] = { 1980 unsigned char packet[] = {
2165 // public flags (8 byte connection_id) 1981 // public flags (8 byte connection_id)
2166 0x3C, 1982 0x3C,
2167 // connection_id 1983 // connection_id
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2241 } else if (i < kMissingPacketsRange) { 2057 } else if (i < kMissingPacketsRange) {
2242 expected_error = "Unable to read missing packet number delta."; 2058 expected_error = "Unable to read missing packet number delta.";
2243 } else if (i < kRevivedPacketsLength) { 2059 } else if (i < kRevivedPacketsLength) {
2244 expected_error = "Unable to read missing packet number range."; 2060 expected_error = "Unable to read missing packet number range.";
2245 } else { 2061 } else {
2246 expected_error = "Unable to read num revived packets."; 2062 expected_error = "Unable to read num revived packets.";
2247 } 2063 }
2248 CheckProcessingFails( 2064 CheckProcessingFails(
2249 packet, 2065 packet,
2250 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2066 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2251 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 2067 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2252 NOT_IN_FEC_GROUP),
2253 expected_error, QUIC_INVALID_ACK_DATA); 2068 expected_error, QUIC_INVALID_ACK_DATA);
2254 } 2069 }
2255 } 2070 }
2256 2071
2257 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { 2072 TEST_P(QuicFramerTest, AckFrameRevivedPackets) {
2258 // clang-format off 2073 // clang-format off
2259 unsigned char packet[] = { 2074 unsigned char packet[] = {
2260 // public flags (8 byte connection_id) 2075 // public flags (8 byte connection_id)
2261 0x3C, 2076 0x3C,
2262 // connection_id 2077 // connection_id
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
2346 } else if (i < kRevivedPacketsLength) { 2161 } else if (i < kRevivedPacketsLength) {
2347 expected_error = "Unable to read missing packet number range."; 2162 expected_error = "Unable to read missing packet number range.";
2348 } else if (i < kRevivedPacketSequenceNumberLength) { 2163 } else if (i < kRevivedPacketSequenceNumberLength) {
2349 expected_error = "Unable to read num revived packets."; 2164 expected_error = "Unable to read num revived packets.";
2350 } else { 2165 } else {
2351 expected_error = "Unable to read revived packet."; 2166 expected_error = "Unable to read revived packet.";
2352 } 2167 }
2353 CheckProcessingFails( 2168 CheckProcessingFails(
2354 packet, 2169 packet,
2355 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2170 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2356 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 2171 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2357 NOT_IN_FEC_GROUP),
2358 expected_error, QUIC_INVALID_ACK_DATA); 2172 expected_error, QUIC_INVALID_ACK_DATA);
2359 } 2173 }
2360 } 2174 }
2361 2175
2362 TEST_P(QuicFramerTest, AckFrameNoNacks) { 2176 TEST_P(QuicFramerTest, AckFrameNoNacks) {
2363 // clang-format off 2177 // clang-format off
2364 unsigned char packet[] = { 2178 unsigned char packet[] = {
2365 // public flags (8 byte connection_id) 2179 // public flags (8 byte connection_id)
2366 0x3C, 2180 0x3C,
2367 // connection_id 2181 // connection_id
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
2522 for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) { 2336 for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) {
2523 string expected_error; 2337 string expected_error;
2524 if (i < kLeastUnackedOffset) { 2338 if (i < kLeastUnackedOffset) {
2525 expected_error = "Unable to read entropy hash for sent packets."; 2339 expected_error = "Unable to read entropy hash for sent packets.";
2526 } else { 2340 } else {
2527 expected_error = "Unable to read least unacked delta."; 2341 expected_error = "Unable to read least unacked delta.";
2528 } 2342 }
2529 CheckProcessingFails( 2343 CheckProcessingFails(
2530 packet, 2344 packet,
2531 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2345 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2532 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 2346 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2533 NOT_IN_FEC_GROUP),
2534 expected_error, QUIC_INVALID_STOP_WAITING_DATA); 2347 expected_error, QUIC_INVALID_STOP_WAITING_DATA);
2535 } 2348 }
2536 } 2349 }
2537 2350
2538 TEST_P(QuicFramerTest, RstStreamFrameQuic) { 2351 TEST_P(QuicFramerTest, RstStreamFrameQuic) {
2539 // clang-format off 2352 // clang-format off
2540 unsigned char packet[] = { 2353 unsigned char packet[] = {
2541 // public flags (8 byte connection_id) 2354 // public flags (8 byte connection_id)
2542 0x3C, 2355 0x3C,
2543 // connection_id 2356 // connection_id
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2583 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + 2396 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize +
2584 kQuicMaxStreamOffsetSize) { 2397 kQuicMaxStreamOffsetSize) {
2585 expected_error = "Unable to read rst stream sent byte offset."; 2398 expected_error = "Unable to read rst stream sent byte offset.";
2586 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + 2399 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize +
2587 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) { 2400 kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) {
2588 expected_error = "Unable to read rst stream error code."; 2401 expected_error = "Unable to read rst stream error code.";
2589 } 2402 }
2590 CheckProcessingFails( 2403 CheckProcessingFails(
2591 packet, 2404 packet,
2592 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2405 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2593 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 2406 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2594 NOT_IN_FEC_GROUP),
2595 expected_error, QUIC_INVALID_RST_STREAM_DATA); 2407 expected_error, QUIC_INVALID_RST_STREAM_DATA);
2596 } 2408 }
2597 } 2409 }
2598 2410
2599 TEST_P(QuicFramerTest, ConnectionCloseFrame) { 2411 TEST_P(QuicFramerTest, ConnectionCloseFrame) {
2600 // clang-format off 2412 // clang-format off
2601 unsigned char packet[] = { 2413 unsigned char packet[] = {
2602 // public flags (8 byte connection_id) 2414 // public flags (8 byte connection_id)
2603 0x3C, 2415 0x3C,
2604 // connection_id 2416 // connection_id
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2644 i < QuicFramer::GetMinConnectionCloseFrameSize(); ++i) { 2456 i < QuicFramer::GetMinConnectionCloseFrameSize(); ++i) {
2645 string expected_error; 2457 string expected_error;
2646 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { 2458 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) {
2647 expected_error = "Unable to read connection close error code."; 2459 expected_error = "Unable to read connection close error code.";
2648 } else { 2460 } else {
2649 expected_error = "Unable to read connection close error details."; 2461 expected_error = "Unable to read connection close error details.";
2650 } 2462 }
2651 CheckProcessingFails( 2463 CheckProcessingFails(
2652 packet, 2464 packet,
2653 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2465 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2654 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 2466 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2655 NOT_IN_FEC_GROUP),
2656 expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA); 2467 expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA);
2657 } 2468 }
2658 } 2469 }
2659 2470
2660 TEST_P(QuicFramerTest, GoAwayFrame) { 2471 TEST_P(QuicFramerTest, GoAwayFrame) {
2661 // clang-format off 2472 // clang-format off
2662 unsigned char packet[] = { 2473 unsigned char packet[] = {
2663 // public flags (8 byte connection_id) 2474 // public flags (8 byte connection_id)
2664 0x3C, 2475 0x3C,
2665 // connection_id 2476 // connection_id
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2707 expected_error = "Unable to read go away error code."; 2518 expected_error = "Unable to read go away error code.";
2708 } else if (i < 2519 } else if (i <
2709 kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicMaxStreamIdSize) { 2520 kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicMaxStreamIdSize) {
2710 expected_error = "Unable to read last good stream id."; 2521 expected_error = "Unable to read last good stream id.";
2711 } else { 2522 } else {
2712 expected_error = "Unable to read goaway reason."; 2523 expected_error = "Unable to read goaway reason.";
2713 } 2524 }
2714 CheckProcessingFails( 2525 CheckProcessingFails(
2715 packet, 2526 packet,
2716 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2527 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2717 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 2528 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2718 NOT_IN_FEC_GROUP),
2719 expected_error, QUIC_INVALID_GOAWAY_DATA); 2529 expected_error, QUIC_INVALID_GOAWAY_DATA);
2720 } 2530 }
2721 } 2531 }
2722 2532
2723 TEST_P(QuicFramerTest, WindowUpdateFrame) { 2533 TEST_P(QuicFramerTest, WindowUpdateFrame) {
2724 // clang-format off 2534 // clang-format off
2725 unsigned char packet[] = { 2535 unsigned char packet[] = {
2726 // public flags (8 byte connection_id) 2536 // public flags (8 byte connection_id)
2727 0x3C, 2537 0x3C,
2728 // connection_id 2538 // connection_id
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
2760 i < QuicFramer::GetWindowUpdateFrameSize(); ++i) { 2570 i < QuicFramer::GetWindowUpdateFrameSize(); ++i) {
2761 string expected_error; 2571 string expected_error;
2762 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { 2572 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) {
2763 expected_error = "Unable to read stream_id."; 2573 expected_error = "Unable to read stream_id.";
2764 } else { 2574 } else {
2765 expected_error = "Unable to read window byte_offset."; 2575 expected_error = "Unable to read window byte_offset.";
2766 } 2576 }
2767 CheckProcessingFails( 2577 CheckProcessingFails(
2768 packet, 2578 packet,
2769 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2579 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2770 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 2580 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2771 NOT_IN_FEC_GROUP),
2772 expected_error, QUIC_INVALID_WINDOW_UPDATE_DATA); 2581 expected_error, QUIC_INVALID_WINDOW_UPDATE_DATA);
2773 } 2582 }
2774 } 2583 }
2775 2584
2776 TEST_P(QuicFramerTest, BlockedFrame) { 2585 TEST_P(QuicFramerTest, BlockedFrame) {
2777 // clang-format off 2586 // clang-format off
2778 unsigned char packet[] = { 2587 unsigned char packet[] = {
2779 // public flags (8 byte connection_id) 2588 // public flags (8 byte connection_id)
2780 0x3C, 2589 0x3C,
2781 // connection_id 2590 // connection_id
(...skipping 22 matching lines...) Expand all
2804 2613
2805 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id); 2614 EXPECT_EQ(kStreamId, visitor_.blocked_frame_.stream_id);
2806 2615
2807 // Now test framing boundaries. 2616 // Now test framing boundaries.
2808 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetBlockedFrameSize(); 2617 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetBlockedFrameSize();
2809 ++i) { 2618 ++i) {
2810 string expected_error = "Unable to read stream_id."; 2619 string expected_error = "Unable to read stream_id.";
2811 CheckProcessingFails( 2620 CheckProcessingFails(
2812 packet, 2621 packet,
2813 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2622 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2814 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 2623 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2815 NOT_IN_FEC_GROUP),
2816 expected_error, QUIC_INVALID_BLOCKED_DATA); 2624 expected_error, QUIC_INVALID_BLOCKED_DATA);
2817 } 2625 }
2818 } 2626 }
2819 2627
2820 TEST_P(QuicFramerTest, PingFrame) { 2628 TEST_P(QuicFramerTest, PingFrame) {
2821 // clang-format off 2629 // clang-format off
2822 unsigned char packet[] = { 2630 unsigned char packet[] = {
2823 // public flags (8 byte connection_id) 2631 // public flags (8 byte connection_id)
2824 0x3C, 2632 0x3C,
2825 // connection_id 2633 // connection_id
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
2880 // Now test framing boundaries. 2688 // Now test framing boundaries.
2881 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetPathCloseFrameSize(); 2689 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetPathCloseFrameSize();
2882 ++i) { 2690 ++i) {
2883 string expected_error; 2691 string expected_error;
2884 if (i < kQuicFrameTypeSize + kQuicPathIdSize) { 2692 if (i < kQuicFrameTypeSize + kQuicPathIdSize) {
2885 expected_error = "Unable to read path_id."; 2693 expected_error = "Unable to read path_id.";
2886 } 2694 }
2887 CheckProcessingFails( 2695 CheckProcessingFails(
2888 packet, 2696 packet,
2889 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, 2697 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
2890 kIncludePathId, PACKET_6BYTE_PACKET_NUMBER, 2698 kIncludePathId, PACKET_6BYTE_PACKET_NUMBER),
2891 NOT_IN_FEC_GROUP),
2892 expected_error, QUIC_INVALID_PATH_CLOSE_DATA); 2699 expected_error, QUIC_INVALID_PATH_CLOSE_DATA);
2893 } 2700 }
2894 } 2701 }
2895 2702
2896 TEST_P(QuicFramerTest, PublicResetPacket) { 2703 TEST_P(QuicFramerTest, PublicResetPacket) {
2897 // clang-format off 2704 // clang-format off
2898 unsigned char packet[] = { 2705 unsigned char packet[] = {
2899 // public flags (public reset, 8 byte connection_id) 2706 // public flags (public reset, 8 byte connection_id)
2900 0x0E, 2707 0x0E,
2901 // connection_id 2708 // connection_id
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
3095 } else if (i < kVersionOffset) { 2902 } else if (i < kVersionOffset) {
3096 expected_error = "Unable to read ConnectionId."; 2903 expected_error = "Unable to read ConnectionId.";
3097 } else { 2904 } else {
3098 expected_error = "Unable to read supported version in negotiation."; 2905 expected_error = "Unable to read supported version in negotiation.";
3099 error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET; 2906 error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET;
3100 } 2907 }
3101 CheckProcessingFails(packet, i, expected_error, error_code); 2908 CheckProcessingFails(packet, i, expected_error, error_code);
3102 } 2909 }
3103 } 2910 }
3104 2911
3105 TEST_P(QuicFramerTest, FecPacket) { 2912 TEST_P(QuicFramerTest, DropFecPacket) {
3106 // clang-format off 2913 // clang-format off
3107 unsigned char packet[] = { 2914 unsigned char packet[] = {
3108 // public flags (8 byte connection_id) 2915 // public flags (8 byte connection_id)
3109 0x3C, 2916 0x3C,
3110 // connection_id 2917 // connection_id
3111 0x10, 0x32, 0x54, 0x76, 2918 0x10, 0x32, 0x54, 0x76,
3112 0x98, 0xBA, 0xDC, 0xFE, 2919 0x98, 0xBA, 0xDC, 0xFE,
3113 // packet number 2920 // packet number
3114 0xBC, 0x9A, 0x78, 0x56, 2921 0xBC, 0x9A, 0x78, 0x56,
3115 0x34, 0x12, 2922 0x34, 0x12,
3116 // private flags (fec group & FEC) 2923 // private flags (fec group & FEC)
3117 0x06, 2924 0x06,
3118 // first fec protected packet offset 2925 // first fec protected packet offset
3119 0x01, 2926 0x01,
3120 2927
3121 // redundancy 2928 // redundancy
3122 'a', 'b', 'c', 'd', 2929 'a', 'b', 'c', 'd',
3123 'e', 'f', 'g', 'h', 2930 'e', 'f', 'g', 'h',
3124 'i', 'j', 'k', 'l', 2931 'i', 'j', 'k', 'l',
3125 'm', 'n', 'o', 'p', 2932 'm', 'n', 'o', 'p',
3126 }; 2933 };
3127 // clang-format on 2934 // clang-format on
3128 2935
3129 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 2936 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
3130 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 2937 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
3131 2938
3132 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 2939 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
3133 ASSERT_TRUE(visitor_.header_.get()); 2940 EXPECT_FALSE(visitor_.header_.get());
3134 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId));
3135
3136 EXPECT_EQ(0u, visitor_.stream_frames_.size());
3137 EXPECT_EQ(0u, visitor_.ack_frames_.size());
3138 ASSERT_EQ(1, visitor_.fec_count_);
3139 EXPECT_EQ("abcdefghijklmnop", visitor_.fec_data_redundancy_[0]);
3140 } 2941 }
3141 2942
3142 TEST_P(QuicFramerTest, BuildPaddingFramePacket) { 2943 TEST_P(QuicFramerTest, BuildPaddingFramePacket) {
3143 QuicPacketHeader header; 2944 QuicPacketHeader header;
3144 header.public_header.connection_id = kConnectionId; 2945 header.public_header.connection_id = kConnectionId;
3145 header.public_header.reset_flag = false; 2946 header.public_header.reset_flag = false;
3146 header.public_header.version_flag = false; 2947 header.public_header.version_flag = false;
3147 header.fec_flag = false; 2948 header.fec_flag = false;
3148 header.entropy_flag = false; 2949 header.entropy_flag = false;
3149 header.packet_number = kPacketNumber; 2950 header.packet_number = kPacketNumber;
(...skipping 16 matching lines...) Expand all
3166 0x34, 0x12, 2967 0x34, 0x12,
3167 // private flags 2968 // private flags
3168 0x00, 2969 0x00,
3169 2970
3170 // frame type (padding frame) 2971 // frame type (padding frame)
3171 0x00, 2972 0x00,
3172 0x00, 0x00, 0x00, 0x00 2973 0x00, 0x00, 0x00, 0x00
3173 }; 2974 };
3174 // clang-format on 2975 // clang-format on
3175 2976
3176 uint64_t header_size = GetPacketHeaderSize( 2977 uint64_t header_size =
3177 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId, 2978 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
3178 PACKET_6BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); 2979 !kIncludePathId, PACKET_6BYTE_PACKET_NUMBER);
3179 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 2980 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
3180 2981
3181 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); 2982 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames));
3182 ASSERT_TRUE(data != nullptr); 2983 ASSERT_TRUE(data != nullptr);
3183 2984
3184 test::CompareCharArraysWithHexError("constructed packet", data->data(), 2985 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3185 data->length(), AsChars(packet), 2986 data->length(), AsChars(packet),
3186 arraysize(packet)); 2987 arraysize(packet));
3187 } 2988 }
3188 2989
(...skipping 24 matching lines...) Expand all
3213 0xBC, 0x9A, 0x78, 0x56, 3014 0xBC, 0x9A, 0x78, 0x56,
3214 // private flags 3015 // private flags
3215 0x00, 3016 0x00,
3216 3017
3217 // frame type (padding frame) 3018 // frame type (padding frame)
3218 0x00, 3019 0x00,
3219 0x00, 0x00, 0x00, 0x00 3020 0x00, 0x00, 0x00, 0x00
3220 }; 3021 };
3221 // clang-format on 3022 // clang-format on
3222 3023
3223 uint64_t header_size = GetPacketHeaderSize( 3024 uint64_t header_size =
3224 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId, 3025 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
3225 PACKET_4BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); 3026 !kIncludePathId, PACKET_4BYTE_PACKET_NUMBER);
3226 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 3027 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
3227 3028
3228 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); 3029 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames));
3229 ASSERT_TRUE(data != nullptr); 3030 ASSERT_TRUE(data != nullptr);
3230 3031
3231 test::CompareCharArraysWithHexError("constructed packet", data->data(), 3032 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3232 data->length(), AsChars(packet), 3033 data->length(), AsChars(packet),
3233 arraysize(packet)); 3034 arraysize(packet));
3234 } 3035 }
3235 3036
(...skipping 24 matching lines...) Expand all
3260 0xBC, 0x9A, 3061 0xBC, 0x9A,
3261 // private flags 3062 // private flags
3262 0x00, 3063 0x00,
3263 3064
3264 // frame type (padding frame) 3065 // frame type (padding frame)
3265 0x00, 3066 0x00,
3266 0x00, 0x00, 0x00, 0x00 3067 0x00, 0x00, 0x00, 0x00
3267 }; 3068 };
3268 // clang-format on 3069 // clang-format on
3269 3070
3270 uint64_t header_size = GetPacketHeaderSize( 3071 uint64_t header_size =
3271 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId, 3072 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
3272 PACKET_2BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); 3073 !kIncludePathId, PACKET_2BYTE_PACKET_NUMBER);
3273 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 3074 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
3274 3075
3275 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); 3076 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames));
3276 ASSERT_TRUE(data != nullptr); 3077 ASSERT_TRUE(data != nullptr);
3277 3078
3278 test::CompareCharArraysWithHexError("constructed packet", data->data(), 3079 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3279 data->length(), AsChars(packet), 3080 data->length(), AsChars(packet),
3280 arraysize(packet)); 3081 arraysize(packet));
3281 } 3082 }
3282 3083
(...skipping 24 matching lines...) Expand all
3307 0xBC, 3108 0xBC,
3308 // private flags 3109 // private flags
3309 0x00, 3110 0x00,
3310 3111
3311 // frame type (padding frame) 3112 // frame type (padding frame)
3312 0x00, 3113 0x00,
3313 0x00, 0x00, 0x00, 0x00 3114 0x00, 0x00, 0x00, 0x00
3314 }; 3115 };
3315 // clang-format on 3116 // clang-format on
3316 3117
3317 uint64_t header_size = GetPacketHeaderSize( 3118 uint64_t header_size =
3318 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, !kIncludePathId, 3119 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
3319 PACKET_1BYTE_PACKET_NUMBER, NOT_IN_FEC_GROUP); 3120 !kIncludePathId, PACKET_1BYTE_PACKET_NUMBER);
3320 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); 3121 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
3321 3122
3322 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); 3123 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames));
3323 ASSERT_TRUE(data != nullptr); 3124 ASSERT_TRUE(data != nullptr);
3324 3125
3325 test::CompareCharArraysWithHexError("constructed packet", data->data(), 3126 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3326 data->length(), AsChars(packet), 3127 data->length(), AsChars(packet),
3327 arraysize(packet)); 3128 arraysize(packet));
3328 } 3129 }
3329 3130
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3371 // clang-format on 3172 // clang-format on
3372 3173
3373 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); 3174 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames));
3374 ASSERT_TRUE(data != nullptr); 3175 ASSERT_TRUE(data != nullptr);
3375 3176
3376 test::CompareCharArraysWithHexError("constructed packet", data->data(), 3177 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3377 data->length(), AsChars(packet), 3178 data->length(), AsChars(packet),
3378 arraysize(packet)); 3179 arraysize(packet));
3379 } 3180 }
3380 3181
3381 TEST_P(QuicFramerTest, BuildStreamFramePacketInFecGroup) {
3382 QuicPacketHeader header;
3383 header.public_header.connection_id = kConnectionId;
3384 header.public_header.reset_flag = false;
3385 header.public_header.version_flag = false;
3386 header.fec_flag = false;
3387 header.entropy_flag = true;
3388 header.packet_number = kPacketNumber;
3389 header.is_in_fec_group = IN_FEC_GROUP;
3390 header.fec_group = kPacketNumber;
3391
3392 QuicStreamFrame stream_frame(kStreamId, true, kStreamOffset,
3393 StringPiece("hello world!"));
3394
3395 QuicFrames frames;
3396 frames.push_back(QuicFrame(&stream_frame));
3397 // clang-format off
3398 unsigned char packet[] = {
3399 // public flags (8 byte connection_id)
3400 0x3C,
3401 // connection_id
3402 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
3403 // packet number
3404 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
3405 // private flags (entropy, is_in_fec_group)
3406 0x03,
3407 // FEC group
3408 0x00,
3409 // frame type (stream frame with fin and data length field)
3410 0xFF,
3411 // stream id
3412 0x04, 0x03, 0x02, 0x01,
3413 // offset
3414 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA,
3415 // data length (since packet is in an FEC group)
3416 0x0C, 0x00,
3417 // data
3418 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
3419 };
3420 // clang-format on
3421
3422 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames));
3423 ASSERT_TRUE(data != nullptr);
3424
3425 test::CompareCharArraysWithHexError("constructed packet", data->data(),
3426 data->length(), AsChars(packet),
3427 arraysize(packet));
3428 }
3429
3430 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) { 3182 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
3431 QuicPacketHeader header; 3183 QuicPacketHeader header;
3432 header.public_header.connection_id = kConnectionId; 3184 header.public_header.connection_id = kConnectionId;
3433 header.public_header.reset_flag = false; 3185 header.public_header.reset_flag = false;
3434 header.public_header.version_flag = true; 3186 header.public_header.version_flag = true;
3435 header.fec_flag = false; 3187 header.fec_flag = false;
3436 header.entropy_flag = true; 3188 header.entropy_flag = true;
3437 header.packet_number = kPacketNumber; 3189 header.packet_number = kPacketNumber;
3438 header.fec_group = 0; 3190 header.fec_group = 0;
3439 3191
(...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after
4365 4117
4366 scoped_ptr<QuicEncryptedPacket> data( 4118 scoped_ptr<QuicEncryptedPacket> data(
4367 framer_.BuildPublicResetPacket(reset_packet)); 4119 framer_.BuildPublicResetPacket(reset_packet));
4368 ASSERT_TRUE(data != nullptr); 4120 ASSERT_TRUE(data != nullptr);
4369 4121
4370 test::CompareCharArraysWithHexError("constructed packet", data->data(), 4122 test::CompareCharArraysWithHexError("constructed packet", data->data(),
4371 data->length(), AsChars(packet), 4123 data->length(), AsChars(packet),
4372 arraysize(packet)); 4124 arraysize(packet));
4373 } 4125 }
4374 4126
4375 TEST_P(QuicFramerTest, BuildFecPacket) {
4376 QuicPacketHeader header;
4377 header.public_header.connection_id = kConnectionId;
4378 header.public_header.reset_flag = false;
4379 header.public_header.version_flag = false;
4380 header.fec_flag = true;
4381 header.entropy_flag = true;
4382 header.packet_number = kPacketNumber;
4383 header.is_in_fec_group = IN_FEC_GROUP;
4384 header.fec_group = kPacketNumber - 1;
4385
4386 string redundancy = "abcdefghijklmnop";
4387
4388 // clang-format off
4389 unsigned char packet[] = {
4390 // public flags (8 byte connection_id)
4391 0x3C,
4392 // connection_id
4393 0x10, 0x32, 0x54, 0x76,
4394 0x98, 0xBA, 0xDC, 0xFE,
4395 // packet number
4396 0xBC, 0x9A, 0x78, 0x56,
4397 0x34, 0x12,
4398 // private flags (entropy & fec group & fec packet)
4399 0x07,
4400 // first fec protected packet offset
4401 0x01,
4402
4403 // redundancy
4404 'a', 'b', 'c', 'd',
4405 'e', 'f', 'g', 'h',
4406 'i', 'j', 'k', 'l',
4407 'm', 'n', 'o', 'p',
4408 };
4409 // clang-format on
4410
4411 scoped_ptr<QuicPacket> data(framer_.BuildFecPacket(header, redundancy));
4412 ASSERT_TRUE(data != nullptr);
4413
4414 test::CompareCharArraysWithHexError("constructed packet", data->data(),
4415 data->length(), AsChars(packet),
4416 arraysize(packet));
4417 }
4418
4419 TEST_P(QuicFramerTest, EncryptPacket) { 4127 TEST_P(QuicFramerTest, EncryptPacket) {
4420 QuicPacketNumber packet_number = kPacketNumber; 4128 QuicPacketNumber packet_number = kPacketNumber;
4421 // clang-format off 4129 // clang-format off
4422 unsigned char packet[] = { 4130 unsigned char packet[] = {
4423 // public flags (8 byte connection_id) 4131 // public flags (8 byte connection_id)
4424 0x3C, 4132 0x3C,
4425 // connection_id 4133 // connection_id
4426 0x10, 0x32, 0x54, 0x76, 4134 0x10, 0x32, 0x54, 0x76,
4427 0x98, 0xBA, 0xDC, 0xFE, 4135 0x98, 0xBA, 0xDC, 0xFE,
4428 // packet number 4136 // packet number
4429 0xBC, 0x9A, 0x78, 0x56, 4137 0xBC, 0x9A, 0x78, 0x56,
4430 0x34, 0x12, 4138 0x34, 0x12,
4431 // private flags (fec group & fec packet) 4139 // private flags
4432 0x06, 4140 0x00,
4433 // first fec protected packet offset
4434 0x01,
4435 4141
4436 // redundancy 4142 // redundancy
4437 'a', 'b', 'c', 'd', 4143 'a', 'b', 'c', 'd',
4438 'e', 'f', 'g', 'h', 4144 'e', 'f', 'g', 'h',
4439 'i', 'j', 'k', 'l', 4145 'i', 'j', 'k', 'l',
4440 'm', 'n', 'o', 'p', 4146 'm', 'n', 'o', 'p',
4441 }; 4147 };
4442 // clang-format on 4148 // clang-format on
4443 4149
4444 scoped_ptr<QuicPacket> raw(new QuicPacket( 4150 scoped_ptr<QuicPacket> raw(new QuicPacket(
(...skipping 15 matching lines...) Expand all
4460 // public flags (version, 8 byte connection_id) 4166 // public flags (version, 8 byte connection_id)
4461 0x3D, 4167 0x3D,
4462 // connection_id 4168 // connection_id
4463 0x10, 0x32, 0x54, 0x76, 4169 0x10, 0x32, 0x54, 0x76,
4464 0x98, 0xBA, 0xDC, 0xFE, 4170 0x98, 0xBA, 0xDC, 0xFE,
4465 // version tag 4171 // version tag
4466 'Q', '.', '1', '0', 4172 'Q', '.', '1', '0',
4467 // packet number 4173 // packet number
4468 0xBC, 0x9A, 0x78, 0x56, 4174 0xBC, 0x9A, 0x78, 0x56,
4469 0x34, 0x12, 4175 0x34, 0x12,
4470 // private flags (fec group & fec flags) 4176 // private flags
4471 0x06, 4177 0x00,
4472 // first fec protected packet offset
4473 0x01,
4474 4178
4475 // redundancy 4179 // redundancy
4476 'a', 'b', 'c', 'd', 4180 'a', 'b', 'c', 'd',
4477 'e', 'f', 'g', 'h', 4181 'e', 'f', 'g', 'h',
4478 'i', 'j', 'k', 'l', 4182 'i', 'j', 'k', 'l',
4479 'm', 'n', 'o', 'p', 4183 'm', 'n', 'o', 'p',
4480 }; 4184 };
4481 // clang-format on 4185 // clang-format on
4482 4186
4483 scoped_ptr<QuicPacket> raw(new QuicPacket( 4187 scoped_ptr<QuicPacket> raw(new QuicPacket(
(...skipping 15 matching lines...) Expand all
4499 // public flags (version, 8 byte connection_id) 4203 // public flags (version, 8 byte connection_id)
4500 0x7C, 4204 0x7C,
4501 // connection_id 4205 // connection_id
4502 0x10, 0x32, 0x54, 0x76, 4206 0x10, 0x32, 0x54, 0x76,
4503 0x98, 0xBA, 0xDC, 0xFE, 4207 0x98, 0xBA, 0xDC, 0xFE,
4504 // path_id 4208 // path_id
4505 0x42, 4209 0x42,
4506 // packet number 4210 // packet number
4507 0xBC, 0x9A, 0x78, 0x56, 4211 0xBC, 0x9A, 0x78, 0x56,
4508 0x34, 0x12, 4212 0x34, 0x12,
4509 // private flags (fec group & fec flags) 4213 // private flags
4510 0x06, 4214 0x00,
4511 // first fec protected packet offset
4512 0x01,
4513 4215
4514 // redundancy 4216 // redundancy
4515 'a', 'b', 'c', 'd', 4217 'a', 'b', 'c', 'd',
4516 'e', 'f', 'g', 'h', 4218 'e', 'f', 'g', 'h',
4517 'i', 'j', 'k', 'l', 4219 'i', 'j', 'k', 'l',
4518 'm', 'n', 'o', 'p', 4220 'm', 'n', 'o', 'p',
4519 }; 4221 };
4520 // clang-format on 4222 // clang-format on
4521 4223
4522 scoped_ptr<QuicPacket> raw(new QuicPacket( 4224 scoped_ptr<QuicPacket> raw(new QuicPacket(
(...skipping 16 matching lines...) Expand all
4539 // connection_id 4241 // connection_id
4540 0x10, 0x32, 0x54, 0x76, 4242 0x10, 0x32, 0x54, 0x76,
4541 0x98, 0xBA, 0xDC, 0xFE, 4243 0x98, 0xBA, 0xDC, 0xFE,
4542 // version tag 4244 // version tag
4543 'Q', '.', '1', '0', 4245 'Q', '.', '1', '0',
4544 // path_id 4246 // path_id
4545 0x42, 4247 0x42,
4546 // packet number 4248 // packet number
4547 0xBC, 0x9A, 0x78, 0x56, 4249 0xBC, 0x9A, 0x78, 0x56,
4548 0x34, 0x12, 4250 0x34, 0x12,
4549 // private flags (fec group & fec flags) 4251 // private flags
4550 0x06, 4252 0x00,
4551 // first fec protected packet offset
4552 0x01,
4553 4253
4554 // redundancy 4254 // redundancy
4555 'a', 'b', 'c', 'd', 4255 'a', 'b', 'c', 'd',
4556 'e', 'f', 'g', 'h', 4256 'e', 'f', 'g', 'h',
4557 'i', 'j', 'k', 'l', 4257 'i', 'j', 'k', 'l',
4558 'm', 'n', 'o', 'p', 4258 'm', 'n', 'o', 'p',
4559 }; 4259 };
4560 // clang-format on 4260 // clang-format on
4561 4261
4562 scoped_ptr<QuicPacket> raw(new QuicPacket( 4262 scoped_ptr<QuicPacket> raw(new QuicPacket(
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
4724 4424
4725 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); 4425 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
4726 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); 4426 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4727 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); 4427 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4728 ASSERT_TRUE(visitor_.header_.get()); 4428 ASSERT_TRUE(visitor_.header_.get());
4729 EXPECT_TRUE(visitor_.header_->entropy_flag); 4429 EXPECT_TRUE(visitor_.header_->entropy_flag);
4730 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); 4430 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash);
4731 EXPECT_FALSE(visitor_.header_->fec_flag); 4431 EXPECT_FALSE(visitor_.header_->fec_flag);
4732 }; 4432 };
4733 4433
4734 TEST_P(QuicFramerTest, FecEntropyTest) {
4735 // clang-format off
4736 unsigned char packet[] = {
4737 // public flags (8 byte connection_id)
4738 0x3C,
4739 // connection_id
4740 0x10, 0x32, 0x54, 0x76,
4741 0x98, 0xBA, 0xDC, 0xFE,
4742 // packet number
4743 0xBC, 0x9A, 0x78, 0x56,
4744 0x34, 0x12,
4745 // private flags (Entropy & fec group & FEC)
4746 0x07,
4747 // first fec protected packet offset
4748 0xFF,
4749
4750 // frame type (stream frame with fin and no length)
4751 0xDF,
4752 // stream id
4753 0x04, 0x03, 0x02, 0x01,
4754 // offset
4755 0x54, 0x76, 0x10, 0x32,
4756 0xDC, 0xFE, 0x98, 0xBA,
4757 // data
4758 'h', 'e', 'l', 'l',
4759 'o', ' ', 'w', 'o',
4760 'r', 'l', 'd', '!',
4761 };
4762 // clang-format on
4763
4764 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
4765 EXPECT_TRUE(framer_.ProcessPacket(encrypted));
4766 EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
4767 ASSERT_TRUE(visitor_.header_.get());
4768 EXPECT_TRUE(visitor_.header_->fec_flag);
4769 EXPECT_TRUE(visitor_.header_->entropy_flag);
4770 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash);
4771 };
4772
4773 TEST_P(QuicFramerTest, StopPacketProcessing) { 4434 TEST_P(QuicFramerTest, StopPacketProcessing) {
4774 // clang-format off 4435 // clang-format off
4775 unsigned char packet[] = { 4436 unsigned char packet[] = {
4776 // public flags (8 byte connection_id) 4437 // public flags (8 byte connection_id)
4777 0x3C, 4438 0x3C,
4778 // connection_id 4439 // connection_id
4779 0x10, 0x32, 0x54, 0x76, 4440 0x10, 0x32, 0x54, 0x76,
4780 0x98, 0xBA, 0xDC, 0xFE, 4441 0x98, 0xBA, 0xDC, 0xFE,
4781 // packet number 4442 // packet number
4782 0xBC, 0x9A, 0x78, 0x56, 4443 0xBC, 0x9A, 0x78, 0x56,
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
4965 'o', ' ', 'w', 'o', 4626 'o', ' ', 'w', 'o',
4966 'r', 'l', 'd', '!', 4627 'r', 'l', 'd', '!',
4967 }; 4628 };
4968 // clang-format on 4629 // clang-format on
4969 4630
4970 QuicFramerFuzzFunc(packet, arraysize(packet)); 4631 QuicFramerFuzzFunc(packet, arraysize(packet));
4971 } 4632 }
4972 4633
4973 } // namespace test 4634 } // namespace test
4974 } // namespace net 4635 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.cc ('k') | net/quic/quic_multipath_received_packet_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698