| OLD | NEW |
| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <map> | 8 #include <map> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 ~TestEncrypter() override {} | 106 ~TestEncrypter() override {} |
| 107 bool SetKey(StringPiece key) override { return true; } | 107 bool SetKey(StringPiece key) override { return true; } |
| 108 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } | 108 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } |
| 109 bool Encrypt(StringPiece nonce, | 109 bool Encrypt(StringPiece nonce, |
| 110 StringPiece associated_data, | 110 StringPiece associated_data, |
| 111 StringPiece plaintext, | 111 StringPiece plaintext, |
| 112 unsigned char* output) override { | 112 unsigned char* output) override { |
| 113 CHECK(false) << "Not implemented"; | 113 CHECK(false) << "Not implemented"; |
| 114 return false; | 114 return false; |
| 115 } | 115 } |
| 116 QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number, | 116 bool EncryptPacket(QuicPacketSequenceNumber sequence_number, |
| 117 StringPiece associated_data, | 117 StringPiece associated_data, |
| 118 StringPiece plaintext) override { | 118 StringPiece plaintext, |
| 119 char* output, |
| 120 size_t* output_length, |
| 121 size_t max_output_length) override { |
| 119 sequence_number_ = sequence_number; | 122 sequence_number_ = sequence_number; |
| 120 associated_data_ = associated_data.as_string(); | 123 associated_data_ = associated_data.as_string(); |
| 121 plaintext_ = plaintext.as_string(); | 124 plaintext_ = plaintext.as_string(); |
| 122 return new QuicData(plaintext.data(), plaintext.length()); | 125 memcpy(output, plaintext.data(), plaintext.length()); |
| 126 *output_length = plaintext.length(); |
| 127 return true; |
| 123 } | 128 } |
| 124 size_t GetKeySize() const override { return 0; } | 129 size_t GetKeySize() const override { return 0; } |
| 125 size_t GetNoncePrefixSize() const override { return 0; } | 130 size_t GetNoncePrefixSize() const override { return 0; } |
| 126 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override { | 131 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override { |
| 127 return ciphertext_size; | 132 return ciphertext_size; |
| 128 } | 133 } |
| 129 size_t GetCiphertextSize(size_t plaintext_size) const override { | 134 size_t GetCiphertextSize(size_t plaintext_size) const override { |
| 130 return plaintext_size; | 135 return plaintext_size; |
| 131 } | 136 } |
| 132 StringPiece GetKey() const override { return StringPiece(); } | 137 StringPiece GetKey() const override { return StringPiece(); } |
| 133 StringPiece GetNoncePrefix() const override { return StringPiece(); } | 138 StringPiece GetNoncePrefix() const override { return StringPiece(); } |
| 134 QuicPacketSequenceNumber sequence_number_; | 139 QuicPacketSequenceNumber sequence_number_; |
| 135 string associated_data_; | 140 string associated_data_; |
| 136 string plaintext_; | 141 string plaintext_; |
| 137 }; | 142 }; |
| 138 | 143 |
| 139 class TestDecrypter : public QuicDecrypter { | 144 class TestDecrypter : public QuicDecrypter { |
| 140 public: | 145 public: |
| 141 ~TestDecrypter() override {} | 146 ~TestDecrypter() override {} |
| 142 bool SetKey(StringPiece key) override { return true; } | 147 bool SetKey(StringPiece key) override { return true; } |
| 143 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } | 148 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } |
| 144 QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number, | 149 bool DecryptPacket(QuicPacketSequenceNumber sequence_number, |
| 145 StringPiece associated_data, | 150 const StringPiece& associated_data, |
| 146 StringPiece ciphertext) override { | 151 const StringPiece& ciphertext, |
| 152 char* output, |
| 153 size_t* output_length, |
| 154 size_t max_output_length) override { |
| 147 sequence_number_ = sequence_number; | 155 sequence_number_ = sequence_number; |
| 148 associated_data_ = associated_data.as_string(); | 156 associated_data_ = associated_data.as_string(); |
| 149 ciphertext_ = ciphertext.as_string(); | 157 ciphertext_ = ciphertext.as_string(); |
| 150 return new QuicData(ciphertext.data(), ciphertext.length()); | 158 memcpy(output, ciphertext.data(), ciphertext.length()); |
| 159 *output_length = ciphertext.length(); |
| 160 return true; |
| 151 } | 161 } |
| 152 StringPiece GetKey() const override { return StringPiece(); } | 162 StringPiece GetKey() const override { return StringPiece(); } |
| 153 StringPiece GetNoncePrefix() const override { return StringPiece(); } | 163 StringPiece GetNoncePrefix() const override { return StringPiece(); } |
| 154 QuicPacketSequenceNumber sequence_number_; | 164 QuicPacketSequenceNumber sequence_number_; |
| 155 string associated_data_; | 165 string associated_data_; |
| 156 string ciphertext_; | 166 string ciphertext_; |
| 157 }; | 167 }; |
| 158 | 168 |
| 159 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { | 169 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { |
| 160 public: | 170 public: |
| 161 TestQuicVisitor() | 171 TestQuicVisitor() |
| 162 : error_count_(0), | 172 : error_count_(0), |
| 163 version_mismatch_(0), | 173 version_mismatch_(0), |
| 164 packet_count_(0), | 174 packet_count_(0), |
| 165 frame_count_(0), | 175 frame_count_(0), |
| 166 fec_count_(0), | 176 fec_count_(0), |
| 167 complete_packets_(0), | 177 complete_packets_(0), |
| 168 revived_packets_(0), | 178 revived_packets_(0), |
| 169 accept_packet_(true), | 179 accept_packet_(true), |
| 170 accept_public_header_(true) { | 180 accept_public_header_(true) { |
| 171 } | 181 } |
| 172 | 182 |
| 173 ~TestQuicVisitor() override { | 183 ~TestQuicVisitor() override { |
| 174 STLDeleteElements(&stream_frames_); | 184 STLDeleteElements(&stream_frames_); |
| 175 STLDeleteElements(&ack_frames_); | 185 STLDeleteElements(&ack_frames_); |
| 176 STLDeleteElements(&stop_waiting_frames_); | 186 STLDeleteElements(&stop_waiting_frames_); |
| 177 STLDeleteElements(&ping_frames_); | 187 STLDeleteElements(&ping_frames_); |
| 178 STLDeleteElements(&fec_data_); | 188 STLDeleteElements(&fec_data_); |
| 189 STLDeleteElements(&stream_data_); |
| 190 STLDeleteElements(&fec_data_redundancy_); |
| 179 } | 191 } |
| 180 | 192 |
| 181 void OnError(QuicFramer* f) override { | 193 void OnError(QuicFramer* f) override { |
| 182 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) | 194 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) |
| 183 << " (" << f->error() << ")"; | 195 << " (" << f->error() << ")"; |
| 184 ++error_count_; | 196 ++error_count_; |
| 185 } | 197 } |
| 186 | 198 |
| 187 void OnPacket() override {} | 199 void OnPacket() override {} |
| 188 | 200 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 216 void OnDecryptedPacket(EncryptionLevel level) override {} | 228 void OnDecryptedPacket(EncryptionLevel level) override {} |
| 217 | 229 |
| 218 bool OnPacketHeader(const QuicPacketHeader& header) override { | 230 bool OnPacketHeader(const QuicPacketHeader& header) override { |
| 219 ++packet_count_; | 231 ++packet_count_; |
| 220 header_.reset(new QuicPacketHeader(header)); | 232 header_.reset(new QuicPacketHeader(header)); |
| 221 return accept_packet_; | 233 return accept_packet_; |
| 222 } | 234 } |
| 223 | 235 |
| 224 bool OnStreamFrame(const QuicStreamFrame& frame) override { | 236 bool OnStreamFrame(const QuicStreamFrame& frame) override { |
| 225 ++frame_count_; | 237 ++frame_count_; |
| 226 stream_frames_.push_back(new QuicStreamFrame(frame)); | 238 // Save a copy of the data so it is valid after the packet is processed. |
| 239 stream_data_.push_back(frame.GetDataAsString()); |
| 240 QuicStreamFrame* stream_frame = new QuicStreamFrame(frame); |
| 241 // Make sure that the stream frame points to this data. |
| 242 stream_frame->data.Clear(); |
| 243 stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()), |
| 244 stream_data_.back()->size()); |
| 245 stream_frames_.push_back(stream_frame); |
| 227 return true; | 246 return true; |
| 228 } | 247 } |
| 229 | 248 |
| 230 void OnFecProtectedPayload(StringPiece payload) override { | 249 void OnFecProtectedPayload(StringPiece payload) override { |
| 231 fec_protected_payload_ = payload.as_string(); | 250 fec_protected_payload_ = payload.as_string(); |
| 232 } | 251 } |
| 233 | 252 |
| 234 bool OnAckFrame(const QuicAckFrame& frame) override { | 253 bool OnAckFrame(const QuicAckFrame& frame) override { |
| 235 ++frame_count_; | 254 ++frame_count_; |
| 236 ack_frames_.push_back(new QuicAckFrame(frame)); | 255 ack_frames_.push_back(new QuicAckFrame(frame)); |
| 237 return true; | 256 return true; |
| 238 } | 257 } |
| 239 | 258 |
| 240 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override { | 259 bool OnStopWaitingFrame(const QuicStopWaitingFrame& frame) override { |
| 241 ++frame_count_; | 260 ++frame_count_; |
| 242 stop_waiting_frames_.push_back(new QuicStopWaitingFrame(frame)); | 261 stop_waiting_frames_.push_back(new QuicStopWaitingFrame(frame)); |
| 243 return true; | 262 return true; |
| 244 } | 263 } |
| 245 | 264 |
| 246 bool OnPingFrame(const QuicPingFrame& frame) override { | 265 bool OnPingFrame(const QuicPingFrame& frame) override { |
| 247 ++frame_count_; | 266 ++frame_count_; |
| 248 ping_frames_.push_back(new QuicPingFrame(frame)); | 267 ping_frames_.push_back(new QuicPingFrame(frame)); |
| 249 return true; | 268 return true; |
| 250 } | 269 } |
| 251 | 270 |
| 252 void OnFecData(const QuicFecData& fec) override { | 271 void OnFecData(const QuicFecData& fec) override { |
| 253 ++fec_count_; | 272 ++fec_count_; |
| 254 fec_data_.push_back(new QuicFecData(fec)); | 273 QuicFecData* fec_data = new QuicFecData(); |
| 274 fec_data->fec_group = fec.fec_group; |
| 275 // Save a copy of the data so it is valid after the packet is processed. |
| 276 string* redundancy = new string(fec.redundancy.as_string()); |
| 277 fec_data_redundancy_.push_back(redundancy); |
| 278 fec_data->redundancy = StringPiece(*redundancy); |
| 279 fec_data_.push_back(fec_data); |
| 255 } | 280 } |
| 256 | 281 |
| 257 void OnPacketComplete() override { ++complete_packets_; } | 282 void OnPacketComplete() override { ++complete_packets_; } |
| 258 | 283 |
| 259 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override { | 284 bool OnRstStreamFrame(const QuicRstStreamFrame& frame) override { |
| 260 rst_stream_frame_ = frame; | 285 rst_stream_frame_ = frame; |
| 261 return true; | 286 return true; |
| 262 } | 287 } |
| 263 | 288 |
| 264 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override { | 289 bool OnConnectionCloseFrame(const QuicConnectionCloseFrame& frame) override { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 vector<QuicAckFrame*> ack_frames_; | 325 vector<QuicAckFrame*> ack_frames_; |
| 301 vector<QuicStopWaitingFrame*> stop_waiting_frames_; | 326 vector<QuicStopWaitingFrame*> stop_waiting_frames_; |
| 302 vector<QuicPingFrame*> ping_frames_; | 327 vector<QuicPingFrame*> ping_frames_; |
| 303 vector<QuicFecData*> fec_data_; | 328 vector<QuicFecData*> fec_data_; |
| 304 string fec_protected_payload_; | 329 string fec_protected_payload_; |
| 305 QuicRstStreamFrame rst_stream_frame_; | 330 QuicRstStreamFrame rst_stream_frame_; |
| 306 QuicConnectionCloseFrame connection_close_frame_; | 331 QuicConnectionCloseFrame connection_close_frame_; |
| 307 QuicGoAwayFrame goaway_frame_; | 332 QuicGoAwayFrame goaway_frame_; |
| 308 QuicWindowUpdateFrame window_update_frame_; | 333 QuicWindowUpdateFrame window_update_frame_; |
| 309 QuicBlockedFrame blocked_frame_; | 334 QuicBlockedFrame blocked_frame_; |
| 335 vector<string*> stream_data_; |
| 336 vector<string*> fec_data_redundancy_; |
| 310 }; | 337 }; |
| 311 | 338 |
| 312 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> { | 339 class QuicFramerTest : public ::testing::TestWithParam<QuicVersion> { |
| 313 public: | 340 public: |
| 314 QuicFramerTest() | 341 QuicFramerTest() |
| 315 : encrypter_(new test::TestEncrypter()), | 342 : encrypter_(new test::TestEncrypter()), |
| 316 decrypter_(new test::TestDecrypter()), | 343 decrypter_(new test::TestDecrypter()), |
| 317 start_(QuicTime::Zero().Add(QuicTime::Delta::FromMicroseconds(0x10))), | 344 start_(QuicTime::Zero().Add(QuicTime::Delta::FromMicroseconds(0x10))), |
| 318 framer_(QuicSupportedVersions(), start_, true) { | 345 framer_(QuicSupportedVersions(), start_, true) { |
| 319 version_ = GetParam(); | 346 version_ = GetParam(); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 442 QuicFramerPeer::SetLastSequenceNumber(&framer_, last_sequence_number); | 469 QuicFramerPeer::SetLastSequenceNumber(&framer_, last_sequence_number); |
| 443 EXPECT_EQ(expected_sequence_number, | 470 EXPECT_EQ(expected_sequence_number, |
| 444 QuicFramerPeer::CalculatePacketSequenceNumberFromWire( | 471 QuicFramerPeer::CalculatePacketSequenceNumberFromWire( |
| 445 &framer_, PACKET_6BYTE_SEQUENCE_NUMBER, wire_sequence_number)) | 472 &framer_, PACKET_6BYTE_SEQUENCE_NUMBER, wire_sequence_number)) |
| 446 << "last_sequence_number: " << last_sequence_number | 473 << "last_sequence_number: " << last_sequence_number |
| 447 << " wire_sequence_number: " << wire_sequence_number; | 474 << " wire_sequence_number: " << wire_sequence_number; |
| 448 } | 475 } |
| 449 | 476 |
| 450 QuicPacket* BuildDataPacket(const QuicPacketHeader& header, | 477 QuicPacket* BuildDataPacket(const QuicPacketHeader& header, |
| 451 const QuicFrames& frames) { | 478 const QuicFrames& frames) { |
| 452 return BuildUnsizedDataPacket(&framer_, header, frames).packet; | 479 return BuildUnsizedDataPacket(&framer_, header, frames); |
| 480 } |
| 481 |
| 482 QuicPacket* BuildDataPacket(const QuicPacketHeader& header, |
| 483 const QuicFrames& frames, |
| 484 size_t packet_size) { |
| 485 return BuildUnsizedDataPacket(&framer_, header, frames, packet_size); |
| 453 } | 486 } |
| 454 | 487 |
| 455 test::TestEncrypter* encrypter_; | 488 test::TestEncrypter* encrypter_; |
| 456 test::TestDecrypter* decrypter_; | 489 test::TestDecrypter* decrypter_; |
| 457 QuicVersion version_; | 490 QuicVersion version_; |
| 458 QuicTime start_; | 491 QuicTime start_; |
| 459 QuicFramer framer_; | 492 QuicFramer framer_; |
| 460 test::TestQuicVisitor visitor_; | 493 test::TestQuicVisitor visitor_; |
| 461 test::TestEntropyCalculator entropy_calculator_; | 494 test::TestEntropyCalculator entropy_calculator_; |
| 462 }; | 495 }; |
| (...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1305 | 1338 |
| 1306 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1339 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1307 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1340 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1308 | 1341 |
| 1309 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1342 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1310 ASSERT_TRUE(visitor_.header_.get()); | 1343 ASSERT_TRUE(visitor_.header_.get()); |
| 1311 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1344 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 1312 | 1345 |
| 1313 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1346 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
| 1314 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1347 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
| 1315 EXPECT_EQ(GG_UINT64_C(0x00020304), | 1348 EXPECT_EQ(GG_UINT64_C(0x00020304), visitor_.stream_frames_[0]->stream_id); |
| 1316 visitor_.stream_frames_[0]->stream_id); | |
| 1317 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1349 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
| 1318 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1350 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
| 1319 visitor_.stream_frames_[0]->offset); | 1351 visitor_.stream_frames_[0]->offset); |
| 1320 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1352 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
| 1321 | 1353 |
| 1322 // Now test framing boundaries. | 1354 // Now test framing boundaries. |
| 1323 const size_t stream_id_size = 3; | 1355 const size_t stream_id_size = 3; |
| 1324 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); | 1356 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); |
| 1325 } | 1357 } |
| 1326 | 1358 |
| (...skipping 2033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3360 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3392 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3361 | 3393 |
| 3362 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3394 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3363 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3395 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3364 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3396 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3365 | 3397 |
| 3366 // 0 revived packets. | 3398 // 0 revived packets. |
| 3367 0x00, | 3399 0x00, |
| 3368 }; | 3400 }; |
| 3369 | 3401 |
| 3370 scoped_ptr<QuicPacket> data( | 3402 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
| 3371 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); | |
| 3372 ASSERT_TRUE(data != nullptr); | 3403 ASSERT_TRUE(data != nullptr); |
| 3373 | 3404 |
| 3374 test::CompareCharArraysWithHexError("constructed packet", | 3405 test::CompareCharArraysWithHexError("constructed packet", |
| 3375 data->data(), data->length(), | 3406 data->data(), data->length(), |
| 3376 AsChars(packet), arraysize(packet)); | 3407 AsChars(packet), arraysize(packet)); |
| 3377 } | 3408 } |
| 3378 | 3409 |
| 3379 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { | 3410 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { |
| 3380 QuicPacketHeader header; | 3411 QuicPacketHeader header; |
| 3381 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3412 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3423 0x00, 0x00, | 3454 0x00, 0x00, |
| 3424 // num missing packet ranges (limited to 6 by packet size of 37). | 3455 // num missing packet ranges (limited to 6 by packet size of 37). |
| 3425 0x06, | 3456 0x06, |
| 3426 // {missing packet delta, further missing packets in range} | 3457 // {missing packet delta, further missing packets in range} |
| 3427 // 6 nack ranges | 3458 // 6 nack ranges |
| 3428 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 3459 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3429 // 0 revived packets. | 3460 // 0 revived packets. |
| 3430 0x00, | 3461 0x00, |
| 3431 }; | 3462 }; |
| 3432 | 3463 |
| 3433 scoped_ptr<QuicPacket> data( | 3464 scoped_ptr<QuicPacket> data(BuildDataPacket(header, frames, 37u)); |
| 3434 framer_.BuildDataPacket(header, frames, 37u).packet); | |
| 3435 ASSERT_TRUE(data != nullptr); | 3465 ASSERT_TRUE(data != nullptr); |
| 3436 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. | 3466 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. |
| 3437 EXPECT_EQ(36u, data->length()); | 3467 EXPECT_EQ(36u, data->length()); |
| 3438 test::CompareCharArraysWithHexError("constructed packet", | 3468 test::CompareCharArraysWithHexError("constructed packet", |
| 3439 data->data(), data->length(), | 3469 data->data(), data->length(), |
| 3440 AsChars(packet), arraysize(packet)); | 3470 AsChars(packet), arraysize(packet)); |
| 3441 } | 3471 } |
| 3442 | 3472 |
| 3443 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { | 3473 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { |
| 3444 QuicPacketHeader header; | 3474 QuicPacketHeader header; |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3897 // first fec protected packet offset | 3927 // first fec protected packet offset |
| 3898 0x01, | 3928 0x01, |
| 3899 | 3929 |
| 3900 // redundancy | 3930 // redundancy |
| 3901 'a', 'b', 'c', 'd', | 3931 'a', 'b', 'c', 'd', |
| 3902 'e', 'f', 'g', 'h', | 3932 'e', 'f', 'g', 'h', |
| 3903 'i', 'j', 'k', 'l', | 3933 'i', 'j', 'k', 'l', |
| 3904 'm', 'n', 'o', 'p', | 3934 'm', 'n', 'o', 'p', |
| 3905 }; | 3935 }; |
| 3906 | 3936 |
| 3907 scoped_ptr<QuicPacket> data( | 3937 scoped_ptr<QuicPacket> data(framer_.BuildFecPacket(header, fec_data)); |
| 3908 framer_.BuildFecPacket(header, fec_data).packet); | |
| 3909 ASSERT_TRUE(data != nullptr); | 3938 ASSERT_TRUE(data != nullptr); |
| 3910 | 3939 |
| 3911 test::CompareCharArraysWithHexError("constructed packet", | 3940 test::CompareCharArraysWithHexError("constructed packet", |
| 3912 data->data(), data->length(), | 3941 data->data(), data->length(), |
| 3913 AsChars(packet), arraysize(packet)); | 3942 AsChars(packet), arraysize(packet)); |
| 3914 } | 3943 } |
| 3915 | 3944 |
| 3916 TEST_P(QuicFramerTest, EncryptPacket) { | 3945 TEST_P(QuicFramerTest, EncryptPacket) { |
| 3917 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); | 3946 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); |
| 3918 unsigned char packet[] = { | 3947 unsigned char packet[] = { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3929 // first fec protected packet offset | 3958 // first fec protected packet offset |
| 3930 0x01, | 3959 0x01, |
| 3931 | 3960 |
| 3932 // redundancy | 3961 // redundancy |
| 3933 'a', 'b', 'c', 'd', | 3962 'a', 'b', 'c', 'd', |
| 3934 'e', 'f', 'g', 'h', | 3963 'e', 'f', 'g', 'h', |
| 3935 'i', 'j', 'k', 'l', | 3964 'i', 'j', 'k', 'l', |
| 3936 'm', 'n', 'o', 'p', | 3965 'm', 'n', 'o', 'p', |
| 3937 }; | 3966 }; |
| 3938 | 3967 |
| 3939 scoped_ptr<QuicPacket> raw( | 3968 scoped_ptr<QuicPacket> raw(new QuicPacket( |
| 3940 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, | 3969 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 3941 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 3970 !kIncludeVersion, PACKET_6BYTE_SEQUENCE_NUMBER)); |
| 3942 PACKET_6BYTE_SEQUENCE_NUMBER)); | |
| 3943 scoped_ptr<QuicEncryptedPacket> encrypted( | 3971 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 3944 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 3972 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
| 3945 | 3973 |
| 3946 ASSERT_TRUE(encrypted.get() != nullptr); | 3974 ASSERT_TRUE(encrypted.get() != nullptr); |
| 3947 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 3975 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
| 3948 } | 3976 } |
| 3949 | 3977 |
| 3950 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { | 3978 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { |
| 3951 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); | 3979 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); |
| 3952 unsigned char packet[] = { | 3980 unsigned char packet[] = { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 3965 // first fec protected packet offset | 3993 // first fec protected packet offset |
| 3966 0x01, | 3994 0x01, |
| 3967 | 3995 |
| 3968 // redundancy | 3996 // redundancy |
| 3969 'a', 'b', 'c', 'd', | 3997 'a', 'b', 'c', 'd', |
| 3970 'e', 'f', 'g', 'h', | 3998 'e', 'f', 'g', 'h', |
| 3971 'i', 'j', 'k', 'l', | 3999 'i', 'j', 'k', 'l', |
| 3972 'm', 'n', 'o', 'p', | 4000 'm', 'n', 'o', 'p', |
| 3973 }; | 4001 }; |
| 3974 | 4002 |
| 3975 scoped_ptr<QuicPacket> raw( | 4003 scoped_ptr<QuicPacket> raw(new QuicPacket( |
| 3976 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, | 4004 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 3977 PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, | 4005 kIncludeVersion, PACKET_6BYTE_SEQUENCE_NUMBER)); |
| 3978 PACKET_6BYTE_SEQUENCE_NUMBER)); | |
| 3979 scoped_ptr<QuicEncryptedPacket> encrypted( | 4006 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 3980 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 4007 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
| 3981 | 4008 |
| 3982 ASSERT_TRUE(encrypted.get() != nullptr); | 4009 ASSERT_TRUE(encrypted.get() != nullptr); |
| 3983 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 4010 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
| 3984 } | 4011 } |
| 3985 | 4012 |
| 3986 TEST_P(QuicFramerTest, AckTruncationLargePacket) { | 4013 TEST_P(QuicFramerTest, AckTruncationLargePacket) { |
| 3987 QuicPacketHeader header; | 4014 QuicPacketHeader header; |
| 3988 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4015 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
| 3989 header.public_header.reset_flag = false; | 4016 header.public_header.reset_flag = false; |
| 3990 header.public_header.version_flag = false; | 4017 header.public_header.version_flag = false; |
| 3991 header.fec_flag = false; | 4018 header.fec_flag = false; |
| 3992 header.entropy_flag = false; | 4019 header.entropy_flag = false; |
| 3993 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4020 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 3994 header.fec_group = 0; | 4021 header.fec_group = 0; |
| 3995 | 4022 |
| 3996 // Create a packet with just the ack. | 4023 // Create a packet with just the ack. |
| 3997 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); | 4024 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); |
| 3998 QuicFrame frame; | 4025 QuicFrame frame; |
| 3999 frame.type = ACK_FRAME; | 4026 frame.type = ACK_FRAME; |
| 4000 frame.ack_frame = &ack_frame; | 4027 frame.ack_frame = &ack_frame; |
| 4001 QuicFrames frames; | 4028 QuicFrames frames; |
| 4002 frames.push_back(frame); | 4029 frames.push_back(frame); |
| 4003 | 4030 |
| 4004 // Build an ack packet with truncation due to limit in number of nack ranges. | 4031 // Build an ack packet with truncation due to limit in number of nack ranges. |
| 4005 scoped_ptr<QuicPacket> raw_ack_packet( | 4032 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); |
| 4006 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); | |
| 4007 ASSERT_TRUE(raw_ack_packet != nullptr); | 4033 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 4008 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4034 scoped_ptr<QuicEncryptedPacket> ack_packet( |
| 4009 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4035 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
| 4010 *raw_ack_packet)); | 4036 *raw_ack_packet)); |
| 4011 // Now make sure we can turn our ack packet back into an ack frame. | 4037 // Now make sure we can turn our ack packet back into an ack frame. |
| 4012 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4038 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
| 4013 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4039 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 4014 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4040 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
| 4015 EXPECT_TRUE(processed_ack_frame.is_truncated); | 4041 EXPECT_TRUE(processed_ack_frame.is_truncated); |
| 4016 EXPECT_EQ(510u, processed_ack_frame.largest_observed); | 4042 EXPECT_EQ(510u, processed_ack_frame.largest_observed); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4035 | 4061 |
| 4036 // Create a packet with just the ack. | 4062 // Create a packet with just the ack. |
| 4037 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); | 4063 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); |
| 4038 QuicFrame frame; | 4064 QuicFrame frame; |
| 4039 frame.type = ACK_FRAME; | 4065 frame.type = ACK_FRAME; |
| 4040 frame.ack_frame = &ack_frame; | 4066 frame.ack_frame = &ack_frame; |
| 4041 QuicFrames frames; | 4067 QuicFrames frames; |
| 4042 frames.push_back(frame); | 4068 frames.push_back(frame); |
| 4043 | 4069 |
| 4044 // Build an ack packet with truncation due to limit in number of nack ranges. | 4070 // Build an ack packet with truncation due to limit in number of nack ranges. |
| 4045 scoped_ptr<QuicPacket> raw_ack_packet( | 4071 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames, 500)); |
| 4046 framer_.BuildDataPacket(header, frames, 500).packet); | |
| 4047 ASSERT_TRUE(raw_ack_packet != nullptr); | 4072 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 4048 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4073 scoped_ptr<QuicEncryptedPacket> ack_packet( |
| 4049 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4074 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
| 4050 *raw_ack_packet)); | 4075 *raw_ack_packet)); |
| 4051 // Now make sure we can turn our ack packet back into an ack frame. | 4076 // Now make sure we can turn our ack packet back into an ack frame. |
| 4052 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4077 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
| 4053 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4078 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 4054 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4079 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
| 4055 EXPECT_TRUE(processed_ack_frame.is_truncated); | 4080 EXPECT_TRUE(processed_ack_frame.is_truncated); |
| 4056 EXPECT_EQ(476u, processed_ack_frame.largest_observed); | 4081 EXPECT_EQ(476u, processed_ack_frame.largest_observed); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4237 EXPECT_CALL(visitor, OnPacketComplete()); | 4262 EXPECT_CALL(visitor, OnPacketComplete()); |
| 4238 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); | 4263 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); |
| 4239 | 4264 |
| 4240 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 4265 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 4241 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4266 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 4242 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4267 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 4243 } | 4268 } |
| 4244 | 4269 |
| 4245 } // namespace test | 4270 } // namespace test |
| 4246 } // namespace net | 4271 } // namespace net |
| OLD | NEW |