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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 // Size in bytes of the stream frame fields for an arbitrary StreamID and | 47 // Size in bytes of the stream frame fields for an arbitrary StreamID and |
48 // offset and the last frame in a packet. | 48 // offset and the last frame in a packet. |
49 size_t GetMinStreamFrameSize(QuicVersion version) { | 49 size_t GetMinStreamFrameSize(QuicVersion version) { |
50 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; | 50 return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize; |
51 } | 51 } |
52 | 52 |
53 // Index into the sequence number offset in the header. | 53 // Index into the sequence number offset in the header. |
54 size_t GetSequenceNumberOffset(QuicConnectionIdLength connection_id_length, | 54 size_t GetSequenceNumberOffset(QuicConnectionIdLength connection_id_length, |
55 bool include_version) { | 55 bool include_version) { |
56 return kConnectionIdOffset + connection_id_length + | 56 return kConnectionIdOffset + connection_id_length + |
57 (include_version ? kQuicVersionSize : 0); | 57 (include_version ? kQuicVersionSize : 0); |
58 } | 58 } |
59 | 59 |
60 size_t GetSequenceNumberOffset(bool include_version) { | 60 size_t GetSequenceNumberOffset(bool include_version) { |
61 return GetSequenceNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version); | 61 return GetSequenceNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version); |
62 } | 62 } |
63 | 63 |
64 // Index into the private flags offset in the data packet header. | 64 // Index into the private flags offset in the data packet header. |
65 size_t GetPrivateFlagsOffset(QuicConnectionIdLength connection_id_length, | 65 size_t GetPrivateFlagsOffset(QuicConnectionIdLength connection_id_length, |
66 bool include_version) { | 66 bool include_version) { |
67 return GetSequenceNumberOffset(connection_id_length, include_version) + | 67 return GetSequenceNumberOffset(connection_id_length, include_version) + |
68 PACKET_6BYTE_SEQUENCE_NUMBER; | 68 PACKET_6BYTE_SEQUENCE_NUMBER; |
69 } | 69 } |
70 | 70 |
71 size_t GetPrivateFlagsOffset(bool include_version) { | 71 size_t GetPrivateFlagsOffset(bool include_version) { |
72 return GetPrivateFlagsOffset(PACKET_8BYTE_CONNECTION_ID, include_version); | 72 return GetPrivateFlagsOffset(PACKET_8BYTE_CONNECTION_ID, include_version); |
73 } | 73 } |
74 | 74 |
75 size_t GetPrivateFlagsOffset(bool include_version, | 75 size_t GetPrivateFlagsOffset(bool include_version, |
76 QuicSequenceNumberLength sequence_number_length) { | 76 QuicSequenceNumberLength sequence_number_length) { |
77 return GetSequenceNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version) + | 77 return GetSequenceNumberOffset(PACKET_8BYTE_CONNECTION_ID, include_version) + |
78 sequence_number_length; | 78 sequence_number_length; |
79 } | 79 } |
80 | 80 |
81 // Index into the fec group offset in the header. | 81 // Index into the fec group offset in the header. |
82 size_t GetFecGroupOffset(QuicConnectionIdLength connection_id_length, | 82 size_t GetFecGroupOffset(QuicConnectionIdLength connection_id_length, |
83 bool include_version) { | 83 bool include_version) { |
84 return GetPrivateFlagsOffset(connection_id_length, include_version) + | 84 return GetPrivateFlagsOffset(connection_id_length, include_version) + |
85 kPrivateFlagsSize; | 85 kPrivateFlagsSize; |
86 } | 86 } |
87 | 87 |
88 size_t GetFecGroupOffset(bool include_version) { | 88 size_t GetFecGroupOffset(bool include_version) { |
89 return GetPrivateFlagsOffset(PACKET_8BYTE_CONNECTION_ID, include_version) + | 89 return GetPrivateFlagsOffset(PACKET_8BYTE_CONNECTION_ID, include_version) + |
90 kPrivateFlagsSize; | 90 kPrivateFlagsSize; |
91 } | 91 } |
92 | 92 |
93 size_t GetFecGroupOffset(bool include_version, | 93 size_t GetFecGroupOffset(bool include_version, |
94 QuicSequenceNumberLength sequence_number_length) { | 94 QuicSequenceNumberLength sequence_number_length) { |
95 return GetPrivateFlagsOffset(include_version, sequence_number_length) + | 95 return GetPrivateFlagsOffset(include_version, sequence_number_length) + |
96 kPrivateFlagsSize; | 96 kPrivateFlagsSize; |
97 } | 97 } |
98 | 98 |
99 // Index into the message tag of the public reset packet. | 99 // Index into the message tag of the public reset packet. |
100 // Public resets always have full connection_ids. | 100 // Public resets always have full connection_ids. |
101 const size_t kPublicResetPacketMessageTagOffset = | 101 const size_t kPublicResetPacketMessageTagOffset = |
102 kConnectionIdOffset + PACKET_8BYTE_CONNECTION_ID; | 102 kConnectionIdOffset + PACKET_8BYTE_CONNECTION_ID; |
103 | 103 |
104 class TestEncrypter : public QuicEncrypter { | 104 class TestEncrypter : public QuicEncrypter { |
105 public: | 105 public: |
106 virtual ~TestEncrypter() {} | 106 virtual ~TestEncrypter() {} |
107 virtual bool SetKey(StringPiece key) OVERRIDE { | 107 virtual bool SetKey(StringPiece key) OVERRIDE { return true; } |
108 return true; | |
109 } | |
110 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { | 108 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { |
111 return true; | 109 return true; |
112 } | 110 } |
113 virtual bool Encrypt(StringPiece nonce, | 111 virtual bool Encrypt(StringPiece nonce, |
114 StringPiece associated_data, | 112 StringPiece associated_data, |
115 StringPiece plaintext, | 113 StringPiece plaintext, |
116 unsigned char* output) OVERRIDE { | 114 unsigned char* output) OVERRIDE { |
117 CHECK(false) << "Not implemented"; | 115 CHECK(false) << "Not implemented"; |
118 return false; | 116 return false; |
119 } | 117 } |
120 virtual QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number, | 118 virtual QuicData* EncryptPacket(QuicPacketSequenceNumber sequence_number, |
121 StringPiece associated_data, | 119 StringPiece associated_data, |
122 StringPiece plaintext) OVERRIDE { | 120 StringPiece plaintext) OVERRIDE { |
123 sequence_number_ = sequence_number; | 121 sequence_number_ = sequence_number; |
124 associated_data_ = associated_data.as_string(); | 122 associated_data_ = associated_data.as_string(); |
125 plaintext_ = plaintext.as_string(); | 123 plaintext_ = plaintext.as_string(); |
126 return new QuicData(plaintext.data(), plaintext.length()); | 124 return new QuicData(plaintext.data(), plaintext.length()); |
127 } | 125 } |
128 virtual size_t GetKeySize() const OVERRIDE { | 126 virtual size_t GetKeySize() const OVERRIDE { return 0; } |
129 return 0; | 127 virtual size_t GetNoncePrefixSize() const OVERRIDE { return 0; } |
130 } | |
131 virtual size_t GetNoncePrefixSize() const OVERRIDE { | |
132 return 0; | |
133 } | |
134 virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) const OVERRIDE { | 128 virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) const OVERRIDE { |
135 return ciphertext_size; | 129 return ciphertext_size; |
136 } | 130 } |
137 virtual size_t GetCiphertextSize(size_t plaintext_size) const OVERRIDE { | 131 virtual size_t GetCiphertextSize(size_t plaintext_size) const OVERRIDE { |
138 return plaintext_size; | 132 return plaintext_size; |
139 } | 133 } |
140 virtual StringPiece GetKey() const OVERRIDE { | 134 virtual StringPiece GetKey() const OVERRIDE { return StringPiece(); } |
141 return StringPiece(); | 135 virtual StringPiece GetNoncePrefix() const OVERRIDE { return StringPiece(); } |
142 } | |
143 virtual StringPiece GetNoncePrefix() const OVERRIDE { | |
144 return StringPiece(); | |
145 } | |
146 QuicPacketSequenceNumber sequence_number_; | 136 QuicPacketSequenceNumber sequence_number_; |
147 string associated_data_; | 137 string associated_data_; |
148 string plaintext_; | 138 string plaintext_; |
149 }; | 139 }; |
150 | 140 |
151 class TestDecrypter : public QuicDecrypter { | 141 class TestDecrypter : public QuicDecrypter { |
152 public: | 142 public: |
153 virtual ~TestDecrypter() {} | 143 virtual ~TestDecrypter() {} |
154 virtual bool SetKey(StringPiece key) OVERRIDE { | 144 virtual bool SetKey(StringPiece key) OVERRIDE { return true; } |
155 return true; | |
156 } | |
157 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { | 145 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { |
158 return true; | 146 return true; |
159 } | 147 } |
160 virtual bool Decrypt(StringPiece nonce, | 148 virtual bool Decrypt(StringPiece nonce, |
161 StringPiece associated_data, | 149 StringPiece associated_data, |
162 StringPiece ciphertext, | 150 StringPiece ciphertext, |
163 unsigned char* output, | 151 unsigned char* output, |
164 size_t* output_length) OVERRIDE { | 152 size_t* output_length) OVERRIDE { |
165 CHECK(false) << "Not implemented"; | 153 CHECK(false) << "Not implemented"; |
166 return false; | 154 return false; |
167 } | 155 } |
168 virtual QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number, | 156 virtual QuicData* DecryptPacket(QuicPacketSequenceNumber sequence_number, |
169 StringPiece associated_data, | 157 StringPiece associated_data, |
170 StringPiece ciphertext) OVERRIDE { | 158 StringPiece ciphertext) OVERRIDE { |
171 sequence_number_ = sequence_number; | 159 sequence_number_ = sequence_number; |
172 associated_data_ = associated_data.as_string(); | 160 associated_data_ = associated_data.as_string(); |
173 ciphertext_ = ciphertext.as_string(); | 161 ciphertext_ = ciphertext.as_string(); |
174 return new QuicData(ciphertext.data(), ciphertext.length()); | 162 return new QuicData(ciphertext.data(), ciphertext.length()); |
175 } | 163 } |
176 virtual StringPiece GetKey() const OVERRIDE { | 164 virtual StringPiece GetKey() const OVERRIDE { return StringPiece(); } |
177 return StringPiece(); | 165 virtual StringPiece GetNoncePrefix() const OVERRIDE { return StringPiece(); } |
178 } | |
179 virtual StringPiece GetNoncePrefix() const OVERRIDE { | |
180 return StringPiece(); | |
181 } | |
182 QuicPacketSequenceNumber sequence_number_; | 166 QuicPacketSequenceNumber sequence_number_; |
183 string associated_data_; | 167 string associated_data_; |
184 string ciphertext_; | 168 string ciphertext_; |
185 }; | 169 }; |
186 | 170 |
187 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { | 171 class TestQuicVisitor : public ::net::QuicFramerVisitorInterface { |
188 public: | 172 public: |
189 TestQuicVisitor() | 173 TestQuicVisitor() |
190 : error_count_(0), | 174 : error_count_(0), |
191 version_mismatch_(0), | 175 version_mismatch_(0), |
192 packet_count_(0), | 176 packet_count_(0), |
193 frame_count_(0), | 177 frame_count_(0), |
194 fec_count_(0), | 178 fec_count_(0), |
195 complete_packets_(0), | 179 complete_packets_(0), |
196 revived_packets_(0), | 180 revived_packets_(0), |
197 accept_packet_(true), | 181 accept_packet_(true), |
198 accept_public_header_(true) { | 182 accept_public_header_(true) {} |
199 } | |
200 | 183 |
201 virtual ~TestQuicVisitor() { | 184 virtual ~TestQuicVisitor() { |
202 STLDeleteElements(&stream_frames_); | 185 STLDeleteElements(&stream_frames_); |
203 STLDeleteElements(&ack_frames_); | 186 STLDeleteElements(&ack_frames_); |
204 STLDeleteElements(&congestion_feedback_frames_); | 187 STLDeleteElements(&congestion_feedback_frames_); |
205 STLDeleteElements(&stop_waiting_frames_); | 188 STLDeleteElements(&stop_waiting_frames_); |
206 STLDeleteElements(&ping_frames_); | 189 STLDeleteElements(&ping_frames_); |
207 STLDeleteElements(&fec_data_); | 190 STLDeleteElements(&fec_data_); |
208 } | 191 } |
209 | 192 |
210 virtual void OnError(QuicFramer* f) OVERRIDE { | 193 virtual void OnError(QuicFramer* f) OVERRIDE { |
211 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) | 194 DVLOG(1) << "QuicFramer Error: " << QuicUtils::ErrorToString(f->error()) |
212 << " (" << f->error() << ")"; | 195 << " (" << f->error() << ")"; |
213 ++error_count_; | 196 ++error_count_; |
214 } | 197 } |
215 | 198 |
216 virtual void OnPacket() OVERRIDE {} | 199 virtual void OnPacket() OVERRIDE {} |
217 | 200 |
218 virtual void OnPublicResetPacket( | 201 virtual void OnPublicResetPacket( |
219 const QuicPublicResetPacket& packet) OVERRIDE { | 202 const QuicPublicResetPacket& packet) OVERRIDE { |
220 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); | 203 public_reset_packet_.reset(new QuicPublicResetPacket(packet)); |
221 } | 204 } |
222 | 205 |
223 virtual void OnVersionNegotiationPacket( | 206 virtual void OnVersionNegotiationPacket( |
224 const QuicVersionNegotiationPacket& packet) OVERRIDE { | 207 const QuicVersionNegotiationPacket& packet) OVERRIDE { |
225 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); | 208 version_negotiation_packet_.reset(new QuicVersionNegotiationPacket(packet)); |
226 } | 209 } |
227 | 210 |
228 virtual void OnRevivedPacket() OVERRIDE { | 211 virtual void OnRevivedPacket() OVERRIDE { ++revived_packets_; } |
229 ++revived_packets_; | |
230 } | |
231 | 212 |
232 virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE { | 213 virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE { |
233 DVLOG(1) << "QuicFramer Version Mismatch, version: " << version; | 214 DVLOG(1) << "QuicFramer Version Mismatch, version: " << version; |
234 ++version_mismatch_; | 215 ++version_mismatch_; |
235 return true; | 216 return true; |
236 } | 217 } |
237 | 218 |
238 virtual bool OnUnauthenticatedPublicHeader( | 219 virtual bool OnUnauthenticatedPublicHeader( |
239 const QuicPacketPublicHeader& header) OVERRIDE { | 220 const QuicPacketPublicHeader& header) OVERRIDE { |
240 public_header_.reset(new QuicPacketPublicHeader(header)); | 221 public_header_.reset(new QuicPacketPublicHeader(header)); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 ++frame_count_; | 269 ++frame_count_; |
289 ping_frames_.push_back(new QuicPingFrame(frame)); | 270 ping_frames_.push_back(new QuicPingFrame(frame)); |
290 return true; | 271 return true; |
291 } | 272 } |
292 | 273 |
293 virtual void OnFecData(const QuicFecData& fec) OVERRIDE { | 274 virtual void OnFecData(const QuicFecData& fec) OVERRIDE { |
294 ++fec_count_; | 275 ++fec_count_; |
295 fec_data_.push_back(new QuicFecData(fec)); | 276 fec_data_.push_back(new QuicFecData(fec)); |
296 } | 277 } |
297 | 278 |
298 virtual void OnPacketComplete() OVERRIDE { | 279 virtual void OnPacketComplete() OVERRIDE { ++complete_packets_; } |
299 ++complete_packets_; | |
300 } | |
301 | 280 |
302 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE { | 281 virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE { |
303 rst_stream_frame_ = frame; | 282 rst_stream_frame_ = frame; |
304 return true; | 283 return true; |
305 } | 284 } |
306 | 285 |
307 virtual bool OnConnectionCloseFrame( | 286 virtual bool OnConnectionCloseFrame( |
308 const QuicConnectionCloseFrame& frame) OVERRIDE { | 287 const QuicConnectionCloseFrame& frame) OVERRIDE { |
309 connection_close_frame_ = frame; | 288 connection_close_frame_ = frame; |
310 return true; | 289 return true; |
311 } | 290 } |
312 | 291 |
313 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE { | 292 virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE { |
314 goaway_frame_ = frame; | 293 goaway_frame_ = frame; |
315 return true; | 294 return true; |
316 } | 295 } |
317 | 296 |
318 virtual bool OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) | 297 virtual bool OnWindowUpdateFrame( |
319 OVERRIDE { | 298 const QuicWindowUpdateFrame& frame) OVERRIDE { |
320 window_update_frame_ = frame; | 299 window_update_frame_ = frame; |
321 return true; | 300 return true; |
322 } | 301 } |
323 | 302 |
324 virtual bool OnBlockedFrame(const QuicBlockedFrame& frame) OVERRIDE { | 303 virtual bool OnBlockedFrame(const QuicBlockedFrame& frame) OVERRIDE { |
325 blocked_frame_ = frame; | 304 blocked_frame_ = frame; |
326 return true; | 305 return true; |
327 } | 306 } |
328 | 307 |
329 // Counters from the visitor_ callbacks. | 308 // Counters from the visitor_ callbacks. |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 framer_.set_version(version_); | 345 framer_.set_version(version_); |
367 framer_.SetDecrypter(decrypter_, ENCRYPTION_NONE); | 346 framer_.SetDecrypter(decrypter_, ENCRYPTION_NONE); |
368 framer_.SetEncrypter(ENCRYPTION_NONE, encrypter_); | 347 framer_.SetEncrypter(ENCRYPTION_NONE, encrypter_); |
369 framer_.set_visitor(&visitor_); | 348 framer_.set_visitor(&visitor_); |
370 framer_.set_received_entropy_calculator(&entropy_calculator_); | 349 framer_.set_received_entropy_calculator(&entropy_calculator_); |
371 } | 350 } |
372 | 351 |
373 // Helper function to get unsigned char representation of digit in the | 352 // Helper function to get unsigned char representation of digit in the |
374 // units place of the current QUIC version number. | 353 // units place of the current QUIC version number. |
375 unsigned char GetQuicVersionDigitOnes() { | 354 unsigned char GetQuicVersionDigitOnes() { |
376 return static_cast<unsigned char> ('0' + version_%10); | 355 return static_cast<unsigned char>('0' + version_ % 10); |
377 } | 356 } |
378 | 357 |
379 // Helper function to get unsigned char representation of digit in the | 358 // Helper function to get unsigned char representation of digit in the |
380 // tens place of the current QUIC version number. | 359 // tens place of the current QUIC version number. |
381 unsigned char GetQuicVersionDigitTens() { | 360 unsigned char GetQuicVersionDigitTens() { |
382 return static_cast<unsigned char> ('0' + (version_/10)%10); | 361 return static_cast<unsigned char>('0' + (version_ / 10) % 10); |
383 } | 362 } |
384 | 363 |
385 bool CheckEncryption(QuicPacketSequenceNumber sequence_number, | 364 bool CheckEncryption(QuicPacketSequenceNumber sequence_number, |
386 QuicPacket* packet) { | 365 QuicPacket* packet) { |
387 if (sequence_number != encrypter_->sequence_number_) { | 366 if (sequence_number != encrypter_->sequence_number_) { |
388 LOG(ERROR) << "Encrypted incorrect packet sequence number. expected " | 367 LOG(ERROR) << "Encrypted incorrect packet sequence number. expected " |
389 << sequence_number << " actual: " | 368 << sequence_number |
390 << encrypter_->sequence_number_; | 369 << " actual: " << encrypter_->sequence_number_; |
391 return false; | 370 return false; |
392 } | 371 } |
393 if (packet->AssociatedData() != encrypter_->associated_data_) { | 372 if (packet->AssociatedData() != encrypter_->associated_data_) { |
394 LOG(ERROR) << "Encrypted incorrect associated data. expected " | 373 LOG(ERROR) << "Encrypted incorrect associated data. expected " |
395 << packet->AssociatedData() << " actual: " | 374 << packet->AssociatedData() |
396 << encrypter_->associated_data_; | 375 << " actual: " << encrypter_->associated_data_; |
397 return false; | 376 return false; |
398 } | 377 } |
399 if (packet->Plaintext() != encrypter_->plaintext_) { | 378 if (packet->Plaintext() != encrypter_->plaintext_) { |
400 LOG(ERROR) << "Encrypted incorrect plaintext data. expected " | 379 LOG(ERROR) << "Encrypted incorrect plaintext data. expected " |
401 << packet->Plaintext() << " actual: " | 380 << packet->Plaintext() |
402 << encrypter_->plaintext_; | 381 << " actual: " << encrypter_->plaintext_; |
403 return false; | 382 return false; |
404 } | 383 } |
405 return true; | 384 return true; |
406 } | 385 } |
407 | 386 |
408 bool CheckDecryption(const QuicEncryptedPacket& encrypted, | 387 bool CheckDecryption(const QuicEncryptedPacket& encrypted, |
409 bool includes_version) { | 388 bool includes_version) { |
410 if (visitor_.header_->packet_sequence_number != | 389 if (visitor_.header_->packet_sequence_number != |
411 decrypter_->sequence_number_) { | 390 decrypter_->sequence_number_) { |
412 LOG(ERROR) << "Decrypted incorrect packet sequence number. expected " | 391 LOG(ERROR) << "Decrypted incorrect packet sequence number. expected " |
413 << visitor_.header_->packet_sequence_number << " actual: " | 392 << visitor_.header_->packet_sequence_number |
414 << decrypter_->sequence_number_; | 393 << " actual: " << decrypter_->sequence_number_; |
415 return false; | 394 return false; |
416 } | 395 } |
417 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( | 396 if (QuicFramer::GetAssociatedDataFromEncryptedPacket( |
418 encrypted, PACKET_8BYTE_CONNECTION_ID, | 397 encrypted, |
419 includes_version, PACKET_6BYTE_SEQUENCE_NUMBER) != | 398 PACKET_8BYTE_CONNECTION_ID, |
420 decrypter_->associated_data_) { | 399 includes_version, |
| 400 PACKET_6BYTE_SEQUENCE_NUMBER) != decrypter_->associated_data_) { |
421 LOG(ERROR) << "Decrypted incorrect associated data. expected " | 401 LOG(ERROR) << "Decrypted incorrect associated data. expected " |
422 << QuicFramer::GetAssociatedDataFromEncryptedPacket( | 402 << QuicFramer::GetAssociatedDataFromEncryptedPacket( |
423 encrypted, PACKET_8BYTE_CONNECTION_ID, | 403 encrypted, |
424 includes_version, PACKET_6BYTE_SEQUENCE_NUMBER) | 404 PACKET_8BYTE_CONNECTION_ID, |
| 405 includes_version, |
| 406 PACKET_6BYTE_SEQUENCE_NUMBER) |
425 << " actual: " << decrypter_->associated_data_; | 407 << " actual: " << decrypter_->associated_data_; |
426 return false; | 408 return false; |
427 } | 409 } |
428 StringPiece ciphertext(encrypted.AsStringPiece().substr( | 410 StringPiece ciphertext(encrypted.AsStringPiece().substr( |
429 GetStartOfEncryptedData(PACKET_8BYTE_CONNECTION_ID, includes_version, | 411 GetStartOfEncryptedData(PACKET_8BYTE_CONNECTION_ID, |
| 412 includes_version, |
430 PACKET_6BYTE_SEQUENCE_NUMBER))); | 413 PACKET_6BYTE_SEQUENCE_NUMBER))); |
431 if (ciphertext != decrypter_->ciphertext_) { | 414 if (ciphertext != decrypter_->ciphertext_) { |
432 LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " | 415 LOG(ERROR) << "Decrypted incorrect ciphertext data. expected " |
433 << ciphertext << " actual: " | 416 << ciphertext << " actual: " << decrypter_->ciphertext_; |
434 << decrypter_->ciphertext_; | |
435 return false; | 417 return false; |
436 } | 418 } |
437 return true; | 419 return true; |
438 } | 420 } |
439 | 421 |
440 char* AsChars(unsigned char* data) { | 422 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); } |
441 return reinterpret_cast<char*>(data); | |
442 } | |
443 | 423 |
444 void CheckProcessingFails(unsigned char* packet, | 424 void CheckProcessingFails(unsigned char* packet, |
445 size_t len, | 425 size_t len, |
446 string expected_error, | 426 string expected_error, |
447 QuicErrorCode error_code) { | 427 QuicErrorCode error_code) { |
448 QuicEncryptedPacket encrypted(AsChars(packet), len, false); | 428 QuicEncryptedPacket encrypted(AsChars(packet), len, false); |
449 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len; | 429 EXPECT_FALSE(framer_.ProcessPacket(encrypted)) << "len: " << len; |
450 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len; | 430 EXPECT_EQ(expected_error, framer_.detailed_error()) << "len: " << len; |
451 EXPECT_EQ(error_code, framer_.error()) << "len: " << len; | 431 EXPECT_EQ(error_code, framer_.error()) << "len: " << len; |
452 } | 432 } |
453 | 433 |
454 // Checks if the supplied string matches data in the supplied StreamFrame. | 434 // Checks if the supplied string matches data in the supplied StreamFrame. |
455 void CheckStreamFrameData(string str, QuicStreamFrame* frame) { | 435 void CheckStreamFrameData(string str, QuicStreamFrame* frame) { |
456 scoped_ptr<string> frame_data(frame->GetDataAsString()); | 436 scoped_ptr<string> frame_data(frame->GetDataAsString()); |
457 EXPECT_EQ(str, *frame_data); | 437 EXPECT_EQ(str, *frame_data); |
458 } | 438 } |
459 | 439 |
460 void CheckStreamFrameBoundaries(unsigned char* packet, | 440 void CheckStreamFrameBoundaries(unsigned char* packet, |
461 size_t stream_id_size, | 441 size_t stream_id_size, |
462 bool include_version) { | 442 bool include_version) { |
463 // Now test framing boundaries | 443 // Now test framing boundaries |
464 for (size_t i = kQuicFrameTypeSize; | 444 for (size_t i = kQuicFrameTypeSize; |
465 i < GetMinStreamFrameSize(framer_.version()); ++i) { | 445 i < GetMinStreamFrameSize(framer_.version()); |
| 446 ++i) { |
466 string expected_error; | 447 string expected_error; |
467 if (i < kQuicFrameTypeSize + stream_id_size) { | 448 if (i < kQuicFrameTypeSize + stream_id_size) { |
468 expected_error = "Unable to read stream_id."; | 449 expected_error = "Unable to read stream_id."; |
469 } else if (i < kQuicFrameTypeSize + stream_id_size + | 450 } else if (i < kQuicFrameTypeSize + stream_id_size + |
470 kQuicMaxStreamOffsetSize) { | 451 kQuicMaxStreamOffsetSize) { |
471 expected_error = "Unable to read offset."; | 452 expected_error = "Unable to read offset."; |
472 } else { | 453 } else { |
473 expected_error = "Unable to read frame data."; | 454 expected_error = "Unable to read frame data."; |
474 } | 455 } |
475 CheckProcessingFails( | 456 CheckProcessingFails(packet, |
476 packet, | 457 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
477 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, include_version, | 458 include_version, |
478 PACKET_6BYTE_SEQUENCE_NUMBER, | 459 PACKET_6BYTE_SEQUENCE_NUMBER, |
479 NOT_IN_FEC_GROUP), | 460 NOT_IN_FEC_GROUP), |
480 expected_error, QUIC_INVALID_STREAM_DATA); | 461 expected_error, |
| 462 QUIC_INVALID_STREAM_DATA); |
481 } | 463 } |
482 } | 464 } |
483 | 465 |
484 void CheckCalculatePacketSequenceNumber( | 466 void CheckCalculatePacketSequenceNumber( |
485 QuicPacketSequenceNumber expected_sequence_number, | 467 QuicPacketSequenceNumber expected_sequence_number, |
486 QuicPacketSequenceNumber last_sequence_number) { | 468 QuicPacketSequenceNumber last_sequence_number) { |
487 QuicPacketSequenceNumber wire_sequence_number = | 469 QuicPacketSequenceNumber wire_sequence_number = |
488 expected_sequence_number & kMask; | 470 expected_sequence_number & kMask; |
489 QuicFramerPeer::SetLastSequenceNumber(&framer_, last_sequence_number); | 471 QuicFramerPeer::SetLastSequenceNumber(&framer_, last_sequence_number); |
490 EXPECT_EQ(expected_sequence_number, | 472 EXPECT_EQ(expected_sequence_number, |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 | 585 |
604 // Large numbers should not wrap either. | 586 // Large numbers should not wrap either. |
605 for (uint64 j = 0; j < 10; j++) { | 587 for (uint64 j = 0; j < 10; j++) { |
606 uint64 num = kEpoch - 1 - j; | 588 uint64 num = kEpoch - 1 - j; |
607 CheckCalculatePacketSequenceNumber(max_epoch + num, last); | 589 CheckCalculatePacketSequenceNumber(max_epoch + num, last); |
608 } | 590 } |
609 } | 591 } |
610 } | 592 } |
611 | 593 |
612 TEST_P(QuicFramerTest, EmptyPacket) { | 594 TEST_P(QuicFramerTest, EmptyPacket) { |
613 char packet[] = { 0x00 }; | 595 char packet[] = {0x00}; |
614 QuicEncryptedPacket encrypted(packet, 0, false); | 596 QuicEncryptedPacket encrypted(packet, 0, false); |
615 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 597 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
616 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); | 598 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); |
617 } | 599 } |
618 | 600 |
619 TEST_P(QuicFramerTest, LargePacket) { | 601 TEST_P(QuicFramerTest, LargePacket) { |
620 unsigned char packet[kMaxPacketSize + 1] = { | 602 unsigned char packet[kMaxPacketSize + 1] = { |
621 // public flags (8 byte connection_id) | 603 // public flags (8 byte connection_id) |
622 0x3C, | 604 0x3C, |
623 // connection_id | 605 // connection_id |
624 0x10, 0x32, 0x54, 0x76, | 606 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
625 0x98, 0xBA, 0xDC, 0xFE, | 607 // packet sequence number |
626 // packet sequence number | 608 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
627 0xBC, 0x9A, 0x78, 0x56, | 609 // private flags |
628 0x34, 0x12, | 610 0x00, |
629 // private flags | |
630 0x00, | |
631 }; | 611 }; |
632 | 612 |
633 memset(packet + GetPacketHeaderSize( | 613 memset(packet + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
634 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 614 !kIncludeVersion, |
635 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), 0, | 615 PACKET_6BYTE_SEQUENCE_NUMBER, |
636 kMaxPacketSize - GetPacketHeaderSize( | 616 NOT_IN_FEC_GROUP), |
637 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 617 0, |
638 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + 1); | 618 kMaxPacketSize - GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
| 619 !kIncludeVersion, |
| 620 PACKET_6BYTE_SEQUENCE_NUMBER, |
| 621 NOT_IN_FEC_GROUP) + |
| 622 1); |
639 | 623 |
640 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 624 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
641 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 625 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
642 | 626 |
643 ASSERT_TRUE(visitor_.header_.get()); | 627 ASSERT_TRUE(visitor_.header_.get()); |
644 // Make sure we've parsed the packet header, so we can send an error. | 628 // Make sure we've parsed the packet header, so we can send an error. |
645 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 629 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
646 visitor_.header_->public_header.connection_id); | 630 visitor_.header_->public_header.connection_id); |
647 // Make sure the correct error is propagated. | 631 // Make sure the correct error is propagated. |
648 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error()); | 632 EXPECT_EQ(QUIC_PACKET_TOO_LARGE, framer_.error()); |
649 } | 633 } |
650 | 634 |
651 TEST_P(QuicFramerTest, PacketHeader) { | 635 TEST_P(QuicFramerTest, PacketHeader) { |
652 unsigned char packet[] = { | 636 unsigned char packet[] = {// public flags (8 byte connection_id) |
653 // public flags (8 byte connection_id) | 637 0x3C, |
654 0x3C, | 638 // connection_id |
655 // connection_id | 639 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
656 0x10, 0x32, 0x54, 0x76, | 640 // packet sequence number |
657 0x98, 0xBA, 0xDC, 0xFE, | 641 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
658 // packet sequence number | 642 // private flags |
659 0xBC, 0x9A, 0x78, 0x56, | 643 0x00, |
660 0x34, 0x12, | |
661 // private flags | |
662 0x00, | |
663 }; | 644 }; |
664 | 645 |
665 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 646 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
666 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 647 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
667 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 648 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
668 ASSERT_TRUE(visitor_.header_.get()); | 649 ASSERT_TRUE(visitor_.header_.get()); |
669 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 650 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
670 visitor_.header_->public_header.connection_id); | 651 visitor_.header_->public_header.connection_id); |
671 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 652 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
672 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 653 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
673 EXPECT_FALSE(visitor_.header_->fec_flag); | 654 EXPECT_FALSE(visitor_.header_->fec_flag); |
674 EXPECT_FALSE(visitor_.header_->entropy_flag); | 655 EXPECT_FALSE(visitor_.header_->entropy_flag); |
675 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 656 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
676 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 657 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
677 visitor_.header_->packet_sequence_number); | 658 visitor_.header_->packet_sequence_number); |
678 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 659 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
679 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 660 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
680 | 661 |
681 // Now test framing boundaries | 662 // Now test framing boundaries |
682 for (size_t i = 0; | 663 for (size_t i = 0; i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
683 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 664 !kIncludeVersion, |
684 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 665 PACKET_6BYTE_SEQUENCE_NUMBER, |
| 666 NOT_IN_FEC_GROUP); |
685 ++i) { | 667 ++i) { |
686 string expected_error; | 668 string expected_error; |
687 if (i < kConnectionIdOffset) { | 669 if (i < kConnectionIdOffset) { |
688 expected_error = "Unable to read public flags."; | 670 expected_error = "Unable to read public flags."; |
689 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { | 671 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { |
690 expected_error = "Unable to read ConnectionId."; | 672 expected_error = "Unable to read ConnectionId."; |
691 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion)) { | 673 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion)) { |
692 expected_error = "Unable to read sequence number."; | 674 expected_error = "Unable to read sequence number."; |
693 } else if (i < GetFecGroupOffset(!kIncludeVersion)) { | 675 } else if (i < GetFecGroupOffset(!kIncludeVersion)) { |
694 expected_error = "Unable to read private flags."; | 676 expected_error = "Unable to read private flags."; |
695 } else { | 677 } else { |
696 expected_error = "Unable to read first fec protected packet offset."; | 678 expected_error = "Unable to read first fec protected packet offset."; |
697 } | 679 } |
698 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 680 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
699 } | 681 } |
700 } | 682 } |
701 | 683 |
702 TEST_P(QuicFramerTest, PacketHeaderWith4ByteConnectionId) { | 684 TEST_P(QuicFramerTest, PacketHeaderWith4ByteConnectionId) { |
703 QuicFramerPeer::SetLastSerializedConnectionId( | 685 QuicFramerPeer::SetLastSerializedConnectionId( |
704 &framer_, GG_UINT64_C(0xFEDCBA9876543210)); | 686 &framer_, GG_UINT64_C(0xFEDCBA9876543210)); |
705 | 687 |
706 unsigned char packet[] = { | 688 unsigned char packet[] = {// public flags (4 byte connection_id) |
707 // public flags (4 byte connection_id) | 689 0x38, |
708 0x38, | 690 // connection_id |
709 // connection_id | 691 0x10, 0x32, 0x54, 0x76, |
710 0x10, 0x32, 0x54, 0x76, | 692 // packet sequence number |
711 // packet sequence number | 693 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
712 0xBC, 0x9A, 0x78, 0x56, | 694 // private flags |
713 0x34, 0x12, | 695 0x00, |
714 // private flags | |
715 0x00, | |
716 }; | 696 }; |
717 | 697 |
718 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 698 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
719 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 699 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
720 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 700 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
721 ASSERT_TRUE(visitor_.header_.get()); | 701 ASSERT_TRUE(visitor_.header_.get()); |
722 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 702 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
723 visitor_.header_->public_header.connection_id); | 703 visitor_.header_->public_header.connection_id); |
724 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 704 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
725 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 705 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
726 EXPECT_FALSE(visitor_.header_->fec_flag); | 706 EXPECT_FALSE(visitor_.header_->fec_flag); |
727 EXPECT_FALSE(visitor_.header_->entropy_flag); | 707 EXPECT_FALSE(visitor_.header_->entropy_flag); |
728 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 708 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
729 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 709 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
730 visitor_.header_->packet_sequence_number); | 710 visitor_.header_->packet_sequence_number); |
731 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 711 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
732 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 712 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
733 | 713 |
734 // Now test framing boundaries | 714 // Now test framing boundaries |
735 for (size_t i = 0; | 715 for (size_t i = 0; i < GetPacketHeaderSize(PACKET_4BYTE_CONNECTION_ID, |
736 i < GetPacketHeaderSize(PACKET_4BYTE_CONNECTION_ID, !kIncludeVersion, | 716 !kIncludeVersion, |
737 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 717 PACKET_6BYTE_SEQUENCE_NUMBER, |
| 718 NOT_IN_FEC_GROUP); |
738 ++i) { | 719 ++i) { |
739 string expected_error; | 720 string expected_error; |
740 if (i < kConnectionIdOffset) { | 721 if (i < kConnectionIdOffset) { |
741 expected_error = "Unable to read public flags."; | 722 expected_error = "Unable to read public flags."; |
742 } else if (i < GetSequenceNumberOffset(PACKET_4BYTE_CONNECTION_ID, | 723 } else if (i < GetSequenceNumberOffset(PACKET_4BYTE_CONNECTION_ID, |
743 !kIncludeVersion)) { | 724 !kIncludeVersion)) { |
744 expected_error = "Unable to read ConnectionId."; | 725 expected_error = "Unable to read ConnectionId."; |
745 } else if (i < GetPrivateFlagsOffset(PACKET_4BYTE_CONNECTION_ID, | 726 } else if (i < GetPrivateFlagsOffset(PACKET_4BYTE_CONNECTION_ID, |
746 !kIncludeVersion)) { | 727 !kIncludeVersion)) { |
747 expected_error = "Unable to read sequence number."; | 728 expected_error = "Unable to read sequence number."; |
748 } else if (i < GetFecGroupOffset(PACKET_4BYTE_CONNECTION_ID, | 729 } else if (i < GetFecGroupOffset(PACKET_4BYTE_CONNECTION_ID, |
749 !kIncludeVersion)) { | 730 !kIncludeVersion)) { |
750 expected_error = "Unable to read private flags."; | 731 expected_error = "Unable to read private flags."; |
751 } else { | 732 } else { |
752 expected_error = "Unable to read first fec protected packet offset."; | 733 expected_error = "Unable to read first fec protected packet offset."; |
753 } | 734 } |
754 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 735 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
755 } | 736 } |
756 } | 737 } |
757 | 738 |
758 TEST_P(QuicFramerTest, PacketHeader1ByteConnectionId) { | 739 TEST_P(QuicFramerTest, PacketHeader1ByteConnectionId) { |
759 QuicFramerPeer::SetLastSerializedConnectionId( | 740 QuicFramerPeer::SetLastSerializedConnectionId( |
760 &framer_, GG_UINT64_C(0xFEDCBA9876543210)); | 741 &framer_, GG_UINT64_C(0xFEDCBA9876543210)); |
761 | 742 |
762 unsigned char packet[] = { | 743 unsigned char packet[] = {// public flags (1 byte connection_id) |
763 // public flags (1 byte connection_id) | 744 0x34, |
764 0x34, | 745 // connection_id |
765 // connection_id | 746 0x10, |
766 0x10, | 747 // packet sequence number |
767 // packet sequence number | 748 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
768 0xBC, 0x9A, 0x78, 0x56, | 749 // private flags |
769 0x34, 0x12, | 750 0x00, |
770 // private flags | |
771 0x00, | |
772 }; | 751 }; |
773 | 752 |
774 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 753 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
775 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 754 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
776 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 755 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
777 ASSERT_TRUE(visitor_.header_.get()); | 756 ASSERT_TRUE(visitor_.header_.get()); |
778 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 757 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
779 visitor_.header_->public_header.connection_id); | 758 visitor_.header_->public_header.connection_id); |
780 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 759 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
781 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 760 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
782 EXPECT_FALSE(visitor_.header_->fec_flag); | 761 EXPECT_FALSE(visitor_.header_->fec_flag); |
783 EXPECT_FALSE(visitor_.header_->entropy_flag); | 762 EXPECT_FALSE(visitor_.header_->entropy_flag); |
784 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 763 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
785 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 764 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
786 visitor_.header_->packet_sequence_number); | 765 visitor_.header_->packet_sequence_number); |
787 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 766 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
788 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 767 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
789 | 768 |
790 // Now test framing boundaries | 769 // Now test framing boundaries |
791 for (size_t i = 0; | 770 for (size_t i = 0; i < GetPacketHeaderSize(PACKET_1BYTE_CONNECTION_ID, |
792 i < GetPacketHeaderSize(PACKET_1BYTE_CONNECTION_ID, !kIncludeVersion, | 771 !kIncludeVersion, |
793 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 772 PACKET_6BYTE_SEQUENCE_NUMBER, |
| 773 NOT_IN_FEC_GROUP); |
794 ++i) { | 774 ++i) { |
795 string expected_error; | 775 string expected_error; |
796 if (i < kConnectionIdOffset) { | 776 if (i < kConnectionIdOffset) { |
797 expected_error = "Unable to read public flags."; | 777 expected_error = "Unable to read public flags."; |
798 } else if (i < GetSequenceNumberOffset(PACKET_1BYTE_CONNECTION_ID, | 778 } else if (i < GetSequenceNumberOffset(PACKET_1BYTE_CONNECTION_ID, |
799 !kIncludeVersion)) { | 779 !kIncludeVersion)) { |
800 expected_error = "Unable to read ConnectionId."; | 780 expected_error = "Unable to read ConnectionId."; |
801 } else if (i < GetPrivateFlagsOffset(PACKET_1BYTE_CONNECTION_ID, | 781 } else if (i < GetPrivateFlagsOffset(PACKET_1BYTE_CONNECTION_ID, |
802 !kIncludeVersion)) { | 782 !kIncludeVersion)) { |
803 expected_error = "Unable to read sequence number."; | 783 expected_error = "Unable to read sequence number."; |
804 } else if (i < GetFecGroupOffset(PACKET_1BYTE_CONNECTION_ID, | 784 } else if (i < GetFecGroupOffset(PACKET_1BYTE_CONNECTION_ID, |
805 !kIncludeVersion)) { | 785 !kIncludeVersion)) { |
806 expected_error = "Unable to read private flags."; | 786 expected_error = "Unable to read private flags."; |
807 } else { | 787 } else { |
808 expected_error = "Unable to read first fec protected packet offset."; | 788 expected_error = "Unable to read first fec protected packet offset."; |
809 } | 789 } |
810 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 790 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
811 } | 791 } |
812 } | 792 } |
813 | 793 |
814 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) { | 794 TEST_P(QuicFramerTest, PacketHeaderWith0ByteConnectionId) { |
815 QuicFramerPeer::SetLastSerializedConnectionId( | 795 QuicFramerPeer::SetLastSerializedConnectionId( |
816 &framer_, GG_UINT64_C(0xFEDCBA9876543210)); | 796 &framer_, GG_UINT64_C(0xFEDCBA9876543210)); |
817 | 797 |
818 unsigned char packet[] = { | 798 unsigned char packet[] = {// public flags (0 byte connection_id) |
819 // public flags (0 byte connection_id) | 799 0x30, |
820 0x30, | 800 // connection_id |
821 // connection_id | 801 // packet sequence number |
822 // packet sequence number | 802 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
823 0xBC, 0x9A, 0x78, 0x56, | 803 // private flags |
824 0x34, 0x12, | 804 0x00, |
825 // private flags | |
826 0x00, | |
827 }; | 805 }; |
828 | 806 |
829 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 807 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
830 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 808 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
831 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 809 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
832 ASSERT_TRUE(visitor_.header_.get()); | 810 ASSERT_TRUE(visitor_.header_.get()); |
833 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 811 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
834 visitor_.header_->public_header.connection_id); | 812 visitor_.header_->public_header.connection_id); |
835 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 813 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
836 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 814 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
837 EXPECT_FALSE(visitor_.header_->fec_flag); | 815 EXPECT_FALSE(visitor_.header_->fec_flag); |
838 EXPECT_FALSE(visitor_.header_->entropy_flag); | 816 EXPECT_FALSE(visitor_.header_->entropy_flag); |
839 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 817 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
840 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 818 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
841 visitor_.header_->packet_sequence_number); | 819 visitor_.header_->packet_sequence_number); |
842 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 820 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
843 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 821 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
844 | 822 |
845 // Now test framing boundaries | 823 // Now test framing boundaries |
846 for (size_t i = 0; | 824 for (size_t i = 0; i < GetPacketHeaderSize(PACKET_0BYTE_CONNECTION_ID, |
847 i < GetPacketHeaderSize(PACKET_0BYTE_CONNECTION_ID, !kIncludeVersion, | 825 !kIncludeVersion, |
848 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 826 PACKET_6BYTE_SEQUENCE_NUMBER, |
| 827 NOT_IN_FEC_GROUP); |
849 ++i) { | 828 ++i) { |
850 string expected_error; | 829 string expected_error; |
851 if (i < kConnectionIdOffset) { | 830 if (i < kConnectionIdOffset) { |
852 expected_error = "Unable to read public flags."; | 831 expected_error = "Unable to read public flags."; |
853 } else if (i < GetSequenceNumberOffset(PACKET_0BYTE_CONNECTION_ID, | 832 } else if (i < GetSequenceNumberOffset(PACKET_0BYTE_CONNECTION_ID, |
854 !kIncludeVersion)) { | 833 !kIncludeVersion)) { |
855 expected_error = "Unable to read ConnectionId."; | 834 expected_error = "Unable to read ConnectionId."; |
856 } else if (i < GetPrivateFlagsOffset(PACKET_0BYTE_CONNECTION_ID, | 835 } else if (i < GetPrivateFlagsOffset(PACKET_0BYTE_CONNECTION_ID, |
857 !kIncludeVersion)) { | 836 !kIncludeVersion)) { |
858 expected_error = "Unable to read sequence number."; | 837 expected_error = "Unable to read sequence number."; |
859 } else if (i < GetFecGroupOffset(PACKET_0BYTE_CONNECTION_ID, | 838 } else if (i < GetFecGroupOffset(PACKET_0BYTE_CONNECTION_ID, |
860 !kIncludeVersion)) { | 839 !kIncludeVersion)) { |
861 expected_error = "Unable to read private flags."; | 840 expected_error = "Unable to read private flags."; |
862 } else { | 841 } else { |
863 expected_error = "Unable to read first fec protected packet offset."; | 842 expected_error = "Unable to read first fec protected packet offset."; |
864 } | 843 } |
865 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 844 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
866 } | 845 } |
867 } | 846 } |
868 | 847 |
869 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) { | 848 TEST_P(QuicFramerTest, PacketHeaderWithVersionFlag) { |
870 unsigned char packet[] = { | 849 unsigned char packet[] = { |
871 // public flags (version) | 850 // public flags (version) |
872 0x3D, | 851 0x3D, |
873 // connection_id | 852 // connection_id |
874 0x10, 0x32, 0x54, 0x76, | 853 0x10, 0x32, 0x54, 0x76, |
875 0x98, 0xBA, 0xDC, 0xFE, | 854 0x98, 0xBA, 0xDC, 0xFE, |
876 // version tag | 855 // version tag |
877 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 856 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
878 // packet sequence number | 857 // packet sequence number |
879 0xBC, 0x9A, 0x78, 0x56, | 858 0xBC, 0x9A, 0x78, 0x56, |
880 0x34, 0x12, | 859 0x34, 0x12, |
881 // private flags | 860 // private flags |
882 0x00, | 861 0x00, |
883 }; | 862 }; |
884 | 863 |
885 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 864 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
886 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 865 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
887 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 866 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
888 ASSERT_TRUE(visitor_.header_.get()); | 867 ASSERT_TRUE(visitor_.header_.get()); |
889 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 868 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
890 visitor_.header_->public_header.connection_id); | 869 visitor_.header_->public_header.connection_id); |
891 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 870 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
892 EXPECT_TRUE(visitor_.header_->public_header.version_flag); | 871 EXPECT_TRUE(visitor_.header_->public_header.version_flag); |
893 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]); | 872 EXPECT_EQ(GetParam(), visitor_.header_->public_header.versions[0]); |
894 EXPECT_FALSE(visitor_.header_->fec_flag); | 873 EXPECT_FALSE(visitor_.header_->fec_flag); |
895 EXPECT_FALSE(visitor_.header_->entropy_flag); | 874 EXPECT_FALSE(visitor_.header_->entropy_flag); |
896 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 875 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
897 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 876 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
898 visitor_.header_->packet_sequence_number); | 877 visitor_.header_->packet_sequence_number); |
899 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 878 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
900 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 879 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
901 | 880 |
902 // Now test framing boundaries | 881 // Now test framing boundaries |
903 for (size_t i = 0; | 882 for (size_t i = 0; i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
904 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, | 883 kIncludeVersion, |
905 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 884 PACKET_6BYTE_SEQUENCE_NUMBER, |
| 885 NOT_IN_FEC_GROUP); |
906 ++i) { | 886 ++i) { |
907 string expected_error; | 887 string expected_error; |
908 if (i < kConnectionIdOffset) { | 888 if (i < kConnectionIdOffset) { |
909 expected_error = "Unable to read public flags."; | 889 expected_error = "Unable to read public flags."; |
910 } else if (i < kVersionOffset) { | 890 } else if (i < kVersionOffset) { |
911 expected_error = "Unable to read ConnectionId."; | 891 expected_error = "Unable to read ConnectionId."; |
912 } else if (i < GetSequenceNumberOffset(kIncludeVersion)) { | 892 } else if (i < GetSequenceNumberOffset(kIncludeVersion)) { |
913 expected_error = "Unable to read protocol version."; | 893 expected_error = "Unable to read protocol version."; |
914 } else if (i < GetPrivateFlagsOffset(kIncludeVersion)) { | 894 } else if (i < GetPrivateFlagsOffset(kIncludeVersion)) { |
915 expected_error = "Unable to read sequence number."; | 895 expected_error = "Unable to read sequence number."; |
916 } else if (i < GetFecGroupOffset(kIncludeVersion)) { | 896 } else if (i < GetFecGroupOffset(kIncludeVersion)) { |
917 expected_error = "Unable to read private flags."; | 897 expected_error = "Unable to read private flags."; |
918 } else { | 898 } else { |
919 expected_error = "Unable to read first fec protected packet offset."; | 899 expected_error = "Unable to read first fec protected packet offset."; |
920 } | 900 } |
921 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 901 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
922 } | 902 } |
923 } | 903 } |
924 | 904 |
925 TEST_P(QuicFramerTest, PacketHeaderWith4ByteSequenceNumber) { | 905 TEST_P(QuicFramerTest, PacketHeaderWith4ByteSequenceNumber) { |
926 QuicFramerPeer::SetLastSequenceNumber(&framer_, | 906 QuicFramerPeer::SetLastSequenceNumber(&framer_, GG_UINT64_C(0x123456789ABA)); |
927 GG_UINT64_C(0x123456789ABA)); | |
928 | 907 |
929 unsigned char packet[] = { | 908 unsigned char packet[] = { |
930 // public flags (8 byte connection_id and 4 byte sequence number) | 909 // public flags (8 byte connection_id and 4 byte sequence number) |
931 0x2C, | 910 0x2C, |
932 // connection_id | 911 // connection_id |
933 0x10, 0x32, 0x54, 0x76, | 912 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
934 0x98, 0xBA, 0xDC, 0xFE, | 913 // packet sequence number |
935 // packet sequence number | 914 0xBC, 0x9A, 0x78, 0x56, |
936 0xBC, 0x9A, 0x78, 0x56, | 915 // private flags |
937 // private flags | 916 0x00, |
938 0x00, | |
939 }; | 917 }; |
940 | 918 |
941 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 919 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
942 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 920 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
943 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 921 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
944 ASSERT_TRUE(visitor_.header_.get()); | 922 ASSERT_TRUE(visitor_.header_.get()); |
945 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 923 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
946 visitor_.header_->public_header.connection_id); | 924 visitor_.header_->public_header.connection_id); |
947 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 925 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
948 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 926 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
949 EXPECT_FALSE(visitor_.header_->fec_flag); | 927 EXPECT_FALSE(visitor_.header_->fec_flag); |
950 EXPECT_FALSE(visitor_.header_->entropy_flag); | 928 EXPECT_FALSE(visitor_.header_->entropy_flag); |
951 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 929 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
952 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 930 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
953 visitor_.header_->packet_sequence_number); | 931 visitor_.header_->packet_sequence_number); |
954 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 932 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
955 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 933 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
956 | 934 |
957 // Now test framing boundaries | 935 // Now test framing boundaries |
958 for (size_t i = 0; | 936 for (size_t i = 0; i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
959 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 937 !kIncludeVersion, |
960 PACKET_4BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 938 PACKET_4BYTE_SEQUENCE_NUMBER, |
| 939 NOT_IN_FEC_GROUP); |
961 ++i) { | 940 ++i) { |
962 string expected_error; | 941 string expected_error; |
963 if (i < kConnectionIdOffset) { | 942 if (i < kConnectionIdOffset) { |
964 expected_error = "Unable to read public flags."; | 943 expected_error = "Unable to read public flags."; |
965 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { | 944 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { |
966 expected_error = "Unable to read ConnectionId."; | 945 expected_error = "Unable to read ConnectionId."; |
967 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, | 946 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, |
968 PACKET_4BYTE_SEQUENCE_NUMBER)) { | 947 PACKET_4BYTE_SEQUENCE_NUMBER)) { |
969 expected_error = "Unable to read sequence number."; | 948 expected_error = "Unable to read sequence number."; |
970 } else if (i < GetFecGroupOffset(!kIncludeVersion, | 949 } else if (i < GetFecGroupOffset(!kIncludeVersion, |
971 PACKET_4BYTE_SEQUENCE_NUMBER)) { | 950 PACKET_4BYTE_SEQUENCE_NUMBER)) { |
972 expected_error = "Unable to read private flags."; | 951 expected_error = "Unable to read private flags."; |
973 } else { | 952 } else { |
974 expected_error = "Unable to read first fec protected packet offset."; | 953 expected_error = "Unable to read first fec protected packet offset."; |
975 } | 954 } |
976 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 955 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
977 } | 956 } |
978 } | 957 } |
979 | 958 |
980 TEST_P(QuicFramerTest, PacketHeaderWith2ByteSequenceNumber) { | 959 TEST_P(QuicFramerTest, PacketHeaderWith2ByteSequenceNumber) { |
981 QuicFramerPeer::SetLastSequenceNumber(&framer_, | 960 QuicFramerPeer::SetLastSequenceNumber(&framer_, GG_UINT64_C(0x123456789ABA)); |
982 GG_UINT64_C(0x123456789ABA)); | |
983 | 961 |
984 unsigned char packet[] = { | 962 unsigned char packet[] = { |
985 // public flags (8 byte connection_id and 2 byte sequence number) | 963 // public flags (8 byte connection_id and 2 byte sequence number) |
986 0x1C, | 964 0x1C, |
987 // connection_id | 965 // connection_id |
988 0x10, 0x32, 0x54, 0x76, | 966 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
989 0x98, 0xBA, 0xDC, 0xFE, | 967 // packet sequence number |
990 // packet sequence number | 968 0xBC, 0x9A, |
991 0xBC, 0x9A, | 969 // private flags |
992 // private flags | 970 0x00, |
993 0x00, | |
994 }; | 971 }; |
995 | 972 |
996 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 973 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
997 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 974 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
998 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 975 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
999 ASSERT_TRUE(visitor_.header_.get()); | 976 ASSERT_TRUE(visitor_.header_.get()); |
1000 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 977 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
1001 visitor_.header_->public_header.connection_id); | 978 visitor_.header_->public_header.connection_id); |
1002 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 979 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
1003 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 980 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
1004 EXPECT_FALSE(visitor_.header_->fec_flag); | 981 EXPECT_FALSE(visitor_.header_->fec_flag); |
1005 EXPECT_FALSE(visitor_.header_->entropy_flag); | 982 EXPECT_FALSE(visitor_.header_->entropy_flag); |
1006 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 983 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
1007 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 984 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
1008 visitor_.header_->packet_sequence_number); | 985 visitor_.header_->packet_sequence_number); |
1009 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 986 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
1010 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 987 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
1011 | 988 |
1012 // Now test framing boundaries | 989 // Now test framing boundaries |
1013 for (size_t i = 0; | 990 for (size_t i = 0; i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
1014 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 991 !kIncludeVersion, |
1015 PACKET_2BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 992 PACKET_2BYTE_SEQUENCE_NUMBER, |
| 993 NOT_IN_FEC_GROUP); |
1016 ++i) { | 994 ++i) { |
1017 string expected_error; | 995 string expected_error; |
1018 if (i < kConnectionIdOffset) { | 996 if (i < kConnectionIdOffset) { |
1019 expected_error = "Unable to read public flags."; | 997 expected_error = "Unable to read public flags."; |
1020 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { | 998 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { |
1021 expected_error = "Unable to read ConnectionId."; | 999 expected_error = "Unable to read ConnectionId."; |
1022 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, | 1000 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, |
1023 PACKET_2BYTE_SEQUENCE_NUMBER)) { | 1001 PACKET_2BYTE_SEQUENCE_NUMBER)) { |
1024 expected_error = "Unable to read sequence number."; | 1002 expected_error = "Unable to read sequence number."; |
1025 } else if (i < GetFecGroupOffset(!kIncludeVersion, | 1003 } else if (i < GetFecGroupOffset(!kIncludeVersion, |
1026 PACKET_2BYTE_SEQUENCE_NUMBER)) { | 1004 PACKET_2BYTE_SEQUENCE_NUMBER)) { |
1027 expected_error = "Unable to read private flags."; | 1005 expected_error = "Unable to read private flags."; |
1028 } else { | 1006 } else { |
1029 expected_error = "Unable to read first fec protected packet offset."; | 1007 expected_error = "Unable to read first fec protected packet offset."; |
1030 } | 1008 } |
1031 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 1009 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
1032 } | 1010 } |
1033 } | 1011 } |
1034 | 1012 |
1035 TEST_P(QuicFramerTest, PacketHeaderWith1ByteSequenceNumber) { | 1013 TEST_P(QuicFramerTest, PacketHeaderWith1ByteSequenceNumber) { |
1036 QuicFramerPeer::SetLastSequenceNumber(&framer_, | 1014 QuicFramerPeer::SetLastSequenceNumber(&framer_, GG_UINT64_C(0x123456789ABA)); |
1037 GG_UINT64_C(0x123456789ABA)); | |
1038 | 1015 |
1039 unsigned char packet[] = { | 1016 unsigned char packet[] = { |
1040 // public flags (8 byte connection_id and 1 byte sequence number) | 1017 // public flags (8 byte connection_id and 1 byte sequence number) |
1041 0x0C, | 1018 0x0C, |
1042 // connection_id | 1019 // connection_id |
1043 0x10, 0x32, 0x54, 0x76, | 1020 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1044 0x98, 0xBA, 0xDC, 0xFE, | 1021 // packet sequence number |
1045 // packet sequence number | 1022 0xBC, |
1046 0xBC, | 1023 // private flags |
1047 // private flags | 1024 0x00, |
1048 0x00, | |
1049 }; | 1025 }; |
1050 | 1026 |
1051 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1027 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1052 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 1028 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
1053 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | 1029 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); |
1054 ASSERT_TRUE(visitor_.header_.get()); | 1030 ASSERT_TRUE(visitor_.header_.get()); |
1055 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 1031 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
1056 visitor_.header_->public_header.connection_id); | 1032 visitor_.header_->public_header.connection_id); |
1057 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 1033 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
1058 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 1034 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
1059 EXPECT_FALSE(visitor_.header_->fec_flag); | 1035 EXPECT_FALSE(visitor_.header_->fec_flag); |
1060 EXPECT_FALSE(visitor_.header_->entropy_flag); | 1036 EXPECT_FALSE(visitor_.header_->entropy_flag); |
1061 EXPECT_EQ(0, visitor_.header_->entropy_hash); | 1037 EXPECT_EQ(0, visitor_.header_->entropy_hash); |
1062 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 1038 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
1063 visitor_.header_->packet_sequence_number); | 1039 visitor_.header_->packet_sequence_number); |
1064 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 1040 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
1065 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 1041 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
1066 | 1042 |
1067 // Now test framing boundaries | 1043 // Now test framing boundaries |
1068 for (size_t i = 0; | 1044 for (size_t i = 0; i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
1069 i < GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 1045 !kIncludeVersion, |
1070 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 1046 PACKET_1BYTE_SEQUENCE_NUMBER, |
| 1047 NOT_IN_FEC_GROUP); |
1071 ++i) { | 1048 ++i) { |
1072 string expected_error; | 1049 string expected_error; |
1073 if (i < kConnectionIdOffset) { | 1050 if (i < kConnectionIdOffset) { |
1074 expected_error = "Unable to read public flags."; | 1051 expected_error = "Unable to read public flags."; |
1075 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { | 1052 } else if (i < GetSequenceNumberOffset(!kIncludeVersion)) { |
1076 expected_error = "Unable to read ConnectionId."; | 1053 expected_error = "Unable to read ConnectionId."; |
1077 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, | 1054 } else if (i < GetPrivateFlagsOffset(!kIncludeVersion, |
1078 PACKET_1BYTE_SEQUENCE_NUMBER)) { | 1055 PACKET_1BYTE_SEQUENCE_NUMBER)) { |
1079 expected_error = "Unable to read sequence number."; | 1056 expected_error = "Unable to read sequence number."; |
1080 } else if (i < GetFecGroupOffset(!kIncludeVersion, | 1057 } else if (i < GetFecGroupOffset(!kIncludeVersion, |
1081 PACKET_1BYTE_SEQUENCE_NUMBER)) { | 1058 PACKET_1BYTE_SEQUENCE_NUMBER)) { |
1082 expected_error = "Unable to read private flags."; | 1059 expected_error = "Unable to read private flags."; |
1083 } else { | 1060 } else { |
1084 expected_error = "Unable to read first fec protected packet offset."; | 1061 expected_error = "Unable to read first fec protected packet offset."; |
1085 } | 1062 } |
1086 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 1063 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
1087 } | 1064 } |
1088 } | 1065 } |
1089 | 1066 |
1090 TEST_P(QuicFramerTest, InvalidPublicFlag) { | 1067 TEST_P(QuicFramerTest, InvalidPublicFlag) { |
1091 unsigned char packet[] = { | 1068 unsigned char packet[] = { |
1092 // public flags: all flags set but the public reset flag and version flag. | 1069 // public flags: all flags set but the public reset flag and version flag. |
1093 0xFC, | 1070 0xFC, |
1094 // connection_id | 1071 // connection_id |
1095 0x10, 0x32, 0x54, 0x76, | 1072 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1096 0x98, 0xBA, 0xDC, 0xFE, | 1073 // packet sequence number |
1097 // packet sequence number | 1074 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1098 0xBC, 0x9A, 0x78, 0x56, | 1075 // private flags |
1099 0x34, 0x12, | 1076 0x00, |
1100 // private flags | |
1101 0x00, | |
1102 | 1077 |
1103 // frame type (padding) | 1078 // frame type (padding) |
1104 0x00, | 1079 0x00, 0x00, 0x00, 0x00, 0x00}; |
1105 0x00, 0x00, 0x00, 0x00 | |
1106 }; | |
1107 CheckProcessingFails(packet, | 1080 CheckProcessingFails(packet, |
1108 arraysize(packet), | 1081 arraysize(packet), |
1109 "Illegal public flags value.", | 1082 "Illegal public flags value.", |
1110 QUIC_INVALID_PACKET_HEADER); | 1083 QUIC_INVALID_PACKET_HEADER); |
1111 | 1084 |
1112 // Now turn off validation. | 1085 // Now turn off validation. |
1113 framer_.set_validate_flags(false); | 1086 framer_.set_validate_flags(false); |
1114 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1087 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1115 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1088 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1116 }; | 1089 }; |
1117 | 1090 |
1118 TEST_P(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) { | 1091 TEST_P(QuicFramerTest, InvalidPublicFlagWithMatchingVersions) { |
1119 unsigned char packet[] = { | 1092 unsigned char packet[] = { |
1120 // public flags (8 byte connection_id and version flag and an unknown flag) | 1093 // public flags (8 byte connection_id and version flag and an unknown |
1121 0x4D, | 1094 // flag) |
1122 // connection_id | 1095 0x4D, |
1123 0x10, 0x32, 0x54, 0x76, | 1096 // connection_id |
1124 0x98, 0xBA, 0xDC, 0xFE, | 1097 0x10, 0x32, 0x54, 0x76, 0x98, 0x
BA, |
1125 // version tag | 1098 0xDC, 0xFE, |
1126 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 1099 // version tag |
1127 // packet sequence number | 1100 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
1128 0xBC, 0x9A, 0x78, 0x56, | 1101 // packet sequence number |
1129 0x34, 0x12, | 1102 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x
12, |
1130 // private flags | 1103 // private flags |
1131 0x00, | 1104 0x00, |
1132 | 1105 |
1133 // frame type (padding) | 1106 // frame type (padding) |
1134 0x00, | 1107 0x00, 0x00, 0x00, 0x00, 0x00}; |
1135 0x00, 0x00, 0x00, 0x00 | |
1136 }; | |
1137 CheckProcessingFails(packet, | 1108 CheckProcessingFails(packet, |
1138 arraysize(packet), | 1109 arraysize(packet), |
1139 "Illegal public flags value.", | 1110 "Illegal public flags value.", |
1140 QUIC_INVALID_PACKET_HEADER); | 1111 QUIC_INVALID_PACKET_HEADER); |
1141 }; | 1112 }; |
1142 | 1113 |
1143 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { | 1114 TEST_P(QuicFramerTest, LargePublicFlagWithMismatchedVersions) { |
1144 unsigned char packet[] = { | 1115 unsigned char packet[] = { |
1145 // public flags (8 byte connection_id, version flag and an unknown flag) | 1116 // public flags (8 byte connection_id, version flag and an unknown flag) |
1146 0x7D, | 1117 0x7D, |
1147 // connection_id | 1118 // connection_id |
1148 0x10, 0x32, 0x54, 0x76, | 1119 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1149 0x98, 0xBA, 0xDC, 0xFE, | 1120 // version tag |
1150 // version tag | 1121 'Q', '0', '0', '0', |
1151 'Q', '0', '0', '0', | 1122 // packet sequence number |
1152 // packet sequence number | 1123 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1153 0xBC, 0x9A, 0x78, 0x56, | 1124 // private flags |
1154 0x34, 0x12, | 1125 0x00, |
1155 // private flags | |
1156 0x00, | |
1157 | 1126 |
1158 // frame type (padding frame) | 1127 // frame type (padding frame) |
1159 0x00, | 1128 0x00, 0x00, 0x00, 0x00, 0x00}; |
1160 0x00, 0x00, 0x00, 0x00 | |
1161 }; | |
1162 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1129 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1163 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1130 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1164 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1131 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1165 ASSERT_TRUE(visitor_.header_.get()); | 1132 ASSERT_TRUE(visitor_.header_.get()); |
1166 EXPECT_EQ(0, visitor_.frame_count_); | 1133 EXPECT_EQ(0, visitor_.frame_count_); |
1167 EXPECT_EQ(1, visitor_.version_mismatch_); | 1134 EXPECT_EQ(1, visitor_.version_mismatch_); |
1168 }; | 1135 }; |
1169 | 1136 |
1170 TEST_P(QuicFramerTest, InvalidPrivateFlag) { | 1137 TEST_P(QuicFramerTest, InvalidPrivateFlag) { |
1171 unsigned char packet[] = { | 1138 unsigned char packet[] = {// public flags (8 byte connection_id) |
1172 // public flags (8 byte connection_id) | 1139 0x3C, |
1173 0x3C, | 1140 // connection_id |
1174 // connection_id | 1141 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1175 0x10, 0x32, 0x54, 0x76, | 1142 // packet sequence number |
1176 0x98, 0xBA, 0xDC, 0xFE, | 1143 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1177 // packet sequence number | 1144 // private flags |
1178 0xBC, 0x9A, 0x78, 0x56, | 1145 0x10, |
1179 0x34, 0x12, | |
1180 // private flags | |
1181 0x10, | |
1182 | 1146 |
1183 // frame type (padding) | 1147 // frame type (padding) |
1184 0x00, | 1148 0x00, 0x00, 0x00, 0x00, 0x00}; |
1185 0x00, 0x00, 0x00, 0x00 | |
1186 }; | |
1187 CheckProcessingFails(packet, | 1149 CheckProcessingFails(packet, |
1188 arraysize(packet), | 1150 arraysize(packet), |
1189 "Illegal private flags value.", | 1151 "Illegal private flags value.", |
1190 QUIC_INVALID_PACKET_HEADER); | 1152 QUIC_INVALID_PACKET_HEADER); |
1191 }; | 1153 }; |
1192 | 1154 |
1193 TEST_P(QuicFramerTest, InvalidFECGroupOffset) { | 1155 TEST_P(QuicFramerTest, InvalidFECGroupOffset) { |
1194 unsigned char packet[] = { | 1156 unsigned char packet[] = {// public flags (8 byte connection_id) |
1195 // public flags (8 byte connection_id) | 1157 0x3C, |
1196 0x3C, | 1158 // connection_id |
1197 // connection_id | 1159 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1198 0x10, 0x32, 0x54, 0x76, | 1160 // packet sequence number |
1199 0x98, 0xBA, 0xDC, 0xFE, | 1161 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, |
1200 // packet sequence number | 1162 // private flags (fec group) |
1201 0x01, 0x00, 0x00, 0x00, | 1163 0x02, |
1202 0x00, 0x00, | 1164 // first fec protected packet offset |
1203 // private flags (fec group) | 1165 0x10}; |
1204 0x02, | |
1205 // first fec protected packet offset | |
1206 0x10 | |
1207 }; | |
1208 CheckProcessingFails(packet, | 1166 CheckProcessingFails(packet, |
1209 arraysize(packet), | 1167 arraysize(packet), |
1210 "First fec protected packet offset must be less " | 1168 "First fec protected packet offset must be less " |
1211 "than the sequence number.", | 1169 "than the sequence number.", |
1212 QUIC_INVALID_PACKET_HEADER); | 1170 QUIC_INVALID_PACKET_HEADER); |
1213 }; | 1171 }; |
1214 | 1172 |
1215 TEST_P(QuicFramerTest, PaddingFrame) { | 1173 TEST_P(QuicFramerTest, PaddingFrame) { |
1216 unsigned char packet[] = { | 1174 unsigned char packet[] = { |
1217 // public flags (8 byte connection_id) | 1175 // public flags (8 byte connection_id) |
1218 0x3C, | 1176 0x3C, |
1219 // connection_id | 1177 // connection_id |
1220 0x10, 0x32, 0x54, 0x76, | 1178 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1221 0x98, 0xBA, 0xDC, 0xFE, | 1179 // packet sequence number |
1222 // packet sequence number | 1180 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1223 0xBC, 0x9A, 0x78, 0x56, | 1181 // private flags |
1224 0x34, 0x12, | 1182 0x00, |
1225 // private flags | |
1226 0x00, | |
1227 | 1183 |
1228 // frame type (padding frame) | 1184 // frame type (padding frame) |
1229 0x00, | 1185 0x00, |
1230 // Ignored data (which in this case is a stream frame) | 1186 // Ignored data (which in this case is a stream frame) |
1231 // frame type (stream frame with fin) | 1187 // frame type (stream frame with fin) |
1232 0xFF, | 1188 0xFF, |
1233 // stream id | 1189 // stream id |
1234 0x04, 0x03, 0x02, 0x01, | 1190 0x04, 0x03, 0x02, 0x01, |
1235 // offset | 1191 // offset |
1236 0x54, 0x76, 0x10, 0x32, | 1192 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
1237 0xDC, 0xFE, 0x98, 0xBA, | 1193 // data length |
1238 // data length | 1194 0x0c, 0x00, |
1239 0x0c, 0x00, | 1195 // data |
1240 // data | 1196 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', |
1241 'h', 'e', 'l', 'l', | |
1242 'o', ' ', 'w', 'o', | |
1243 'r', 'l', 'd', '!', | |
1244 }; | 1197 }; |
1245 | 1198 |
1246 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1199 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1247 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1200 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1248 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1201 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1249 ASSERT_TRUE(visitor_.header_.get()); | 1202 ASSERT_TRUE(visitor_.header_.get()); |
1250 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1203 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1251 | 1204 |
1252 ASSERT_EQ(0u, visitor_.stream_frames_.size()); | 1205 ASSERT_EQ(0u, visitor_.stream_frames_.size()); |
1253 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1206 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1254 // A packet with no frames is not acceptable. | 1207 // A packet with no frames is not acceptable. |
1255 CheckProcessingFails( | 1208 CheckProcessingFails(packet, |
1256 packet, | 1209 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
1257 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 1210 !kIncludeVersion, |
1258 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1211 PACKET_6BYTE_SEQUENCE_NUMBER, |
1259 "Packet has no frames.", QUIC_MISSING_PAYLOAD); | 1212 NOT_IN_FEC_GROUP), |
| 1213 "Packet has no frames.", |
| 1214 QUIC_MISSING_PAYLOAD); |
1260 } | 1215 } |
1261 | 1216 |
1262 TEST_P(QuicFramerTest, StreamFrame) { | 1217 TEST_P(QuicFramerTest, StreamFrame) { |
1263 unsigned char packet[] = { | 1218 unsigned char packet[] = {// public flags (8 byte connection_id) |
1264 // public flags (8 byte connection_id) | 1219 0x3C, |
1265 0x3C, | 1220 // connection_id |
1266 // connection_id | 1221 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1267 0x10, 0x32, 0x54, 0x76, | 1222 // packet sequence number |
1268 0x98, 0xBA, 0xDC, 0xFE, | 1223 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1269 // packet sequence number | 1224 // private flags |
1270 0xBC, 0x9A, 0x78, 0x56, | 1225 0x00, |
1271 0x34, 0x12, | |
1272 // private flags | |
1273 0x00, | |
1274 | 1226 |
1275 // frame type (stream frame with fin) | 1227 // frame type (stream frame with fin) |
1276 0xFF, | 1228 0xFF, |
1277 // stream id | 1229 // stream id |
1278 0x04, 0x03, 0x02, 0x01, | 1230 0x04, 0x03, 0x02, 0x01, |
1279 // offset | 1231 // offset |
1280 0x54, 0x76, 0x10, 0x32, | 1232 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
1281 0xDC, 0xFE, 0x98, 0xBA, | 1233 // data length |
1282 // data length | 1234 0x0c, 0x00, |
1283 0x0c, 0x00, | 1235 // data |
1284 // data | 1236 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', |
1285 'h', 'e', 'l', 'l', | 1237 'r', 'l', 'd', '!', |
1286 'o', ' ', 'w', 'o', | |
1287 'r', 'l', 'd', '!', | |
1288 }; | 1238 }; |
1289 | 1239 |
1290 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1240 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1291 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1241 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1292 | 1242 |
1293 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1243 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1294 ASSERT_TRUE(visitor_.header_.get()); | 1244 ASSERT_TRUE(visitor_.header_.get()); |
1295 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1245 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1296 | 1246 |
1297 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1247 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1298 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1248 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1299 EXPECT_EQ(static_cast<uint64>(0x01020304), | 1249 EXPECT_EQ(static_cast<uint64>(0x01020304), |
1300 visitor_.stream_frames_[0]->stream_id); | 1250 visitor_.stream_frames_[0]->stream_id); |
1301 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1251 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1302 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1252 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1303 visitor_.stream_frames_[0]->offset); | 1253 visitor_.stream_frames_[0]->offset); |
1304 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1254 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1305 | 1255 |
1306 // Now test framing boundaries | 1256 // Now test framing boundaries |
1307 CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, !kIncludeVersion); | 1257 CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, !kIncludeVersion); |
1308 } | 1258 } |
1309 | 1259 |
1310 TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) { | 1260 TEST_P(QuicFramerTest, StreamFrame3ByteStreamId) { |
1311 unsigned char packet[] = { | 1261 unsigned char packet[] = {// public flags (8 byte connection_id) |
1312 // public flags (8 byte connection_id) | 1262 0x3C, |
1313 0x3C, | 1263 // connection_id |
1314 // connection_id | 1264 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1315 0x10, 0x32, 0x54, 0x76, | 1265 // packet sequence number |
1316 0x98, 0xBA, 0xDC, 0xFE, | 1266 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1317 // packet sequence number | 1267 // private flags |
1318 0xBC, 0x9A, 0x78, 0x56, | 1268 0x00, |
1319 0x34, 0x12, | |
1320 // private flags | |
1321 0x00, | |
1322 | 1269 |
1323 // frame type (stream frame with fin) | 1270 // frame type (stream frame with fin) |
1324 0xFE, | 1271 0xFE, |
1325 // stream id | 1272 // stream id |
1326 0x04, 0x03, 0x02, | 1273 0x04, 0x03, 0x02, |
1327 // offset | 1274 // offset |
1328 0x54, 0x76, 0x10, 0x32, | 1275 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
1329 0xDC, 0xFE, 0x98, 0xBA, | 1276 // data length |
1330 // data length | 1277 0x0c, 0x00, |
1331 0x0c, 0x00, | 1278 // data |
1332 // data | 1279 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', |
1333 'h', 'e', 'l', 'l', | 1280 'r', 'l', 'd', '!', |
1334 'o', ' ', 'w', 'o', | |
1335 'r', 'l', 'd', '!', | |
1336 }; | 1281 }; |
1337 | 1282 |
1338 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1283 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1339 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1284 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1340 | 1285 |
1341 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1286 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1342 ASSERT_TRUE(visitor_.header_.get()); | 1287 ASSERT_TRUE(visitor_.header_.get()); |
1343 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1288 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1344 | 1289 |
1345 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1290 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1346 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1291 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1347 EXPECT_EQ(GG_UINT64_C(0x00020304), | 1292 EXPECT_EQ(GG_UINT64_C(0x00020304), visitor_.stream_frames_[0]->stream_id); |
1348 visitor_.stream_frames_[0]->stream_id); | |
1349 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1293 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1350 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1294 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1351 visitor_.stream_frames_[0]->offset); | 1295 visitor_.stream_frames_[0]->offset); |
1352 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1296 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1353 | 1297 |
1354 // Now test framing boundaries | 1298 // Now test framing boundaries |
1355 const size_t stream_id_size = 3; | 1299 const size_t stream_id_size = 3; |
1356 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); | 1300 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); |
1357 } | 1301 } |
1358 | 1302 |
1359 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) { | 1303 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) { |
1360 unsigned char packet[] = { | 1304 unsigned char packet[] = {// public flags (8 byte connection_id) |
1361 // public flags (8 byte connection_id) | 1305 0x3C, |
1362 0x3C, | 1306 // connection_id |
1363 // connection_id | 1307 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1364 0x10, 0x32, 0x54, 0x76, | 1308 // packet sequence number |
1365 0x98, 0xBA, 0xDC, 0xFE, | 1309 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1366 // packet sequence number | 1310 // private flags |
1367 0xBC, 0x9A, 0x78, 0x56, | 1311 0x00, |
1368 0x34, 0x12, | |
1369 // private flags | |
1370 0x00, | |
1371 | 1312 |
1372 // frame type (stream frame with fin) | 1313 // frame type (stream frame with fin) |
1373 0xFD, | 1314 0xFD, |
1374 // stream id | 1315 // stream id |
1375 0x04, 0x03, | 1316 0x04, 0x03, |
1376 // offset | 1317 // offset |
1377 0x54, 0x76, 0x10, 0x32, | 1318 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
1378 0xDC, 0xFE, 0x98, 0xBA, | 1319 // data length |
1379 // data length | 1320 0x0c, 0x00, |
1380 0x0c, 0x00, | 1321 // data |
1381 // data | 1322 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', |
1382 'h', 'e', 'l', 'l', | 1323 'r', 'l', 'd', '!', |
1383 'o', ' ', 'w', 'o', | |
1384 'r', 'l', 'd', '!', | |
1385 }; | 1324 }; |
1386 | 1325 |
1387 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1326 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1388 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1327 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1389 | 1328 |
1390 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1329 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1391 ASSERT_TRUE(visitor_.header_.get()); | 1330 ASSERT_TRUE(visitor_.header_.get()); |
1392 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1331 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1393 | 1332 |
1394 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1333 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1395 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1334 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1396 EXPECT_EQ(static_cast<uint64>(0x00000304), | 1335 EXPECT_EQ(static_cast<uint64>(0x00000304), |
1397 visitor_.stream_frames_[0]->stream_id); | 1336 visitor_.stream_frames_[0]->stream_id); |
1398 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1337 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1399 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1338 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1400 visitor_.stream_frames_[0]->offset); | 1339 visitor_.stream_frames_[0]->offset); |
1401 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1340 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1402 | 1341 |
1403 // Now test framing boundaries | 1342 // Now test framing boundaries |
1404 const size_t stream_id_size = 2; | 1343 const size_t stream_id_size = 2; |
1405 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); | 1344 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); |
1406 } | 1345 } |
1407 | 1346 |
1408 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) { | 1347 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) { |
1409 unsigned char packet[] = { | 1348 unsigned char packet[] = {// public flags (8 byte connection_id) |
1410 // public flags (8 byte connection_id) | 1349 0x3C, |
1411 0x3C, | 1350 // connection_id |
1412 // connection_id | 1351 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1413 0x10, 0x32, 0x54, 0x76, | 1352 // packet sequence number |
1414 0x98, 0xBA, 0xDC, 0xFE, | 1353 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1415 // packet sequence number | 1354 // private flags |
1416 0xBC, 0x9A, 0x78, 0x56, | 1355 0x00, |
1417 0x34, 0x12, | |
1418 // private flags | |
1419 0x00, | |
1420 | 1356 |
1421 // frame type (stream frame with fin) | 1357 // frame type (stream frame with fin) |
1422 0xFC, | 1358 0xFC, |
1423 // stream id | 1359 // stream id |
1424 0x04, | 1360 0x04, |
1425 // offset | 1361 // offset |
1426 0x54, 0x76, 0x10, 0x32, | 1362 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
1427 0xDC, 0xFE, 0x98, 0xBA, | 1363 // data length |
1428 // data length | 1364 0x0c, 0x00, |
1429 0x0c, 0x00, | 1365 // data |
1430 // data | 1366 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', |
1431 'h', 'e', 'l', 'l', | 1367 'r', 'l', 'd', '!', |
1432 'o', ' ', 'w', 'o', | |
1433 'r', 'l', 'd', '!', | |
1434 }; | 1368 }; |
1435 | 1369 |
1436 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1370 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1437 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1371 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1438 | 1372 |
1439 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1373 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1440 ASSERT_TRUE(visitor_.header_.get()); | 1374 ASSERT_TRUE(visitor_.header_.get()); |
1441 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1375 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1442 | 1376 |
1443 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1377 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1444 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1378 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1445 EXPECT_EQ(static_cast<uint64>(0x00000004), | 1379 EXPECT_EQ(static_cast<uint64>(0x00000004), |
1446 visitor_.stream_frames_[0]->stream_id); | 1380 visitor_.stream_frames_[0]->stream_id); |
1447 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1381 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1448 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1382 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1449 visitor_.stream_frames_[0]->offset); | 1383 visitor_.stream_frames_[0]->offset); |
1450 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1384 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1451 | 1385 |
1452 // Now test framing boundaries | 1386 // Now test framing boundaries |
1453 const size_t stream_id_size = 1; | 1387 const size_t stream_id_size = 1; |
1454 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); | 1388 CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion); |
1455 } | 1389 } |
1456 | 1390 |
1457 TEST_P(QuicFramerTest, StreamFrameWithVersion) { | 1391 TEST_P(QuicFramerTest, StreamFrameWithVersion) { |
1458 unsigned char packet[] = { | 1392 unsigned char packet[] = { |
1459 // public flags (version, 8 byte connection_id) | 1393 // public flags (version, 8 byte connection_id) |
1460 0x3D, | 1394 0x3D, |
1461 // connection_id | 1395 // connection_id |
1462 0x10, 0x32, 0x54, 0x76, | 1396 0x10, 0x32, 0x54, 0x76, |
1463 0x98, 0xBA, 0xDC, 0xFE, | 1397 0x98, 0xBA, 0xDC, 0xFE, |
1464 // version tag | 1398 // version tag |
1465 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 1399 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
1466 // packet sequence number | 1400 // packet sequence number |
1467 0xBC, 0x9A, 0x78, 0x56, | 1401 0xBC, 0x9A, 0x78, 0x56, |
1468 0x34, 0x12, | 1402 0x34, 0x12, |
1469 // private flags | 1403 // private flags |
1470 0x00, | 1404 0x00, |
1471 | 1405 |
1472 // frame type (stream frame with fin) | 1406 // frame type (stream frame with fin) |
1473 0xFF, | 1407 0xFF, |
1474 // stream id | 1408 // stream id |
1475 0x04, 0x03, 0x02, 0x01, | 1409 0x04, 0x03, 0x02, 0x01, |
1476 // offset | 1410 // offset |
1477 0x54, 0x76, 0x10, 0x32, | 1411 0x54, 0x76, 0x10, 0x32, |
1478 0xDC, 0xFE, 0x98, 0xBA, | 1412 0xDC, 0xFE, 0x98, 0xBA, |
1479 // data length | 1413 // data length |
1480 0x0c, 0x00, | 1414 0x0c, 0x00, |
1481 // data | 1415 // data |
1482 'h', 'e', 'l', 'l', | 1416 'h', 'e', 'l', 'l', |
1483 'o', ' ', 'w', 'o', | 1417 'o', ' ', 'w', 'o', |
1484 'r', 'l', 'd', '!', | 1418 'r', 'l', 'd', '!', |
1485 }; | 1419 }; |
1486 | 1420 |
1487 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1421 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1488 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1422 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1489 | 1423 |
1490 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1424 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1491 ASSERT_TRUE(visitor_.header_.get()); | 1425 ASSERT_TRUE(visitor_.header_.get()); |
1492 EXPECT_TRUE(visitor_.header_.get()->public_header.version_flag); | 1426 EXPECT_TRUE(visitor_.header_.get()->public_header.version_flag); |
1493 EXPECT_EQ(GetParam(), visitor_.header_.get()->public_header.versions[0]); | 1427 EXPECT_EQ(GetParam(), visitor_.header_.get()->public_header.versions[0]); |
1494 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion)); | 1428 EXPECT_TRUE(CheckDecryption(encrypted, kIncludeVersion)); |
1495 | 1429 |
1496 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1430 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1497 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1431 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1498 EXPECT_EQ(static_cast<uint64>(0x01020304), | 1432 EXPECT_EQ(static_cast<uint64>(0x01020304), |
1499 visitor_.stream_frames_[0]->stream_id); | 1433 visitor_.stream_frames_[0]->stream_id); |
1500 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1434 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1501 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1435 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1502 visitor_.stream_frames_[0]->offset); | 1436 visitor_.stream_frames_[0]->offset); |
1503 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1437 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1504 | 1438 |
1505 // Now test framing boundaries | 1439 // Now test framing boundaries |
1506 CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, kIncludeVersion); | 1440 CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, kIncludeVersion); |
1507 } | 1441 } |
1508 | 1442 |
1509 TEST_P(QuicFramerTest, RejectPacket) { | 1443 TEST_P(QuicFramerTest, RejectPacket) { |
1510 visitor_.accept_packet_ = false; | 1444 visitor_.accept_packet_ = false; |
1511 | 1445 |
1512 unsigned char packet[] = { | 1446 unsigned char packet[] = {// public flags (8 byte connection_id) |
1513 // public flags (8 byte connection_id) | 1447 0x3C, |
1514 0x3C, | 1448 // connection_id |
1515 // connection_id | 1449 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1516 0x10, 0x32, 0x54, 0x76, | 1450 // packet sequence number |
1517 0x98, 0xBA, 0xDC, 0xFE, | 1451 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1518 // packet sequence number | 1452 // private flags |
1519 0xBC, 0x9A, 0x78, 0x56, | 1453 0x00, |
1520 0x34, 0x12, | |
1521 // private flags | |
1522 0x00, | |
1523 | 1454 |
1524 // frame type (stream frame with fin) | 1455 // frame type (stream frame with fin) |
1525 0xFF, | 1456 0xFF, |
1526 // stream id | 1457 // stream id |
1527 0x04, 0x03, 0x02, 0x01, | 1458 0x04, 0x03, 0x02, 0x01, |
1528 // offset | 1459 // offset |
1529 0x54, 0x76, 0x10, 0x32, | 1460 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
1530 0xDC, 0xFE, 0x98, 0xBA, | 1461 // data length |
1531 // data length | 1462 0x0c, 0x00, |
1532 0x0c, 0x00, | 1463 // data |
1533 // data | 1464 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', |
1534 'h', 'e', 'l', 'l', | 1465 'r', 'l', 'd', '!', |
1535 'o', ' ', 'w', 'o', | |
1536 'r', 'l', 'd', '!', | |
1537 }; | 1466 }; |
1538 | 1467 |
1539 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1468 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1540 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1469 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1541 | 1470 |
1542 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1471 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1543 ASSERT_TRUE(visitor_.header_.get()); | 1472 ASSERT_TRUE(visitor_.header_.get()); |
1544 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1473 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1545 | 1474 |
1546 ASSERT_EQ(0u, visitor_.stream_frames_.size()); | 1475 ASSERT_EQ(0u, visitor_.stream_frames_.size()); |
1547 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1476 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1548 } | 1477 } |
1549 | 1478 |
1550 TEST_P(QuicFramerTest, RejectPublicHeader) { | 1479 TEST_P(QuicFramerTest, RejectPublicHeader) { |
1551 visitor_.accept_public_header_ = false; | 1480 visitor_.accept_public_header_ = false; |
1552 | 1481 |
1553 unsigned char packet[] = { | 1482 unsigned char packet[] = {// public flags (8 byte connection_id) |
1554 // public flags (8 byte connection_id) | 1483 0x3C, |
1555 0x3C, | 1484 // connection_id |
1556 // connection_id | 1485 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1557 0x10, 0x32, 0x54, 0x76, | |
1558 0x98, 0xBA, 0xDC, 0xFE, | |
1559 }; | 1486 }; |
1560 | 1487 |
1561 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1488 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1562 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1489 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1563 | 1490 |
1564 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1491 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1565 ASSERT_TRUE(visitor_.public_header_.get()); | 1492 ASSERT_TRUE(visitor_.public_header_.get()); |
1566 ASSERT_FALSE(visitor_.header_.get()); | 1493 ASSERT_FALSE(visitor_.header_.get()); |
1567 } | 1494 } |
1568 | 1495 |
1569 TEST_P(QuicFramerTest, RevivedStreamFrame) { | 1496 TEST_P(QuicFramerTest, RevivedStreamFrame) { |
1570 unsigned char payload[] = { | 1497 unsigned char payload[] = {// frame type (stream frame with fin) |
1571 // frame type (stream frame with fin) | 1498 0xFF, |
1572 0xFF, | 1499 // stream id |
1573 // stream id | 1500 0x04, 0x03, 0x02, 0x01, |
1574 0x04, 0x03, 0x02, 0x01, | 1501 // offset |
1575 // offset | 1502 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
1576 0x54, 0x76, 0x10, 0x32, | 1503 // data length |
1577 0xDC, 0xFE, 0x98, 0xBA, | 1504 0x0c, 0x00, |
1578 // data length | 1505 // data |
1579 0x0c, 0x00, | 1506 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', |
1580 // data | 1507 'r', 'l', 'd', '!', |
1581 'h', 'e', 'l', 'l', | |
1582 'o', ' ', 'w', 'o', | |
1583 'r', 'l', 'd', '!', | |
1584 }; | 1508 }; |
1585 | 1509 |
1586 QuicPacketHeader header; | 1510 QuicPacketHeader header; |
1587 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 1511 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
1588 header.public_header.reset_flag = false; | 1512 header.public_header.reset_flag = false; |
1589 header.public_header.version_flag = false; | 1513 header.public_header.version_flag = false; |
1590 header.fec_flag = true; | 1514 header.fec_flag = true; |
1591 header.entropy_flag = true; | 1515 header.entropy_flag = true; |
1592 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 1516 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
1593 header.fec_group = 0; | 1517 header.fec_group = 0; |
1594 | 1518 |
1595 // Do not encrypt the payload because the revived payload is post-encryption. | 1519 // Do not encrypt the payload because the revived payload is post-encryption. |
1596 EXPECT_TRUE(framer_.ProcessRevivedPacket(&header, | 1520 EXPECT_TRUE(framer_.ProcessRevivedPacket( |
1597 StringPiece(AsChars(payload), | 1521 &header, StringPiece(AsChars(payload), arraysize(payload)))); |
1598 arraysize(payload)))); | |
1599 | 1522 |
1600 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1523 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1601 ASSERT_EQ(1, visitor_.revived_packets_); | 1524 ASSERT_EQ(1, visitor_.revived_packets_); |
1602 ASSERT_TRUE(visitor_.header_.get()); | 1525 ASSERT_TRUE(visitor_.header_.get()); |
1603 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 1526 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
1604 visitor_.header_->public_header.connection_id); | 1527 visitor_.header_->public_header.connection_id); |
1605 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); | 1528 EXPECT_FALSE(visitor_.header_->public_header.reset_flag); |
1606 EXPECT_FALSE(visitor_.header_->public_header.version_flag); | 1529 EXPECT_FALSE(visitor_.header_->public_header.version_flag); |
1607 EXPECT_TRUE(visitor_.header_->fec_flag); | 1530 EXPECT_TRUE(visitor_.header_->fec_flag); |
1608 EXPECT_TRUE(visitor_.header_->entropy_flag); | 1531 EXPECT_TRUE(visitor_.header_->entropy_flag); |
1609 EXPECT_EQ(1 << (header.packet_sequence_number % 8), | 1532 EXPECT_EQ(1 << (header.packet_sequence_number % 8), |
1610 visitor_.header_->entropy_hash); | 1533 visitor_.header_->entropy_hash); |
1611 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 1534 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
1612 visitor_.header_->packet_sequence_number); | 1535 visitor_.header_->packet_sequence_number); |
1613 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 1536 EXPECT_EQ(NOT_IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
1614 EXPECT_EQ(0x00u, visitor_.header_->fec_group); | 1537 EXPECT_EQ(0x00u, visitor_.header_->fec_group); |
1615 | 1538 |
1616 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1539 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1617 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1540 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1618 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); | 1541 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); |
1619 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1542 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1620 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1543 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1621 visitor_.stream_frames_[0]->offset); | 1544 visitor_.stream_frames_[0]->offset); |
1622 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1545 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1623 } | 1546 } |
1624 | 1547 |
1625 TEST_P(QuicFramerTest, StreamFrameInFecGroup) { | 1548 TEST_P(QuicFramerTest, StreamFrameInFecGroup) { |
1626 unsigned char packet[] = { | 1549 unsigned char packet[] = {// public flags (8 byte connection_id) |
1627 // public flags (8 byte connection_id) | 1550 0x3C, |
1628 0x3C, | 1551 // connection_id |
1629 // connection_id | 1552 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1630 0x10, 0x32, 0x54, 0x76, | 1553 // packet sequence number |
1631 0x98, 0xBA, 0xDC, 0xFE, | 1554 0xBC, 0x9A, 0x78, 0x56, 0x12, 0x34, |
1632 // packet sequence number | 1555 // private flags (fec group) |
1633 0xBC, 0x9A, 0x78, 0x56, | 1556 0x02, |
1634 0x12, 0x34, | 1557 // first fec protected packet offset |
1635 // private flags (fec group) | 1558 0x02, |
1636 0x02, | |
1637 // first fec protected packet offset | |
1638 0x02, | |
1639 | 1559 |
1640 // frame type (stream frame with fin) | 1560 // frame type (stream frame with fin) |
1641 0xFF, | 1561 0xFF, |
1642 // stream id | 1562 // stream id |
1643 0x04, 0x03, 0x02, 0x01, | 1563 0x04, 0x03, 0x02, 0x01, |
1644 // offset | 1564 // offset |
1645 0x54, 0x76, 0x10, 0x32, | 1565 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
1646 0xDC, 0xFE, 0x98, 0xBA, | 1566 // data length |
1647 // data length | 1567 0x0c, 0x00, |
1648 0x0c, 0x00, | 1568 // data |
1649 // data | 1569 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', |
1650 'h', 'e', 'l', 'l', | 1570 'r', 'l', 'd', '!', |
1651 'o', ' ', 'w', 'o', | |
1652 'r', 'l', 'd', '!', | |
1653 }; | 1571 }; |
1654 | 1572 |
1655 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1573 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1656 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1574 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1657 | 1575 |
1658 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1576 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1659 ASSERT_TRUE(visitor_.header_.get()); | 1577 ASSERT_TRUE(visitor_.header_.get()); |
1660 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1578 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1661 EXPECT_EQ(IN_FEC_GROUP, visitor_.header_->is_in_fec_group); | 1579 EXPECT_EQ(IN_FEC_GROUP, visitor_.header_->is_in_fec_group); |
1662 EXPECT_EQ(GG_UINT64_C(0x341256789ABA), | 1580 EXPECT_EQ(GG_UINT64_C(0x341256789ABA), visitor_.header_->fec_group); |
1663 visitor_.header_->fec_group); | |
1664 const size_t fec_offset = | 1581 const size_t fec_offset = |
1665 GetStartOfFecProtectedData(PACKET_8BYTE_CONNECTION_ID, | 1582 GetStartOfFecProtectedData(PACKET_8BYTE_CONNECTION_ID, |
1666 !kIncludeVersion, | 1583 !kIncludeVersion, |
1667 PACKET_6BYTE_SEQUENCE_NUMBER); | 1584 PACKET_6BYTE_SEQUENCE_NUMBER); |
1668 EXPECT_EQ( | 1585 EXPECT_EQ( |
1669 string(AsChars(packet) + fec_offset, arraysize(packet) - fec_offset), | 1586 string(AsChars(packet) + fec_offset, arraysize(packet) - fec_offset), |
1670 visitor_.fec_protected_payload_); | 1587 visitor_.fec_protected_payload_); |
1671 | 1588 |
1672 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1589 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1673 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1590 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1674 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); | 1591 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); |
1675 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1592 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1676 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1593 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1677 visitor_.stream_frames_[0]->offset); | 1594 visitor_.stream_frames_[0]->offset); |
1678 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1595 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1679 } | 1596 } |
1680 | 1597 |
1681 TEST_P(QuicFramerTest, AckFrame15) { | 1598 TEST_P(QuicFramerTest, AckFrame15) { |
1682 if (framer_.version() != QUIC_VERSION_15) { | 1599 if (framer_.version() != QUIC_VERSION_15) { |
1683 return; | 1600 return; |
1684 } | 1601 } |
1685 | 1602 |
1686 unsigned char packet[] = { | 1603 unsigned char packet[] = { |
1687 // public flags (8 byte connection_id) | 1604 // public flags (8 byte connection_id) |
1688 0x3C, | 1605 0x3C, |
1689 // connection_id | 1606 // connection_id |
1690 0x10, 0x32, 0x54, 0x76, | 1607 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1691 0x98, 0xBA, 0xDC, 0xFE, | 1608 // packet sequence number |
1692 // packet sequence number | 1609 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1693 0xA8, 0x9A, 0x78, 0x56, | 1610 // private flags (entropy) |
1694 0x34, 0x12, | 1611 0x01, |
1695 // private flags (entropy) | |
1696 0x01, | |
1697 | 1612 |
1698 // frame type (ack frame) | 1613 // frame type (ack frame) |
1699 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1614 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
1700 0x6C, | 1615 0x6C, |
1701 // entropy hash of sent packets till least awaiting - 1. | 1616 // entropy hash of sent packets till least awaiting - 1. |
1702 0xAB, | 1617 0xAB, |
1703 // least packet sequence number awaiting an ack, delta from sequence number. | 1618 // least packet sequence number awaiting an ack, delta from sequence |
1704 0x08, 0x00, 0x00, 0x00, | 1619 // number. |
1705 0x00, 0x00, | 1620 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
1706 // entropy hash of all received packets. | 1621 // entropy hash of all received packets. |
1707 0xBA, | 1622 0xBA, |
1708 // largest observed packet sequence number | 1623 // largest observed packet sequence number |
1709 0xBF, 0x9A, 0x78, 0x56, | 1624 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1710 0x34, 0x12, | 1625 // Zero delta time. |
1711 // Zero delta time. | 1626 0x0, 0x0, |
1712 0x0, 0x0, | 1627 // num missing packets |
1713 // num missing packets | 1628 0x01, |
1714 0x01, | 1629 // missing packet delta |
1715 // missing packet delta | 1630 0x01, |
1716 0x01, | 1631 // 0 more missing packets in range. |
1717 // 0 more missing packets in range. | 1632 0x00, |
1718 0x00, | 1633 // Number of revived packets. |
1719 // Number of revived packets. | 1634 0x00, |
1720 0x00, | |
1721 }; | 1635 }; |
1722 | 1636 |
1723 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1637 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1724 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1638 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1725 | 1639 |
1726 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1640 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1727 ASSERT_TRUE(visitor_.header_.get()); | 1641 ASSERT_TRUE(visitor_.header_.get()); |
1728 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1642 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1729 | 1643 |
1730 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1644 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
1731 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1645 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
1732 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 1646 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
1733 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash); | 1647 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash); |
1734 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); | 1648 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); |
1735 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); | 1649 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); |
1736 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); | 1650 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); |
1737 SequenceNumberSet::const_iterator missing_iter = | 1651 SequenceNumberSet::const_iterator missing_iter = |
1738 frame.received_info.missing_packets.begin(); | 1652 frame.received_info.missing_packets.begin(); |
1739 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | 1653 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
1740 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); | 1654 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); |
1741 | 1655 |
1742 const size_t kSentEntropyOffset = kQuicFrameTypeSize; | 1656 const size_t kSentEntropyOffset = kQuicFrameTypeSize; |
1743 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; | 1657 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; |
1744 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + | 1658 const size_t kReceivedEntropyOffset = |
1745 PACKET_6BYTE_SEQUENCE_NUMBER; | 1659 kLeastUnackedOffset + PACKET_6BYTE_SEQUENCE_NUMBER; |
1746 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1660 const size_t kLargestObservedOffset = |
1747 kQuicEntropyHashSize; | 1661 kReceivedEntropyOffset + kQuicEntropyHashSize; |
1748 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 1662 const size_t kMissingDeltaTimeOffset = |
1749 PACKET_6BYTE_SEQUENCE_NUMBER; | 1663 kLargestObservedOffset + PACKET_6BYTE_SEQUENCE_NUMBER; |
1750 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 1664 const size_t kNumMissingPacketOffset = |
1751 kQuicDeltaTimeLargestObservedSize; | 1665 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
1752 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1666 const size_t kMissingPacketsOffset = |
1753 kNumberOfMissingPacketsSize; | 1667 kNumMissingPacketOffset + kNumberOfMissingPacketsSize; |
1754 const size_t kMissingPacketsRange = kMissingPacketsOffset + | 1668 const size_t kMissingPacketsRange = |
1755 PACKET_1BYTE_SEQUENCE_NUMBER; | 1669 kMissingPacketsOffset + PACKET_1BYTE_SEQUENCE_NUMBER; |
1756 const size_t kRevivedPacketsLength = kMissingPacketsRange + | 1670 const size_t kRevivedPacketsLength = |
1757 PACKET_1BYTE_SEQUENCE_NUMBER; | 1671 kMissingPacketsRange + PACKET_1BYTE_SEQUENCE_NUMBER; |
1758 // Now test framing boundaries | 1672 // Now test framing boundaries |
1759 const size_t ack_frame_size = kRevivedPacketsLength + | 1673 const size_t ack_frame_size = |
1760 PACKET_1BYTE_SEQUENCE_NUMBER; | 1674 kRevivedPacketsLength + PACKET_1BYTE_SEQUENCE_NUMBER; |
1761 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 1675 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
1762 string expected_error; | 1676 string expected_error; |
1763 if (i < kLeastUnackedOffset) { | 1677 if (i < kLeastUnackedOffset) { |
1764 expected_error = "Unable to read entropy hash for sent packets."; | 1678 expected_error = "Unable to read entropy hash for sent packets."; |
1765 } else if (i < kReceivedEntropyOffset) { | 1679 } else if (i < kReceivedEntropyOffset) { |
1766 expected_error = "Unable to read least unacked delta."; | 1680 expected_error = "Unable to read least unacked delta."; |
1767 } else if (i < kLargestObservedOffset) { | 1681 } else if (i < kLargestObservedOffset) { |
1768 expected_error = "Unable to read entropy hash for received packets."; | 1682 expected_error = "Unable to read entropy hash for received packets."; |
1769 } else if (i < kMissingDeltaTimeOffset) { | 1683 } else if (i < kMissingDeltaTimeOffset) { |
1770 expected_error = "Unable to read largest observed."; | 1684 expected_error = "Unable to read largest observed."; |
1771 } else if (i < kNumMissingPacketOffset) { | 1685 } else if (i < kNumMissingPacketOffset) { |
1772 expected_error = "Unable to read delta time largest observed."; | 1686 expected_error = "Unable to read delta time largest observed."; |
1773 } else if (i < kMissingPacketsOffset) { | 1687 } else if (i < kMissingPacketsOffset) { |
1774 expected_error = "Unable to read num missing packet ranges."; | 1688 expected_error = "Unable to read num missing packet ranges."; |
1775 } else if (i < kMissingPacketsRange) { | 1689 } else if (i < kMissingPacketsRange) { |
1776 expected_error = "Unable to read missing sequence number delta."; | 1690 expected_error = "Unable to read missing sequence number delta."; |
1777 } else if (i < kRevivedPacketsLength) { | 1691 } else if (i < kRevivedPacketsLength) { |
1778 expected_error = "Unable to read missing sequence number range."; | 1692 expected_error = "Unable to read missing sequence number range."; |
1779 } else { | 1693 } else { |
1780 expected_error = "Unable to read num revived packets."; | 1694 expected_error = "Unable to read num revived packets."; |
1781 } | 1695 } |
1782 CheckProcessingFails( | 1696 CheckProcessingFails(packet, |
1783 packet, | 1697 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
1784 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 1698 !kIncludeVersion, |
1785 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1699 PACKET_6BYTE_SEQUENCE_NUMBER, |
1786 expected_error, QUIC_INVALID_ACK_DATA); | 1700 NOT_IN_FEC_GROUP), |
| 1701 expected_error, |
| 1702 QUIC_INVALID_ACK_DATA); |
1787 } | 1703 } |
1788 } | 1704 } |
1789 | 1705 |
1790 TEST_P(QuicFramerTest, AckFrame) { | 1706 TEST_P(QuicFramerTest, AckFrame) { |
1791 if (framer_.version() <= QUIC_VERSION_15) { | 1707 if (framer_.version() <= QUIC_VERSION_15) { |
1792 return; | 1708 return; |
1793 } | 1709 } |
1794 | 1710 |
1795 unsigned char packet[] = { | 1711 unsigned char packet[] = { |
1796 // public flags (8 byte connection_id) | 1712 // public flags (8 byte connection_id) |
1797 0x3C, | 1713 0x3C, |
1798 // connection_id | 1714 // connection_id |
1799 0x10, 0x32, 0x54, 0x76, | 1715 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1800 0x98, 0xBA, 0xDC, 0xFE, | 1716 // packet sequence number |
1801 // packet sequence number | 1717 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1802 0xA8, 0x9A, 0x78, 0x56, | 1718 // private flags (entropy) |
1803 0x34, 0x12, | 1719 0x01, |
1804 // private flags (entropy) | |
1805 0x01, | |
1806 | 1720 |
1807 // frame type (ack frame) | 1721 // frame type (ack frame) |
1808 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1722 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
1809 0x6C, | 1723 0x6C, |
1810 // entropy hash of all received packets. | 1724 // entropy hash of all received packets. |
1811 0xBA, | 1725 0xBA, |
1812 // largest observed packet sequence number | 1726 // largest observed packet sequence number |
1813 0xBF, 0x9A, 0x78, 0x56, | 1727 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1814 0x34, 0x12, | 1728 // Zero delta time. |
1815 // Zero delta time. | 1729 0x0, 0x0, |
1816 0x0, 0x0, | 1730 // num missing packets |
1817 // num missing packets | 1731 0x01, |
1818 0x01, | 1732 // missing packet delta |
1819 // missing packet delta | 1733 0x01, |
1820 0x01, | 1734 // 0 more missing packets in range. |
1821 // 0 more missing packets in range. | 1735 0x00, |
1822 0x00, | 1736 // Number of revived packets. |
1823 // Number of revived packets. | 1737 0x00, |
1824 0x00, | |
1825 }; | 1738 }; |
1826 | 1739 |
1827 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1740 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1828 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1741 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1829 | 1742 |
1830 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1743 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1831 ASSERT_TRUE(visitor_.header_.get()); | 1744 ASSERT_TRUE(visitor_.header_.get()); |
1832 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1745 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1833 | 1746 |
1834 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1747 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
1835 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1748 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
1836 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 1749 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
1837 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); | 1750 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); |
1838 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); | 1751 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); |
1839 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); | 1752 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); |
1840 SequenceNumberSet::const_iterator missing_iter = | 1753 SequenceNumberSet::const_iterator missing_iter = |
1841 frame.received_info.missing_packets.begin(); | 1754 frame.received_info.missing_packets.begin(); |
1842 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | 1755 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
1843 | 1756 |
1844 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 1757 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
1845 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1758 const size_t kLargestObservedOffset = |
1846 kQuicEntropyHashSize; | 1759 kReceivedEntropyOffset + kQuicEntropyHashSize; |
1847 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 1760 const size_t kMissingDeltaTimeOffset = |
1848 PACKET_6BYTE_SEQUENCE_NUMBER; | 1761 kLargestObservedOffset + PACKET_6BYTE_SEQUENCE_NUMBER; |
1849 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 1762 const size_t kNumMissingPacketOffset = |
1850 kQuicDeltaTimeLargestObservedSize; | 1763 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
1851 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1764 const size_t kMissingPacketsOffset = |
1852 kNumberOfMissingPacketsSize; | 1765 kNumMissingPacketOffset + kNumberOfMissingPacketsSize; |
1853 const size_t kMissingPacketsRange = kMissingPacketsOffset + | 1766 const size_t kMissingPacketsRange = |
1854 PACKET_1BYTE_SEQUENCE_NUMBER; | 1767 kMissingPacketsOffset + PACKET_1BYTE_SEQUENCE_NUMBER; |
1855 const size_t kRevivedPacketsLength = kMissingPacketsRange + | 1768 const size_t kRevivedPacketsLength = |
1856 PACKET_1BYTE_SEQUENCE_NUMBER; | 1769 kMissingPacketsRange + PACKET_1BYTE_SEQUENCE_NUMBER; |
1857 // Now test framing boundaries | 1770 // Now test framing boundaries |
1858 const size_t ack_frame_size = kRevivedPacketsLength + | 1771 const size_t ack_frame_size = |
1859 PACKET_1BYTE_SEQUENCE_NUMBER; | 1772 kRevivedPacketsLength + PACKET_1BYTE_SEQUENCE_NUMBER; |
1860 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 1773 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
1861 string expected_error; | 1774 string expected_error; |
1862 if (i < kLargestObservedOffset) { | 1775 if (i < kLargestObservedOffset) { |
1863 expected_error = "Unable to read entropy hash for received packets."; | 1776 expected_error = "Unable to read entropy hash for received packets."; |
1864 } else if (i < kMissingDeltaTimeOffset) { | 1777 } else if (i < kMissingDeltaTimeOffset) { |
1865 expected_error = "Unable to read largest observed."; | 1778 expected_error = "Unable to read largest observed."; |
1866 } else if (i < kNumMissingPacketOffset) { | 1779 } else if (i < kNumMissingPacketOffset) { |
1867 expected_error = "Unable to read delta time largest observed."; | 1780 expected_error = "Unable to read delta time largest observed."; |
1868 } else if (i < kMissingPacketsOffset) { | 1781 } else if (i < kMissingPacketsOffset) { |
1869 expected_error = "Unable to read num missing packet ranges."; | 1782 expected_error = "Unable to read num missing packet ranges."; |
1870 } else if (i < kMissingPacketsRange) { | 1783 } else if (i < kMissingPacketsRange) { |
1871 expected_error = "Unable to read missing sequence number delta."; | 1784 expected_error = "Unable to read missing sequence number delta."; |
1872 } else if (i < kRevivedPacketsLength) { | 1785 } else if (i < kRevivedPacketsLength) { |
1873 expected_error = "Unable to read missing sequence number range."; | 1786 expected_error = "Unable to read missing sequence number range."; |
1874 } else { | 1787 } else { |
1875 expected_error = "Unable to read num revived packets."; | 1788 expected_error = "Unable to read num revived packets."; |
1876 } | 1789 } |
1877 CheckProcessingFails( | 1790 CheckProcessingFails(packet, |
1878 packet, | 1791 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
1879 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 1792 !kIncludeVersion, |
1880 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1793 PACKET_6BYTE_SEQUENCE_NUMBER, |
1881 expected_error, QUIC_INVALID_ACK_DATA); | 1794 NOT_IN_FEC_GROUP), |
| 1795 expected_error, |
| 1796 QUIC_INVALID_ACK_DATA); |
1882 } | 1797 } |
1883 } | 1798 } |
1884 | 1799 |
1885 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { | 1800 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { |
1886 if (framer_.version() <= QUIC_VERSION_15) { | 1801 if (framer_.version() <= QUIC_VERSION_15) { |
1887 return; | 1802 return; |
1888 } | 1803 } |
1889 | 1804 |
1890 unsigned char packet[] = { | 1805 unsigned char packet[] = { |
1891 // public flags (8 byte connection_id) | 1806 // public flags (8 byte connection_id) |
1892 0x3C, | 1807 0x3C, |
1893 // connection_id | 1808 // connection_id |
1894 0x10, 0x32, 0x54, 0x76, | 1809 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1895 0x98, 0xBA, 0xDC, 0xFE, | 1810 // packet sequence number |
1896 // packet sequence number | 1811 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1897 0xA8, 0x9A, 0x78, 0x56, | 1812 // private flags (entropy) |
1898 0x34, 0x12, | 1813 0x01, |
1899 // private flags (entropy) | |
1900 0x01, | |
1901 | 1814 |
1902 // frame type (ack frame) | 1815 // frame type (ack frame) |
1903 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1816 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
1904 0x6C, | 1817 0x6C, |
1905 // entropy hash of all received packets. | 1818 // entropy hash of all received packets. |
1906 0xBA, | 1819 0xBA, |
1907 // largest observed packet sequence number | 1820 // largest observed packet sequence number |
1908 0xBF, 0x9A, 0x78, 0x56, | 1821 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1909 0x34, 0x12, | 1822 // Zero delta time. |
1910 // Zero delta time. | 1823 0x0, 0x0, |
1911 0x0, 0x0, | 1824 // num missing packets |
1912 // num missing packets | 1825 0x01, |
1913 0x01, | 1826 // missing packet delta |
1914 // missing packet delta | 1827 0x01, |
1915 0x01, | 1828 // 0 more missing packets in range. |
1916 // 0 more missing packets in range. | 1829 0x00, |
1917 0x00, | 1830 // Number of revived packets. |
1918 // Number of revived packets. | 1831 0x01, |
1919 0x01, | 1832 // Revived packet sequence number. |
1920 // Revived packet sequence number. | 1833 0xBE, 0x9A, 0x78, 0x56, 0x34, 0x12, |
1921 0xBE, 0x9A, 0x78, 0x56, | |
1922 0x34, 0x12, | |
1923 }; | 1834 }; |
1924 | 1835 |
1925 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1836 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1926 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1837 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1927 | 1838 |
1928 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1839 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1929 ASSERT_TRUE(visitor_.header_.get()); | 1840 ASSERT_TRUE(visitor_.header_.get()); |
1930 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1841 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1931 | 1842 |
1932 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1843 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
1933 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1844 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
1934 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 1845 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
1935 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); | 1846 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); |
1936 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); | 1847 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); |
1937 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); | 1848 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); |
1938 SequenceNumberSet::const_iterator missing_iter = | 1849 SequenceNumberSet::const_iterator missing_iter = |
1939 frame.received_info.missing_packets.begin(); | 1850 frame.received_info.missing_packets.begin(); |
1940 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | 1851 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
1941 | 1852 |
1942 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 1853 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
1943 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1854 const size_t kLargestObservedOffset = |
1944 kQuicEntropyHashSize; | 1855 kReceivedEntropyOffset + kQuicEntropyHashSize; |
1945 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 1856 const size_t kMissingDeltaTimeOffset = |
1946 PACKET_6BYTE_SEQUENCE_NUMBER; | 1857 kLargestObservedOffset + PACKET_6BYTE_SEQUENCE_NUMBER; |
1947 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 1858 const size_t kNumMissingPacketOffset = |
1948 kQuicDeltaTimeLargestObservedSize; | 1859 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
1949 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1860 const size_t kMissingPacketsOffset = |
1950 kNumberOfMissingPacketsSize; | 1861 kNumMissingPacketOffset + kNumberOfMissingPacketsSize; |
1951 const size_t kMissingPacketsRange = kMissingPacketsOffset + | 1862 const size_t kMissingPacketsRange = |
1952 PACKET_1BYTE_SEQUENCE_NUMBER; | 1863 kMissingPacketsOffset + PACKET_1BYTE_SEQUENCE_NUMBER; |
1953 const size_t kRevivedPacketsLength = kMissingPacketsRange + | 1864 const size_t kRevivedPacketsLength = |
1954 PACKET_1BYTE_SEQUENCE_NUMBER; | 1865 kMissingPacketsRange + PACKET_1BYTE_SEQUENCE_NUMBER; |
1955 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + | 1866 const size_t kRevivedPacketSequenceNumberLength = |
1956 PACKET_1BYTE_SEQUENCE_NUMBER; | 1867 kRevivedPacketsLength + PACKET_1BYTE_SEQUENCE_NUMBER; |
1957 // Now test framing boundaries | 1868 // Now test framing boundaries |
1958 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + | 1869 const size_t ack_frame_size = |
1959 PACKET_6BYTE_SEQUENCE_NUMBER; | 1870 kRevivedPacketSequenceNumberLength + PACKET_6BYTE_SEQUENCE_NUMBER; |
1960 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 1871 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
1961 string expected_error; | 1872 string expected_error; |
1962 if (i < kReceivedEntropyOffset) { | 1873 if (i < kReceivedEntropyOffset) { |
1963 expected_error = "Unable to read least unacked delta."; | 1874 expected_error = "Unable to read least unacked delta."; |
1964 } else if (i < kLargestObservedOffset) { | 1875 } else if (i < kLargestObservedOffset) { |
1965 expected_error = "Unable to read entropy hash for received packets."; | 1876 expected_error = "Unable to read entropy hash for received packets."; |
1966 } else if (i < kMissingDeltaTimeOffset) { | 1877 } else if (i < kMissingDeltaTimeOffset) { |
1967 expected_error = "Unable to read largest observed."; | 1878 expected_error = "Unable to read largest observed."; |
1968 } else if (i < kNumMissingPacketOffset) { | 1879 } else if (i < kNumMissingPacketOffset) { |
1969 expected_error = "Unable to read delta time largest observed."; | 1880 expected_error = "Unable to read delta time largest observed."; |
1970 } else if (i < kMissingPacketsOffset) { | 1881 } else if (i < kMissingPacketsOffset) { |
1971 expected_error = "Unable to read num missing packet ranges."; | 1882 expected_error = "Unable to read num missing packet ranges."; |
1972 } else if (i < kMissingPacketsRange) { | 1883 } else if (i < kMissingPacketsRange) { |
1973 expected_error = "Unable to read missing sequence number delta."; | 1884 expected_error = "Unable to read missing sequence number delta."; |
1974 } else if (i < kRevivedPacketsLength) { | 1885 } else if (i < kRevivedPacketsLength) { |
1975 expected_error = "Unable to read missing sequence number range."; | 1886 expected_error = "Unable to read missing sequence number range."; |
1976 } else if (i < kRevivedPacketSequenceNumberLength) { | 1887 } else if (i < kRevivedPacketSequenceNumberLength) { |
1977 expected_error = "Unable to read num revived packets."; | 1888 expected_error = "Unable to read num revived packets."; |
1978 } else { | 1889 } else { |
1979 expected_error = "Unable to read revived packet."; | 1890 expected_error = "Unable to read revived packet."; |
1980 } | 1891 } |
1981 CheckProcessingFails( | 1892 CheckProcessingFails(packet, |
1982 packet, | 1893 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
1983 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 1894 !kIncludeVersion, |
1984 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1895 PACKET_6BYTE_SEQUENCE_NUMBER, |
1985 expected_error, QUIC_INVALID_ACK_DATA); | 1896 NOT_IN_FEC_GROUP), |
| 1897 expected_error, |
| 1898 QUIC_INVALID_ACK_DATA); |
1986 } | 1899 } |
1987 } | 1900 } |
1988 | 1901 |
1989 TEST_P(QuicFramerTest, AckFrameRevivedPackets15) { | 1902 TEST_P(QuicFramerTest, AckFrameRevivedPackets15) { |
1990 if (framer_.version() != QUIC_VERSION_15) { | 1903 if (framer_.version() != QUIC_VERSION_15) { |
1991 return; | 1904 return; |
1992 } | 1905 } |
1993 | 1906 |
1994 unsigned char packet[] = { | 1907 unsigned char packet[] = { |
1995 // public flags (8 byte connection_id) | 1908 // public flags (8 byte connection_id) |
1996 0x3C, | 1909 0x3C, |
1997 // connection_id | 1910 // connection_id |
1998 0x10, 0x32, 0x54, 0x76, | 1911 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
1999 0x98, 0xBA, 0xDC, 0xFE, | 1912 // packet sequence number |
2000 // packet sequence number | 1913 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2001 0xA8, 0x9A, 0x78, 0x56, | 1914 // private flags (entropy) |
2002 0x34, 0x12, | 1915 0x01, |
2003 // private flags (entropy) | |
2004 0x01, | |
2005 | 1916 |
2006 // frame type (ack frame) | 1917 // frame type (ack frame) |
2007 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 1918 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2008 0x6C, | 1919 0x6C, |
2009 // entropy hash of sent packets till least awaiting - 1. | 1920 // entropy hash of sent packets till least awaiting - 1. |
2010 0xAB, | 1921 0xAB, |
2011 // least packet sequence number awaiting an ack, delta from sequence number. | 1922 // least packet sequence number awaiting an ack, delta from sequence |
2012 0x08, 0x00, 0x00, 0x00, | 1923 // number. |
2013 0x00, 0x00, | 1924 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
2014 // entropy hash of all received packets. | 1925 // entropy hash of all received packets. |
2015 0xBA, | 1926 0xBA, |
2016 // largest observed packet sequence number | 1927 // largest observed packet sequence number |
2017 0xBF, 0x9A, 0x78, 0x56, | 1928 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2018 0x34, 0x12, | 1929 // Zero delta time. |
2019 // Zero delta time. | 1930 0x0, 0x0, |
2020 0x0, 0x0, | 1931 // num missing packets |
2021 // num missing packets | 1932 0x01, |
2022 0x01, | 1933 // missing packet delta |
2023 // missing packet delta | 1934 0x01, |
2024 0x01, | 1935 // 0 more missing packets in range. |
2025 // 0 more missing packets in range. | 1936 0x00, |
2026 0x00, | 1937 // Number of revived packets. |
2027 // Number of revived packets. | 1938 0x01, |
2028 0x01, | 1939 // Revived packet sequence number. |
2029 // Revived packet sequence number. | 1940 0xBE, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2030 0xBE, 0x9A, 0x78, 0x56, | |
2031 0x34, 0x12, | |
2032 }; | 1941 }; |
2033 | 1942 |
2034 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 1943 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2035 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 1944 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2036 | 1945 |
2037 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 1946 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2038 ASSERT_TRUE(visitor_.header_.get()); | 1947 ASSERT_TRUE(visitor_.header_.get()); |
2039 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 1948 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2040 | 1949 |
2041 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 1950 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2042 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 1951 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
2043 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 1952 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
2044 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash); | 1953 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash); |
2045 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); | 1954 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); |
2046 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); | 1955 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); |
2047 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); | 1956 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); |
2048 SequenceNumberSet::const_iterator missing_iter = | 1957 SequenceNumberSet::const_iterator missing_iter = |
2049 frame.received_info.missing_packets.begin(); | 1958 frame.received_info.missing_packets.begin(); |
2050 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | 1959 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
2051 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); | 1960 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); |
2052 | 1961 |
2053 const size_t kSentEntropyOffset = kQuicFrameTypeSize; | 1962 const size_t kSentEntropyOffset = kQuicFrameTypeSize; |
2054 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; | 1963 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; |
2055 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + | 1964 const size_t kReceivedEntropyOffset = |
2056 PACKET_6BYTE_SEQUENCE_NUMBER; | 1965 kLeastUnackedOffset + PACKET_6BYTE_SEQUENCE_NUMBER; |
2057 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1966 const size_t kLargestObservedOffset = |
2058 kQuicEntropyHashSize; | 1967 kReceivedEntropyOffset + kQuicEntropyHashSize; |
2059 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 1968 const size_t kMissingDeltaTimeOffset = |
2060 PACKET_6BYTE_SEQUENCE_NUMBER; | 1969 kLargestObservedOffset + PACKET_6BYTE_SEQUENCE_NUMBER; |
2061 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 1970 const size_t kNumMissingPacketOffset = |
2062 kQuicDeltaTimeLargestObservedSize; | 1971 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
2063 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1972 const size_t kMissingPacketsOffset = |
2064 kNumberOfMissingPacketsSize; | 1973 kNumMissingPacketOffset + kNumberOfMissingPacketsSize; |
2065 const size_t kMissingPacketsRange = kMissingPacketsOffset + | 1974 const size_t kMissingPacketsRange = |
2066 PACKET_1BYTE_SEQUENCE_NUMBER; | 1975 kMissingPacketsOffset + PACKET_1BYTE_SEQUENCE_NUMBER; |
2067 const size_t kRevivedPacketsLength = kMissingPacketsRange + | 1976 const size_t kRevivedPacketsLength = |
2068 PACKET_1BYTE_SEQUENCE_NUMBER; | 1977 kMissingPacketsRange + PACKET_1BYTE_SEQUENCE_NUMBER; |
2069 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + | 1978 const size_t kRevivedPacketSequenceNumberLength = |
2070 PACKET_1BYTE_SEQUENCE_NUMBER; | 1979 kRevivedPacketsLength + PACKET_1BYTE_SEQUENCE_NUMBER; |
2071 // Now test framing boundaries | 1980 // Now test framing boundaries |
2072 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + | 1981 const size_t ack_frame_size = |
2073 PACKET_6BYTE_SEQUENCE_NUMBER; | 1982 kRevivedPacketSequenceNumberLength + PACKET_6BYTE_SEQUENCE_NUMBER; |
2074 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 1983 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
2075 string expected_error; | 1984 string expected_error; |
2076 if (i < kLeastUnackedOffset) { | 1985 if (i < kLeastUnackedOffset) { |
2077 expected_error = "Unable to read entropy hash for sent packets."; | 1986 expected_error = "Unable to read entropy hash for sent packets."; |
2078 } else if (i < kReceivedEntropyOffset) { | 1987 } else if (i < kReceivedEntropyOffset) { |
2079 expected_error = "Unable to read least unacked delta."; | 1988 expected_error = "Unable to read least unacked delta."; |
2080 } else if (i < kLargestObservedOffset) { | 1989 } else if (i < kLargestObservedOffset) { |
2081 expected_error = "Unable to read entropy hash for received packets."; | 1990 expected_error = "Unable to read entropy hash for received packets."; |
2082 } else if (i < kMissingDeltaTimeOffset) { | 1991 } else if (i < kMissingDeltaTimeOffset) { |
2083 expected_error = "Unable to read largest observed."; | 1992 expected_error = "Unable to read largest observed."; |
2084 } else if (i < kNumMissingPacketOffset) { | 1993 } else if (i < kNumMissingPacketOffset) { |
2085 expected_error = "Unable to read delta time largest observed."; | 1994 expected_error = "Unable to read delta time largest observed."; |
2086 } else if (i < kMissingPacketsOffset) { | 1995 } else if (i < kMissingPacketsOffset) { |
2087 expected_error = "Unable to read num missing packet ranges."; | 1996 expected_error = "Unable to read num missing packet ranges."; |
2088 } else if (i < kMissingPacketsRange) { | 1997 } else if (i < kMissingPacketsRange) { |
2089 expected_error = "Unable to read missing sequence number delta."; | 1998 expected_error = "Unable to read missing sequence number delta."; |
2090 } else if (i < kRevivedPacketsLength) { | 1999 } else if (i < kRevivedPacketsLength) { |
2091 expected_error = "Unable to read missing sequence number range."; | 2000 expected_error = "Unable to read missing sequence number range."; |
2092 } else if (i < kRevivedPacketSequenceNumberLength) { | 2001 } else if (i < kRevivedPacketSequenceNumberLength) { |
2093 expected_error = "Unable to read num revived packets."; | 2002 expected_error = "Unable to read num revived packets."; |
2094 } else { | 2003 } else { |
2095 expected_error = "Unable to read revived packet."; | 2004 expected_error = "Unable to read revived packet."; |
2096 } | 2005 } |
2097 CheckProcessingFails( | 2006 CheckProcessingFails(packet, |
2098 packet, | 2007 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
2099 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2008 !kIncludeVersion, |
2100 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2009 PACKET_6BYTE_SEQUENCE_NUMBER, |
2101 expected_error, QUIC_INVALID_ACK_DATA); | 2010 NOT_IN_FEC_GROUP), |
| 2011 expected_error, |
| 2012 QUIC_INVALID_ACK_DATA); |
2102 } | 2013 } |
2103 } | 2014 } |
2104 | 2015 |
2105 TEST_P(QuicFramerTest, AckFrameNoNacks) { | 2016 TEST_P(QuicFramerTest, AckFrameNoNacks) { |
2106 if (framer_.version() <= QUIC_VERSION_15) { | 2017 if (framer_.version() <= QUIC_VERSION_15) { |
2107 return; | 2018 return; |
2108 } | 2019 } |
2109 unsigned char packet[] = { | 2020 unsigned char packet[] = { |
2110 // public flags (8 byte connection_id) | 2021 // public flags (8 byte connection_id) |
2111 0x3C, | 2022 0x3C, |
2112 // connection_id | 2023 // connection_id |
2113 0x10, 0x32, 0x54, 0x76, | 2024 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2114 0x98, 0xBA, 0xDC, 0xFE, | 2025 // packet sequence number |
2115 // packet sequence number | 2026 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2116 0xA8, 0x9A, 0x78, 0x56, | 2027 // private flags (entropy) |
2117 0x34, 0x12, | 2028 0x01, |
2118 // private flags (entropy) | |
2119 0x01, | |
2120 | 2029 |
2121 // frame type (ack frame) | 2030 // frame type (ack frame) |
2122 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2031 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2123 0x4C, | 2032 0x4C, |
2124 // entropy hash of all received packets. | 2033 // entropy hash of all received packets. |
2125 0xBA, | 2034 0xBA, |
2126 // largest observed packet sequence number | 2035 // largest observed packet sequence number |
2127 0xBF, 0x9A, 0x78, 0x56, | 2036 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2128 0x34, 0x12, | 2037 // Zero delta time. |
2129 // Zero delta time. | 2038 0x0, 0x0, |
2130 0x0, 0x0, | |
2131 }; | 2039 }; |
2132 | 2040 |
2133 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2041 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2134 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2042 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2135 | 2043 |
2136 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2044 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2137 ASSERT_TRUE(visitor_.header_.get()); | 2045 ASSERT_TRUE(visitor_.header_.get()); |
2138 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2046 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2139 | 2047 |
2140 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2048 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2141 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 2049 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
2142 QuicAckFrame* frame = visitor_.ack_frames_[0]; | 2050 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
2143 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); | 2051 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); |
2144 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), | 2052 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), |
2145 frame->received_info.largest_observed); | 2053 frame->received_info.largest_observed); |
2146 ASSERT_EQ(0u, frame->received_info.missing_packets.size()); | 2054 ASSERT_EQ(0u, frame->received_info.missing_packets.size()); |
2147 | 2055 |
2148 // Verify that the packet re-serializes identically. | 2056 // Verify that the packet re-serializes identically. |
2149 QuicFrames frames; | 2057 QuicFrames frames; |
2150 frames.push_back(QuicFrame(frame)); | 2058 frames.push_back(QuicFrame(frame)); |
2151 scoped_ptr<QuicPacket> data( | 2059 scoped_ptr<QuicPacket> data( |
2152 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); | 2060 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); |
2153 ASSERT_TRUE(data != NULL); | 2061 ASSERT_TRUE(data != NULL); |
2154 | 2062 |
2155 test::CompareCharArraysWithHexError("constructed packet", | 2063 test::CompareCharArraysWithHexError("constructed packet", |
2156 data->data(), data->length(), | 2064 data->data(), |
2157 AsChars(packet), arraysize(packet)); | 2065 data->length(), |
| 2066 AsChars(packet), |
| 2067 arraysize(packet)); |
2158 } | 2068 } |
2159 | 2069 |
2160 TEST_P(QuicFramerTest, AckFrameNoNacks15) { | 2070 TEST_P(QuicFramerTest, AckFrameNoNacks15) { |
2161 if (framer_.version() > QUIC_VERSION_15) { | 2071 if (framer_.version() > QUIC_VERSION_15) { |
2162 return; | 2072 return; |
2163 } | 2073 } |
2164 unsigned char packet[] = { | 2074 unsigned char packet[] = { |
2165 // public flags (8 byte connection_id) | 2075 // public flags (8 byte connection_id) |
2166 0x3C, | 2076 0x3C, |
2167 // connection_id | 2077 // connection_id |
2168 0x10, 0x32, 0x54, 0x76, | 2078 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2169 0x98, 0xBA, 0xDC, 0xFE, | 2079 // packet sequence number |
2170 // packet sequence number | 2080 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2171 0xA8, 0x9A, 0x78, 0x56, | 2081 // private flags (entropy) |
2172 0x34, 0x12, | 2082 0x01, |
2173 // private flags (entropy) | |
2174 0x01, | |
2175 | 2083 |
2176 // frame type (ack frame) | 2084 // frame type (ack frame) |
2177 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2085 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2178 0x4C, | 2086 0x4C, |
2179 // entropy hash of sent packets till least awaiting - 1. | 2087 // entropy hash of sent packets till least awaiting - 1. |
2180 0xAB, | 2088 0xAB, |
2181 // least packet sequence number awaiting an ack, delta from sequence number. | 2089 // least packet sequence number awaiting an ack, delta from sequence |
2182 0x08, 0x00, 0x00, 0x00, | 2090 // number. |
2183 0x00, 0x00, | 2091 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
2184 // entropy hash of all received packets. | 2092 // entropy hash of all received packets. |
2185 0xBA, | 2093 0xBA, |
2186 // largest observed packet sequence number | 2094 // largest observed packet sequence number |
2187 0xBF, 0x9A, 0x78, 0x56, | 2095 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2188 0x34, 0x12, | 2096 // Zero delta time. |
2189 // Zero delta time. | 2097 0x0, 0x0, |
2190 0x0, 0x0, | |
2191 }; | 2098 }; |
2192 | 2099 |
2193 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2100 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2194 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2101 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2195 | 2102 |
2196 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2103 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2197 ASSERT_TRUE(visitor_.header_.get()); | 2104 ASSERT_TRUE(visitor_.header_.get()); |
2198 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2105 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2199 | 2106 |
2200 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2107 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2201 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 2108 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
2202 QuicAckFrame* frame = visitor_.ack_frames_[0]; | 2109 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
2203 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash); | 2110 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash); |
2204 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); | 2111 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); |
2205 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), | 2112 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), |
2206 frame->received_info.largest_observed); | 2113 frame->received_info.largest_observed); |
2207 ASSERT_EQ(0u, frame->received_info.missing_packets.size()); | 2114 ASSERT_EQ(0u, frame->received_info.missing_packets.size()); |
2208 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); | 2115 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); |
2209 | 2116 |
2210 // Verify that the packet re-serializes identically. | 2117 // Verify that the packet re-serializes identically. |
2211 QuicFrames frames; | 2118 QuicFrames frames; |
2212 frames.push_back(QuicFrame(frame)); | 2119 frames.push_back(QuicFrame(frame)); |
2213 scoped_ptr<QuicPacket> data( | 2120 scoped_ptr<QuicPacket> data( |
2214 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); | 2121 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); |
2215 ASSERT_TRUE(data != NULL); | 2122 ASSERT_TRUE(data != NULL); |
2216 | 2123 |
2217 test::CompareCharArraysWithHexError("constructed packet", | 2124 test::CompareCharArraysWithHexError("constructed packet", |
2218 data->data(), data->length(), | 2125 data->data(), |
2219 AsChars(packet), arraysize(packet)); | 2126 data->length(), |
| 2127 AsChars(packet), |
| 2128 arraysize(packet)); |
2220 } | 2129 } |
2221 | 2130 |
2222 TEST_P(QuicFramerTest, AckFrame500Nacks) { | 2131 TEST_P(QuicFramerTest, AckFrame500Nacks) { |
2223 if (framer_.version() <= QUIC_VERSION_15) { | 2132 if (framer_.version() <= QUIC_VERSION_15) { |
2224 return; | 2133 return; |
2225 } | 2134 } |
2226 unsigned char packet[] = { | 2135 unsigned char packet[] = { |
2227 // public flags (8 byte connection_id) | 2136 // public flags (8 byte connection_id) |
2228 0x3C, | 2137 0x3C, |
2229 // connection_id | 2138 // connection_id |
2230 0x10, 0x32, 0x54, 0x76, | 2139 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2231 0x98, 0xBA, 0xDC, 0xFE, | 2140 // packet sequence number |
2232 // packet sequence number | 2141 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2233 0xA8, 0x9A, 0x78, 0x56, | 2142 // private flags (entropy) |
2234 0x34, 0x12, | 2143 0x01, |
2235 // private flags (entropy) | |
2236 0x01, | |
2237 | 2144 |
2238 // frame type (ack frame) | 2145 // frame type (ack frame) |
2239 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2146 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2240 0x6C, | 2147 0x6C, |
2241 // entropy hash of all received packets. | 2148 // entropy hash of all received packets. |
2242 0xBA, | 2149 0xBA, |
2243 // largest observed packet sequence number | 2150 // largest observed packet sequence number |
2244 0xBF, 0x9A, 0x78, 0x56, | 2151 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2245 0x34, 0x12, | 2152 // Zero delta time. |
2246 // Zero delta time. | 2153 0x0, 0x0, |
2247 0x0, 0x0, | 2154 // num missing packet ranges |
2248 // num missing packet ranges | 2155 0x02, |
2249 0x02, | 2156 // missing packet delta |
2250 // missing packet delta | 2157 0x01, |
2251 0x01, | 2158 // 243 more missing packets in range. |
2252 // 243 more missing packets in range. | 2159 // The ranges are listed in this order so the re-constructed packet |
2253 // The ranges are listed in this order so the re-constructed packet matches. | 2160 // matches. |
2254 0xF3, | 2161 0xF3, |
2255 // No gap between ranges | 2162 // No gap between ranges |
2256 0x00, | 2163 0x00, |
2257 // 255 more missing packets in range. | 2164 // 255 more missing packets in range. |
2258 0xFF, | 2165 0xFF, |
2259 // No revived packets. | 2166 // No revived packets. |
2260 0x00, | 2167 0x00, |
2261 }; | 2168 }; |
2262 | 2169 |
2263 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2170 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2264 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2171 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2265 | 2172 |
2266 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2173 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2267 ASSERT_TRUE(visitor_.header_.get()); | 2174 ASSERT_TRUE(visitor_.header_.get()); |
2268 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2175 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2269 | 2176 |
2270 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2177 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
(...skipping 12 matching lines...) Expand all Loading... |
2283 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); | 2190 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); |
2284 | 2191 |
2285 // Verify that the packet re-serializes identically. | 2192 // Verify that the packet re-serializes identically. |
2286 QuicFrames frames; | 2193 QuicFrames frames; |
2287 frames.push_back(QuicFrame(frame)); | 2194 frames.push_back(QuicFrame(frame)); |
2288 scoped_ptr<QuicPacket> data( | 2195 scoped_ptr<QuicPacket> data( |
2289 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); | 2196 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); |
2290 ASSERT_TRUE(data != NULL); | 2197 ASSERT_TRUE(data != NULL); |
2291 | 2198 |
2292 test::CompareCharArraysWithHexError("constructed packet", | 2199 test::CompareCharArraysWithHexError("constructed packet", |
2293 data->data(), data->length(), | 2200 data->data(), |
2294 AsChars(packet), arraysize(packet)); | 2201 data->length(), |
| 2202 AsChars(packet), |
| 2203 arraysize(packet)); |
2295 } | 2204 } |
2296 | 2205 |
2297 TEST_P(QuicFramerTest, AckFrame500Nacks15) { | 2206 TEST_P(QuicFramerTest, AckFrame500Nacks15) { |
2298 if (framer_.version() != QUIC_VERSION_15) { | 2207 if (framer_.version() != QUIC_VERSION_15) { |
2299 return; | 2208 return; |
2300 } | 2209 } |
2301 unsigned char packet[] = { | 2210 unsigned char packet[] = { |
2302 // public flags (8 byte connection_id) | 2211 // public flags (8 byte connection_id) |
2303 0x3C, | 2212 0x3C, |
2304 // connection_id | 2213 // connection_id |
2305 0x10, 0x32, 0x54, 0x76, | 2214 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2306 0x98, 0xBA, 0xDC, 0xFE, | 2215 // packet sequence number |
2307 // packet sequence number | 2216 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2308 0xA8, 0x9A, 0x78, 0x56, | 2217 // private flags (entropy) |
2309 0x34, 0x12, | 2218 0x01, |
2310 // private flags (entropy) | |
2311 0x01, | |
2312 | 2219 |
2313 // frame type (ack frame) | 2220 // frame type (ack frame) |
2314 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2221 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2315 0x6C, | 2222 0x6C, |
2316 // entropy hash of sent packets till least awaiting - 1. | 2223 // entropy hash of sent packets till least awaiting - 1. |
2317 0xAB, | 2224 0xAB, |
2318 // least packet sequence number awaiting an ack, delta from sequence number. | 2225 // least packet sequence number awaiting an ack, delta from sequence |
2319 0x08, 0x00, 0x00, 0x00, | 2226 // number. |
2320 0x00, 0x00, | 2227 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
2321 // entropy hash of all received packets. | 2228 // entropy hash of all received packets. |
2322 0xBA, | 2229 0xBA, |
2323 // largest observed packet sequence number | 2230 // largest observed packet sequence number |
2324 0xBF, 0x9A, 0x78, 0x56, | 2231 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2325 0x34, 0x12, | 2232 // Zero delta time. |
2326 // Zero delta time. | 2233 0x0, 0x0, |
2327 0x0, 0x0, | 2234 // num missing packet ranges |
2328 // num missing packet ranges | 2235 0x02, |
2329 0x02, | 2236 // missing packet delta |
2330 // missing packet delta | 2237 0x01, |
2331 0x01, | 2238 // 243 more missing packets in range. |
2332 // 243 more missing packets in range. | 2239 // The ranges are listed in this order so the re-constructed packet |
2333 // The ranges are listed in this order so the re-constructed packet matches. | 2240 // matches. |
2334 0xF3, | 2241 0xF3, |
2335 // No gap between ranges | 2242 // No gap between ranges |
2336 0x00, | 2243 0x00, |
2337 // 255 more missing packets in range. | 2244 // 255 more missing packets in range. |
2338 0xFF, | 2245 0xFF, |
2339 // No revived packets. | 2246 // No revived packets. |
2340 0x00, | 2247 0x00, |
2341 }; | 2248 }; |
2342 | 2249 |
2343 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2250 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2344 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2251 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2345 | 2252 |
2346 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2253 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2347 ASSERT_TRUE(visitor_.header_.get()); | 2254 ASSERT_TRUE(visitor_.header_.get()); |
2348 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2255 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2349 | 2256 |
2350 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2257 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
(...skipping 14 matching lines...) Expand all Loading... |
2365 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); | 2272 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); |
2366 | 2273 |
2367 // Verify that the packet re-serializes identically. | 2274 // Verify that the packet re-serializes identically. |
2368 QuicFrames frames; | 2275 QuicFrames frames; |
2369 frames.push_back(QuicFrame(frame)); | 2276 frames.push_back(QuicFrame(frame)); |
2370 scoped_ptr<QuicPacket> data( | 2277 scoped_ptr<QuicPacket> data( |
2371 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); | 2278 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); |
2372 ASSERT_TRUE(data != NULL); | 2279 ASSERT_TRUE(data != NULL); |
2373 | 2280 |
2374 test::CompareCharArraysWithHexError("constructed packet", | 2281 test::CompareCharArraysWithHexError("constructed packet", |
2375 data->data(), data->length(), | 2282 data->data(), |
2376 AsChars(packet), arraysize(packet)); | 2283 data->length(), |
| 2284 AsChars(packet), |
| 2285 arraysize(packet)); |
2377 } | 2286 } |
2378 | 2287 |
2379 TEST_P(QuicFramerTest, CongestionFeedbackFrameTCP) { | 2288 TEST_P(QuicFramerTest, CongestionFeedbackFrameTCP) { |
2380 unsigned char packet[] = { | 2289 unsigned char packet[] = {// public flags (8 byte connection_id) |
2381 // public flags (8 byte connection_id) | 2290 0x3C, |
2382 0x3C, | 2291 // connection_id |
2383 // connection_id | 2292 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2384 0x10, 0x32, 0x54, 0x76, | 2293 // packet sequence number |
2385 0x98, 0xBA, 0xDC, 0xFE, | 2294 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2386 // packet sequence number | 2295 // private flags |
2387 0xBC, 0x9A, 0x78, 0x56, | 2296 0x00, |
2388 0x34, 0x12, | |
2389 // private flags | |
2390 0x00, | |
2391 | 2297 |
2392 // frame type (congestion feedback frame) | 2298 // frame type (congestion feedback frame) |
2393 0x20, | 2299 0x20, |
2394 // congestion feedback type (tcp) | 2300 // congestion feedback type (tcp) |
2395 0x00, | 2301 0x00, |
2396 // ack_frame.feedback.tcp.receive_window | 2302 // ack_frame.feedback.tcp.receive_window |
2397 0x03, 0x04, | 2303 0x03, 0x04, |
2398 }; | 2304 }; |
2399 | 2305 |
2400 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2306 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2401 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2307 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2402 | 2308 |
2403 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2309 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2404 ASSERT_TRUE(visitor_.header_.get()); | 2310 ASSERT_TRUE(visitor_.header_.get()); |
2405 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2311 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2406 | 2312 |
2407 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2313 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2408 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); | 2314 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); |
2409 const QuicCongestionFeedbackFrame& frame = | 2315 const QuicCongestionFeedbackFrame& frame = |
2410 *visitor_.congestion_feedback_frames_[0]; | 2316 *visitor_.congestion_feedback_frames_[0]; |
2411 ASSERT_EQ(kTCP, frame.type); | 2317 ASSERT_EQ(kTCP, frame.type); |
2412 EXPECT_EQ(0x4030u, frame.tcp.receive_window); | 2318 EXPECT_EQ(0x4030u, frame.tcp.receive_window); |
2413 | 2319 |
2414 // Now test framing boundaries | 2320 // Now test framing boundaries |
2415 for (size_t i = kQuicFrameTypeSize; i < 4; ++i) { | 2321 for (size_t i = kQuicFrameTypeSize; i < 4; ++i) { |
2416 string expected_error; | 2322 string expected_error; |
2417 if (i < 2) { | 2323 if (i < 2) { |
2418 expected_error = "Unable to read congestion feedback type."; | 2324 expected_error = "Unable to read congestion feedback type."; |
2419 } else if (i < 4) { | 2325 } else if (i < 4) { |
2420 expected_error = "Unable to read receive window."; | 2326 expected_error = "Unable to read receive window."; |
2421 } | 2327 } |
2422 CheckProcessingFails( | 2328 CheckProcessingFails(packet, |
2423 packet, | 2329 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
2424 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2330 !kIncludeVersion, |
2425 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2331 PACKET_6BYTE_SEQUENCE_NUMBER, |
2426 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); | 2332 NOT_IN_FEC_GROUP), |
| 2333 expected_error, |
| 2334 QUIC_INVALID_CONGESTION_FEEDBACK_DATA); |
2427 } | 2335 } |
2428 } | 2336 } |
2429 | 2337 |
2430 TEST_P(QuicFramerTest, CongestionFeedbackFrameInterArrival) { | 2338 TEST_P(QuicFramerTest, CongestionFeedbackFrameInterArrival) { |
2431 unsigned char packet[] = { | 2339 unsigned char packet[] = {// public flags (8 byte connection_id) |
2432 // public flags (8 byte connection_id) | 2340 0x3C, |
2433 0x3C, | 2341 // connection_id |
2434 // connection_id | 2342 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2435 0x10, 0x32, 0x54, 0x76, | 2343 // packet sequence number |
2436 0x98, 0xBA, 0xDC, 0xFE, | 2344 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2437 // packet sequence number | 2345 // private flags |
2438 0xBC, 0x9A, 0x78, 0x56, | 2346 0x00, |
2439 0x34, 0x12, | |
2440 // private flags | |
2441 0x00, | |
2442 | 2347 |
2443 // frame type (congestion feedback frame) | 2348 // frame type (congestion feedback frame) |
2444 0x20, | 2349 0x20, |
2445 // congestion feedback type (inter arrival) | 2350 // congestion feedback type (inter arrival) |
2446 0x01, | 2351 0x01, |
2447 // num received packets | 2352 // num received packets |
2448 0x03, | 2353 0x03, |
2449 // lowest sequence number | 2354 // lowest sequence number |
2450 0xBA, 0x9A, 0x78, 0x56, | 2355 0xBA, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2451 0x34, 0x12, | 2356 // receive time |
2452 // receive time | 2357 0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2, 0xE1, 0x07, |
2453 0x87, 0x96, 0xA5, 0xB4, | 2358 // sequence delta |
2454 0xC3, 0xD2, 0xE1, 0x07, | 2359 0x01, 0x00, |
2455 // sequence delta | 2360 // time delta |
2456 0x01, 0x00, | 2361 0x01, 0x00, 0x00, 0x00, |
2457 // time delta | 2362 // sequence delta (skip one packet) |
2458 0x01, 0x00, 0x00, 0x00, | 2363 0x03, 0x00, |
2459 // sequence delta (skip one packet) | 2364 // time delta |
2460 0x03, 0x00, | 2365 0x02, 0x00, 0x00, 0x00, |
2461 // time delta | |
2462 0x02, 0x00, 0x00, 0x00, | |
2463 }; | 2366 }; |
2464 | 2367 |
2465 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2368 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2466 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2369 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2467 | 2370 |
2468 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2371 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2469 ASSERT_TRUE(visitor_.header_.get()); | 2372 ASSERT_TRUE(visitor_.header_.get()); |
2470 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2373 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2471 | 2374 |
2472 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2375 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
(...skipping 29 matching lines...) Expand all Loading... |
2502 expected_error = "Unable to read time received."; | 2405 expected_error = "Unable to read time received."; |
2503 } else if (i < 19) { | 2406 } else if (i < 19) { |
2504 expected_error = "Unable to read sequence delta in received packets."; | 2407 expected_error = "Unable to read sequence delta in received packets."; |
2505 } else if (i < 23) { | 2408 } else if (i < 23) { |
2506 expected_error = "Unable to read time delta in received packets."; | 2409 expected_error = "Unable to read time delta in received packets."; |
2507 } else if (i < 25) { | 2410 } else if (i < 25) { |
2508 expected_error = "Unable to read sequence delta in received packets."; | 2411 expected_error = "Unable to read sequence delta in received packets."; |
2509 } else if (i < 29) { | 2412 } else if (i < 29) { |
2510 expected_error = "Unable to read time delta in received packets."; | 2413 expected_error = "Unable to read time delta in received packets."; |
2511 } | 2414 } |
2512 CheckProcessingFails( | 2415 CheckProcessingFails(packet, |
2513 packet, | 2416 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
2514 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2417 !kIncludeVersion, |
2515 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2418 PACKET_6BYTE_SEQUENCE_NUMBER, |
2516 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); | 2419 NOT_IN_FEC_GROUP), |
| 2420 expected_error, |
| 2421 QUIC_INVALID_CONGESTION_FEEDBACK_DATA); |
2517 } | 2422 } |
2518 } | 2423 } |
2519 | 2424 |
2520 TEST_P(QuicFramerTest, CongestionFeedbackFrameFixRate) { | 2425 TEST_P(QuicFramerTest, CongestionFeedbackFrameFixRate) { |
2521 unsigned char packet[] = { | 2426 unsigned char packet[] = {// public flags (8 byte connection_id) |
2522 // public flags (8 byte connection_id) | 2427 0x3C, |
2523 0x3C, | 2428 // connection_id |
2524 // connection_id | 2429 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2525 0x10, 0x32, 0x54, 0x76, | 2430 // packet sequence number |
2526 0x98, 0xBA, 0xDC, 0xFE, | 2431 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2527 // packet sequence number | 2432 // private flags |
2528 0xBC, 0x9A, 0x78, 0x56, | 2433 0x00, |
2529 0x34, 0x12, | |
2530 // private flags | |
2531 0x00, | |
2532 | 2434 |
2533 // frame type (congestion feedback frame) | 2435 // frame type (congestion feedback frame) |
2534 0x20, | 2436 0x20, |
2535 // congestion feedback type (fix rate) | 2437 // congestion feedback type (fix rate) |
2536 0x02, | 2438 0x02, |
2537 // bitrate_in_bytes_per_second; | 2439 // bitrate_in_bytes_per_second; |
2538 0x01, 0x02, 0x03, 0x04, | 2440 0x01, 0x02, 0x03, 0x04, |
2539 }; | 2441 }; |
2540 | 2442 |
2541 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2443 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2542 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2444 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2543 | 2445 |
2544 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2446 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2545 ASSERT_TRUE(visitor_.header_.get()); | 2447 ASSERT_TRUE(visitor_.header_.get()); |
2546 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2448 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2547 | 2449 |
2548 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2450 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2549 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); | 2451 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); |
2550 const QuicCongestionFeedbackFrame& frame = | 2452 const QuicCongestionFeedbackFrame& frame = |
2551 *visitor_.congestion_feedback_frames_[0]; | 2453 *visitor_.congestion_feedback_frames_[0]; |
2552 ASSERT_EQ(kFixRate, frame.type); | 2454 ASSERT_EQ(kFixRate, frame.type); |
2553 EXPECT_EQ(static_cast<uint32>(0x04030201), | 2455 EXPECT_EQ(static_cast<uint32>(0x04030201), |
2554 frame.fix_rate.bitrate.ToBytesPerSecond()); | 2456 frame.fix_rate.bitrate.ToBytesPerSecond()); |
2555 | 2457 |
2556 // Now test framing boundaries | 2458 // Now test framing boundaries |
2557 for (size_t i = kQuicFrameTypeSize; i < 6; ++i) { | 2459 for (size_t i = kQuicFrameTypeSize; i < 6; ++i) { |
2558 string expected_error; | 2460 string expected_error; |
2559 if (i < 2) { | 2461 if (i < 2) { |
2560 expected_error = "Unable to read congestion feedback type."; | 2462 expected_error = "Unable to read congestion feedback type."; |
2561 } else if (i < 6) { | 2463 } else if (i < 6) { |
2562 expected_error = "Unable to read bitrate."; | 2464 expected_error = "Unable to read bitrate."; |
2563 } | 2465 } |
2564 CheckProcessingFails( | 2466 CheckProcessingFails(packet, |
2565 packet, | 2467 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
2566 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2468 !kIncludeVersion, |
2567 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2469 PACKET_6BYTE_SEQUENCE_NUMBER, |
2568 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); | 2470 NOT_IN_FEC_GROUP), |
| 2471 expected_error, |
| 2472 QUIC_INVALID_CONGESTION_FEEDBACK_DATA); |
2569 } | 2473 } |
2570 } | 2474 } |
2571 | 2475 |
2572 TEST_P(QuicFramerTest, CongestionFeedbackFrameInvalidFeedback) { | 2476 TEST_P(QuicFramerTest, CongestionFeedbackFrameInvalidFeedback) { |
2573 unsigned char packet[] = { | 2477 unsigned char packet[] = {// public flags (8 byte connection_id) |
2574 // public flags (8 byte connection_id) | 2478 0x3C, |
2575 0x3C, | 2479 // connection_id |
2576 // connection_id | 2480 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2577 0x10, 0x32, 0x54, 0x76, | 2481 // packet sequence number |
2578 0x98, 0xBA, 0xDC, 0xFE, | 2482 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2579 // packet sequence number | 2483 // private flags |
2580 0xBC, 0x9A, 0x78, 0x56, | 2484 0x00, |
2581 0x34, 0x12, | |
2582 // private flags | |
2583 0x00, | |
2584 | 2485 |
2585 // frame type (congestion feedback frame) | 2486 // frame type (congestion feedback frame) |
2586 0x20, | 2487 0x20, |
2587 // congestion feedback type (invalid) | 2488 // congestion feedback type (invalid) |
2588 0x03, | 2489 0x03, |
2589 }; | 2490 }; |
2590 | 2491 |
2591 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2492 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2592 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | 2493 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
2593 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2494 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2594 EXPECT_EQ(QUIC_INVALID_CONGESTION_FEEDBACK_DATA, framer_.error()); | 2495 EXPECT_EQ(QUIC_INVALID_CONGESTION_FEEDBACK_DATA, framer_.error()); |
2595 } | 2496 } |
2596 | 2497 |
2597 TEST_P(QuicFramerTest, StopWaitingFrame) { | 2498 TEST_P(QuicFramerTest, StopWaitingFrame) { |
2598 if (framer_.version() <= QUIC_VERSION_15) { | 2499 if (framer_.version() <= QUIC_VERSION_15) { |
2599 return; | 2500 return; |
2600 } | 2501 } |
2601 unsigned char packet[] = { | 2502 unsigned char packet[] = { |
2602 // public flags (8 byte connection_id) | 2503 // public flags (8 byte connection_id) |
2603 0x3C, | 2504 0x3C, |
2604 // connection_id | 2505 // connection_id |
2605 0x10, 0x32, 0x54, 0x76, | 2506 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2606 0x98, 0xBA, 0xDC, 0xFE, | 2507 // packet sequence number |
2607 // packet sequence number | 2508 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2608 0xA8, 0x9A, 0x78, 0x56, | 2509 // private flags (entropy) |
2609 0x34, 0x12, | 2510 0x01, |
2610 // private flags (entropy) | |
2611 0x01, | |
2612 | 2511 |
2613 // frame type (ack frame) | 2512 // frame type (ack frame) |
2614 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2513 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2615 0x06, | 2514 0x06, |
2616 // entropy hash of sent packets till least awaiting - 1. | 2515 // entropy hash of sent packets till least awaiting - 1. |
2617 0xAB, | 2516 0xAB, |
2618 // least packet sequence number awaiting an ack, delta from sequence number. | 2517 // least packet sequence number awaiting an ack, delta from sequence |
2619 0x08, 0x00, 0x00, 0x00, | 2518 // number. |
2620 0x00, 0x00, | 2519 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
2621 }; | 2520 }; |
2622 | 2521 |
2623 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2522 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2624 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2523 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2625 | 2524 |
2626 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2525 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2627 ASSERT_TRUE(visitor_.header_.get()); | 2526 ASSERT_TRUE(visitor_.header_.get()); |
2628 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2527 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2629 | 2528 |
2630 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2529 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2631 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size()); | 2530 ASSERT_EQ(1u, visitor_.stop_waiting_frames_.size()); |
2632 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0]; | 2531 const QuicStopWaitingFrame& frame = *visitor_.stop_waiting_frames_[0]; |
2633 EXPECT_EQ(0xAB, frame.entropy_hash); | 2532 EXPECT_EQ(0xAB, frame.entropy_hash); |
2634 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.least_unacked); | 2533 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.least_unacked); |
2635 | 2534 |
2636 const size_t kSentEntropyOffset = kQuicFrameTypeSize; | 2535 const size_t kSentEntropyOffset = kQuicFrameTypeSize; |
2637 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; | 2536 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; |
2638 const size_t frame_size = 7; | 2537 const size_t frame_size = 7; |
2639 for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) { | 2538 for (size_t i = kQuicFrameTypeSize; i < frame_size; ++i) { |
2640 string expected_error; | 2539 string expected_error; |
2641 if (i < kLeastUnackedOffset) { | 2540 if (i < kLeastUnackedOffset) { |
2642 expected_error = "Unable to read entropy hash for sent packets."; | 2541 expected_error = "Unable to read entropy hash for sent packets."; |
2643 } else { | 2542 } else { |
2644 expected_error = "Unable to read least unacked delta."; | 2543 expected_error = "Unable to read least unacked delta."; |
2645 } | 2544 } |
2646 CheckProcessingFails( | 2545 CheckProcessingFails(packet, |
2647 packet, | 2546 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
2648 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2547 !kIncludeVersion, |
2649 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2548 PACKET_6BYTE_SEQUENCE_NUMBER, |
2650 expected_error, QUIC_INVALID_STOP_WAITING_DATA); | 2549 NOT_IN_FEC_GROUP), |
| 2550 expected_error, |
| 2551 QUIC_INVALID_STOP_WAITING_DATA); |
2651 } | 2552 } |
2652 } | 2553 } |
2653 | 2554 |
2654 TEST_P(QuicFramerTest, RstStreamFrameQuic) { | 2555 TEST_P(QuicFramerTest, RstStreamFrameQuic) { |
2655 unsigned char packet[] = { | 2556 unsigned char packet[] = {// public flags (8 byte connection_id) |
2656 // public flags (8 byte connection_id) | 2557 0x3C, |
2657 0x3C, | 2558 // connection_id |
2658 // connection_id | 2559 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2659 0x10, 0x32, 0x54, 0x76, | 2560 // packet sequence number |
2660 0x98, 0xBA, 0xDC, 0xFE, | 2561 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2661 // packet sequence number | 2562 // private flags |
2662 0xBC, 0x9A, 0x78, 0x56, | 2563 0x00, |
2663 0x34, 0x12, | |
2664 // private flags | |
2665 0x00, | |
2666 | 2564 |
2667 // frame type (rst stream frame) | 2565 // frame type (rst stream frame) |
2668 0x01, | 2566 0x01, |
2669 // stream id | 2567 // stream id |
2670 0x04, 0x03, 0x02, 0x01, | 2568 0x04, 0x03, 0x02, 0x01, |
2671 | 2569 |
2672 // sent byte offset | 2570 // sent byte offset |
2673 0x01, 0x02, 0x03, 0x04, | 2571 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, |
2674 0x05, 0x06, 0x07, 0x08, | |
2675 | 2572 |
2676 // error code | 2573 // error code |
2677 0x01, 0x00, 0x00, 0x00, | 2574 0x01, 0x00, 0x00, 0x00, |
2678 | 2575 |
2679 // error details length | 2576 // error details length |
2680 0x0d, 0x00, | 2577 0x0d, 0x00, |
2681 // error details | 2578 // error details |
2682 'b', 'e', 'c', 'a', | 2579 'b', 'e', 'c', 'a', 'u', 's', 'e', ' ', |
2683 'u', 's', 'e', ' ', | 2580 'I', ' ', 'c', 'a', 'n', |
2684 'I', ' ', 'c', 'a', | |
2685 'n', | |
2686 }; | 2581 }; |
2687 | 2582 |
2688 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2583 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2689 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2584 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2690 | 2585 |
2691 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2586 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2692 ASSERT_TRUE(visitor_.header_.get()); | 2587 ASSERT_TRUE(visitor_.header_.get()); |
2693 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2588 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2694 | 2589 |
2695 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.rst_stream_frame_.stream_id); | 2590 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.rst_stream_frame_.stream_id); |
2696 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code); | 2591 EXPECT_EQ(0x01, visitor_.rst_stream_frame_.error_code); |
2697 EXPECT_EQ("because I can", visitor_.rst_stream_frame_.error_details); | 2592 EXPECT_EQ("because I can", visitor_.rst_stream_frame_.error_details); |
2698 EXPECT_EQ(GG_UINT64_C(0x0807060504030201), | 2593 EXPECT_EQ(GG_UINT64_C(0x0807060504030201), |
2699 visitor_.rst_stream_frame_.byte_offset); | 2594 visitor_.rst_stream_frame_.byte_offset); |
2700 | 2595 |
2701 // Now test framing boundaries | 2596 // Now test framing boundaries |
2702 for (size_t i = kQuicFrameTypeSize; | 2597 for (size_t i = kQuicFrameTypeSize; |
2703 i < QuicFramer::GetMinRstStreamFrameSize(version_); ++i) { | 2598 i < QuicFramer::GetMinRstStreamFrameSize(version_); |
| 2599 ++i) { |
2704 string expected_error; | 2600 string expected_error; |
2705 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { | 2601 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { |
2706 expected_error = "Unable to read stream_id."; | 2602 expected_error = "Unable to read stream_id."; |
2707 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + | 2603 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + |
2708 + kQuicMaxStreamOffsetSize) { | 2604 +kQuicMaxStreamOffsetSize) { |
2709 expected_error = "Unable to read rst stream sent byte offset."; | 2605 expected_error = "Unable to read rst stream sent byte offset."; |
2710 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + | 2606 } else if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize + |
2711 + kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) { | 2607 +kQuicMaxStreamOffsetSize + kQuicErrorCodeSize) { |
2712 expected_error = "Unable to read rst stream error code."; | 2608 expected_error = "Unable to read rst stream error code."; |
2713 } else { | 2609 } else { |
2714 expected_error = "Unable to read rst stream error details."; | 2610 expected_error = "Unable to read rst stream error details."; |
2715 } | 2611 } |
2716 CheckProcessingFails( | 2612 CheckProcessingFails(packet, |
2717 packet, | 2613 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
2718 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2614 !kIncludeVersion, |
2719 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2615 PACKET_6BYTE_SEQUENCE_NUMBER, |
2720 expected_error, QUIC_INVALID_RST_STREAM_DATA); | 2616 NOT_IN_FEC_GROUP), |
| 2617 expected_error, |
| 2618 QUIC_INVALID_RST_STREAM_DATA); |
2721 } | 2619 } |
2722 } | 2620 } |
2723 | 2621 |
2724 TEST_P(QuicFramerTest, ConnectionCloseFrame) { | 2622 TEST_P(QuicFramerTest, ConnectionCloseFrame) { |
2725 unsigned char packet[] = { | 2623 unsigned char packet[] = {// public flags (8 byte connection_id) |
2726 // public flags (8 byte connection_id) | 2624 0x3C, |
2727 0x3C, | 2625 // connection_id |
2728 // connection_id | 2626 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2729 0x10, 0x32, 0x54, 0x76, | 2627 // packet sequence number |
2730 0x98, 0xBA, 0xDC, 0xFE, | 2628 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2731 // packet sequence number | 2629 // private flags |
2732 0xBC, 0x9A, 0x78, 0x56, | 2630 0x00, |
2733 0x34, 0x12, | |
2734 // private flags | |
2735 0x00, | |
2736 | 2631 |
2737 // frame type (connection close frame) | 2632 // frame type (connection close frame) |
2738 0x02, | 2633 0x02, |
2739 // error code | 2634 // error code |
2740 0x11, 0x00, 0x00, 0x00, | 2635 0x11, 0x00, 0x00, 0x00, |
2741 | 2636 |
2742 // error details length | 2637 // error details length |
2743 0x0d, 0x00, | 2638 0x0d, 0x00, |
2744 // error details | 2639 // error details |
2745 'b', 'e', 'c', 'a', | 2640 'b', 'e', 'c', 'a', 'u', 's', 'e', ' ', |
2746 'u', 's', 'e', ' ', | 2641 'I', ' ', 'c', 'a', 'n', |
2747 'I', ' ', 'c', 'a', | |
2748 'n', | |
2749 }; | 2642 }; |
2750 | 2643 |
2751 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2644 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2752 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2645 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2753 | 2646 |
2754 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2647 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2755 ASSERT_TRUE(visitor_.header_.get()); | 2648 ASSERT_TRUE(visitor_.header_.get()); |
2756 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2649 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2757 | 2650 |
2758 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2651 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2759 | 2652 |
2760 EXPECT_EQ(0x11, visitor_.connection_close_frame_.error_code); | 2653 EXPECT_EQ(0x11, visitor_.connection_close_frame_.error_code); |
2761 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details); | 2654 EXPECT_EQ("because I can", visitor_.connection_close_frame_.error_details); |
2762 | 2655 |
2763 ASSERT_EQ(0u, visitor_.ack_frames_.size()); | 2656 ASSERT_EQ(0u, visitor_.ack_frames_.size()); |
2764 | 2657 |
2765 // Now test framing boundaries | 2658 // Now test framing boundaries |
2766 for (size_t i = kQuicFrameTypeSize; | 2659 for (size_t i = kQuicFrameTypeSize; |
2767 i < QuicFramer::GetMinConnectionCloseFrameSize(); ++i) { | 2660 i < QuicFramer::GetMinConnectionCloseFrameSize(); |
| 2661 ++i) { |
2768 string expected_error; | 2662 string expected_error; |
2769 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { | 2663 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { |
2770 expected_error = "Unable to read connection close error code."; | 2664 expected_error = "Unable to read connection close error code."; |
2771 } else { | 2665 } else { |
2772 expected_error = "Unable to read connection close error details."; | 2666 expected_error = "Unable to read connection close error details."; |
2773 } | 2667 } |
2774 CheckProcessingFails( | 2668 CheckProcessingFails(packet, |
2775 packet, | 2669 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
2776 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2670 !kIncludeVersion, |
2777 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2671 PACKET_6BYTE_SEQUENCE_NUMBER, |
2778 expected_error, QUIC_INVALID_CONNECTION_CLOSE_DATA); | 2672 NOT_IN_FEC_GROUP), |
| 2673 expected_error, |
| 2674 QUIC_INVALID_CONNECTION_CLOSE_DATA); |
2779 } | 2675 } |
2780 } | 2676 } |
2781 | 2677 |
2782 TEST_P(QuicFramerTest, GoAwayFrame) { | 2678 TEST_P(QuicFramerTest, GoAwayFrame) { |
2783 unsigned char packet[] = { | 2679 unsigned char packet[] = {// public flags (8 byte connection_id) |
2784 // public flags (8 byte connection_id) | 2680 0x3C, |
2785 0x3C, | 2681 // connection_id |
2786 // connection_id | 2682 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2787 0x10, 0x32, 0x54, 0x76, | 2683 // packet sequence number |
2788 0x98, 0xBA, 0xDC, 0xFE, | 2684 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2789 // packet sequence number | 2685 // private flags |
2790 0xBC, 0x9A, 0x78, 0x56, | 2686 0x00, |
2791 0x34, 0x12, | |
2792 // private flags | |
2793 0x00, | |
2794 | 2687 |
2795 // frame type (go away frame) | 2688 // frame type (go away frame) |
2796 0x03, | 2689 0x03, |
2797 // error code | 2690 // error code |
2798 0x09, 0x00, 0x00, 0x00, | 2691 0x09, 0x00, 0x00, 0x00, |
2799 // stream id | 2692 // stream id |
2800 0x04, 0x03, 0x02, 0x01, | 2693 0x04, 0x03, 0x02, 0x01, |
2801 // error details length | 2694 // error details length |
2802 0x0d, 0x00, | 2695 0x0d, 0x00, |
2803 // error details | 2696 // error details |
2804 'b', 'e', 'c', 'a', | 2697 'b', 'e', 'c', 'a', 'u', 's', 'e', ' ', |
2805 'u', 's', 'e', ' ', | 2698 'I', ' ', 'c', 'a', 'n', |
2806 'I', ' ', 'c', 'a', | |
2807 'n', | |
2808 }; | 2699 }; |
2809 | 2700 |
2810 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2701 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2811 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2702 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2812 | 2703 |
2813 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2704 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2814 ASSERT_TRUE(visitor_.header_.get()); | 2705 ASSERT_TRUE(visitor_.header_.get()); |
2815 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2706 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2816 | 2707 |
2817 EXPECT_EQ(GG_UINT64_C(0x01020304), | 2708 EXPECT_EQ(GG_UINT64_C(0x01020304), |
2818 visitor_.goaway_frame_.last_good_stream_id); | 2709 visitor_.goaway_frame_.last_good_stream_id); |
2819 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code); | 2710 EXPECT_EQ(0x9, visitor_.goaway_frame_.error_code); |
2820 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase); | 2711 EXPECT_EQ("because I can", visitor_.goaway_frame_.reason_phrase); |
2821 | 2712 |
2822 const size_t reason_size = arraysize("because I can") - 1; | 2713 const size_t reason_size = arraysize("because I can") - 1; |
2823 // Now test framing boundaries | 2714 // Now test framing boundaries |
2824 for (size_t i = kQuicFrameTypeSize; | 2715 for (size_t i = kQuicFrameTypeSize; |
2825 i < QuicFramer::GetMinGoAwayFrameSize() + reason_size; ++i) { | 2716 i < QuicFramer::GetMinGoAwayFrameSize() + reason_size; |
| 2717 ++i) { |
2826 string expected_error; | 2718 string expected_error; |
2827 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { | 2719 if (i < kQuicFrameTypeSize + kQuicErrorCodeSize) { |
2828 expected_error = "Unable to read go away error code."; | 2720 expected_error = "Unable to read go away error code."; |
2829 } else if (i < kQuicFrameTypeSize + kQuicErrorCodeSize + | 2721 } else if (i < |
2830 kQuicMaxStreamIdSize) { | 2722 kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicMaxStreamIdSize) { |
2831 expected_error = "Unable to read last good stream id."; | 2723 expected_error = "Unable to read last good stream id."; |
2832 } else { | 2724 } else { |
2833 expected_error = "Unable to read goaway reason."; | 2725 expected_error = "Unable to read goaway reason."; |
2834 } | 2726 } |
2835 CheckProcessingFails( | 2727 CheckProcessingFails(packet, |
2836 packet, | 2728 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
2837 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2729 !kIncludeVersion, |
2838 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2730 PACKET_6BYTE_SEQUENCE_NUMBER, |
2839 expected_error, QUIC_INVALID_GOAWAY_DATA); | 2731 NOT_IN_FEC_GROUP), |
| 2732 expected_error, |
| 2733 QUIC_INVALID_GOAWAY_DATA); |
2840 } | 2734 } |
2841 } | 2735 } |
2842 | 2736 |
2843 TEST_P(QuicFramerTest, WindowUpdateFrame) { | 2737 TEST_P(QuicFramerTest, WindowUpdateFrame) { |
2844 unsigned char packet[] = { | 2738 unsigned char packet[] = {// public flags (8 byte connection_id) |
2845 // public flags (8 byte connection_id) | 2739 0x3C, |
2846 0x3C, | 2740 // connection_id |
2847 // connection_id | 2741 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2848 0x10, 0x32, 0x54, 0x76, | 2742 // packet sequence number |
2849 0x98, 0xBA, 0xDC, 0xFE, | 2743 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2850 // packet sequence number | 2744 // private flags |
2851 0xBC, 0x9A, 0x78, 0x56, | 2745 0x00, |
2852 0x34, 0x12, | |
2853 // private flags | |
2854 0x00, | |
2855 | 2746 |
2856 // frame type (window update frame) | 2747 // frame type (window update frame) |
2857 0x04, | 2748 0x04, |
2858 // stream id | 2749 // stream id |
2859 0x04, 0x03, 0x02, 0x01, | 2750 0x04, 0x03, 0x02, 0x01, |
2860 // byte offset | 2751 // byte offset |
2861 0x05, 0x06, 0x07, 0x08, | 2752 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, |
2862 0x09, 0x0a, 0x0b, 0x0c, | |
2863 }; | 2753 }; |
2864 | 2754 |
2865 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2755 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2866 | 2756 |
2867 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2757 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2868 | 2758 |
2869 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2759 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2870 ASSERT_TRUE(visitor_.header_.get()); | 2760 ASSERT_TRUE(visitor_.header_.get()); |
2871 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2761 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2872 | 2762 |
2873 EXPECT_EQ(GG_UINT64_C(0x01020304), | 2763 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.window_update_frame_.stream_id); |
2874 visitor_.window_update_frame_.stream_id); | |
2875 EXPECT_EQ(GG_UINT64_C(0x0c0b0a0908070605), | 2764 EXPECT_EQ(GG_UINT64_C(0x0c0b0a0908070605), |
2876 visitor_.window_update_frame_.byte_offset); | 2765 visitor_.window_update_frame_.byte_offset); |
2877 | 2766 |
2878 // Now test framing boundaries | 2767 // Now test framing boundaries |
2879 for (size_t i = kQuicFrameTypeSize; | 2768 for (size_t i = kQuicFrameTypeSize; |
2880 i < QuicFramer::GetWindowUpdateFrameSize(); ++i) { | 2769 i < QuicFramer::GetWindowUpdateFrameSize(); |
| 2770 ++i) { |
2881 string expected_error; | 2771 string expected_error; |
2882 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { | 2772 if (i < kQuicFrameTypeSize + kQuicMaxStreamIdSize) { |
2883 expected_error = "Unable to read stream_id."; | 2773 expected_error = "Unable to read stream_id."; |
2884 } else { | 2774 } else { |
2885 expected_error = "Unable to read window byte_offset."; | 2775 expected_error = "Unable to read window byte_offset."; |
2886 } | 2776 } |
2887 CheckProcessingFails( | 2777 CheckProcessingFails(packet, |
2888 packet, | 2778 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
2889 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2779 !kIncludeVersion, |
2890 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2780 PACKET_6BYTE_SEQUENCE_NUMBER, |
2891 expected_error, QUIC_INVALID_WINDOW_UPDATE_DATA); | 2781 NOT_IN_FEC_GROUP), |
| 2782 expected_error, |
| 2783 QUIC_INVALID_WINDOW_UPDATE_DATA); |
2892 } | 2784 } |
2893 } | 2785 } |
2894 | 2786 |
2895 TEST_P(QuicFramerTest, BlockedFrame) { | 2787 TEST_P(QuicFramerTest, BlockedFrame) { |
2896 unsigned char packet[] = { | 2788 unsigned char packet[] = {// public flags (8 byte connection_id) |
2897 // public flags (8 byte connection_id) | 2789 0x3C, |
2898 0x3C, | 2790 // connection_id |
2899 // connection_id | 2791 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2900 0x10, 0x32, 0x54, 0x76, | 2792 // packet sequence number |
2901 0x98, 0xBA, 0xDC, 0xFE, | 2793 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2902 // packet sequence number | 2794 // private flags |
2903 0xBC, 0x9A, 0x78, 0x56, | 2795 0x00, |
2904 0x34, 0x12, | |
2905 // private flags | |
2906 0x00, | |
2907 | 2796 |
2908 // frame type (blocked frame) | 2797 // frame type (blocked frame) |
2909 0x05, | 2798 0x05, |
2910 // stream id | 2799 // stream id |
2911 0x04, 0x03, 0x02, 0x01, | 2800 0x04, 0x03, 0x02, 0x01, |
2912 }; | 2801 }; |
2913 | 2802 |
2914 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2803 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2915 | 2804 |
2916 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2805 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2917 | 2806 |
2918 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2807 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2919 ASSERT_TRUE(visitor_.header_.get()); | 2808 ASSERT_TRUE(visitor_.header_.get()); |
2920 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2809 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2921 | 2810 |
2922 EXPECT_EQ(GG_UINT64_C(0x01020304), | 2811 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.blocked_frame_.stream_id); |
2923 visitor_.blocked_frame_.stream_id); | |
2924 | 2812 |
2925 // Now test framing boundaries | 2813 // Now test framing boundaries |
2926 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetBlockedFrameSize(); | 2814 for (size_t i = kQuicFrameTypeSize; i < QuicFramer::GetBlockedFrameSize(); |
2927 ++i) { | 2815 ++i) { |
2928 string expected_error = "Unable to read stream_id."; | 2816 string expected_error = "Unable to read stream_id."; |
2929 CheckProcessingFails( | 2817 CheckProcessingFails(packet, |
2930 packet, | 2818 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
2931 i + GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 2819 !kIncludeVersion, |
2932 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2820 PACKET_6BYTE_SEQUENCE_NUMBER, |
2933 expected_error, QUIC_INVALID_BLOCKED_DATA); | 2821 NOT_IN_FEC_GROUP), |
| 2822 expected_error, |
| 2823 QUIC_INVALID_BLOCKED_DATA); |
2934 } | 2824 } |
2935 } | 2825 } |
2936 | 2826 |
2937 TEST_P(QuicFramerTest, PingFrame) { | 2827 TEST_P(QuicFramerTest, PingFrame) { |
2938 if (version_ <= QUIC_VERSION_17) { | 2828 if (version_ <= QUIC_VERSION_17) { |
2939 return; | 2829 return; |
2940 } | 2830 } |
2941 | 2831 |
2942 unsigned char packet[] = { | 2832 unsigned char packet[] = {// public flags (8 byte connection_id) |
2943 // public flags (8 byte connection_id) | 2833 0x3C, |
2944 0x3C, | 2834 // connection_id |
2945 // connection_id | 2835 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2946 0x10, 0x32, 0x54, 0x76, | 2836 // packet sequence number |
2947 0x98, 0xBA, 0xDC, 0xFE, | 2837 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2948 // packet sequence number | 2838 // private flags |
2949 0xBC, 0x9A, 0x78, 0x56, | 2839 0x00, |
2950 0x34, 0x12, | |
2951 // private flags | |
2952 0x00, | |
2953 | 2840 |
2954 // frame type (ping frame) | 2841 // frame type (ping frame) |
2955 0x07, | 2842 0x07, |
2956 }; | 2843 }; |
2957 | 2844 |
2958 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2845 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2959 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2846 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2960 | 2847 |
2961 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2848 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2962 ASSERT_TRUE(visitor_.header_.get()); | 2849 ASSERT_TRUE(visitor_.header_.get()); |
2963 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2850 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
2964 | 2851 |
2965 EXPECT_EQ(1u, visitor_.ping_frames_.size()); | 2852 EXPECT_EQ(1u, visitor_.ping_frames_.size()); |
2966 | 2853 |
2967 // No need to check the PING frame boundaries because it has no payload. | 2854 // No need to check the PING frame boundaries because it has no payload. |
2968 } | 2855 } |
2969 | 2856 |
2970 TEST_P(QuicFramerTest, PublicResetPacket) { | 2857 TEST_P(QuicFramerTest, PublicResetPacket) { |
2971 unsigned char packet[] = { | 2858 unsigned char packet[] = {// public flags (public reset, 8 byte connection_id) |
2972 // public flags (public reset, 8 byte connection_id) | 2859 0x0E, |
2973 0x0E, | 2860 // connection_id |
2974 // connection_id | 2861 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2975 0x10, 0x32, 0x54, 0x76, | 2862 // message tag (kPRST) |
2976 0x98, 0xBA, 0xDC, 0xFE, | 2863 'P', 'R', 'S', 'T', |
2977 // message tag (kPRST) | 2864 // num_entries (2) + padding |
2978 'P', 'R', 'S', 'T', | 2865 0x02, 0x00, 0x00, 0x00, |
2979 // num_entries (2) + padding | 2866 // tag kRNON |
2980 0x02, 0x00, 0x00, 0x00, | 2867 'R', 'N', 'O', 'N', |
2981 // tag kRNON | 2868 // end offset 8 |
2982 'R', 'N', 'O', 'N', | 2869 0x08, 0x00, 0x00, 0x00, |
2983 // end offset 8 | 2870 // tag kRSEQ |
2984 0x08, 0x00, 0x00, 0x00, | 2871 'R', 'S', 'E', 'Q', |
2985 // tag kRSEQ | 2872 // end offset 16 |
2986 'R', 'S', 'E', 'Q', | 2873 0x10, 0x00, 0x00, 0x00, |
2987 // end offset 16 | 2874 // nonce proof |
2988 0x10, 0x00, 0x00, 0x00, | 2875 0x89, 0x67, 0x45, 0x23, 0x01, 0xEF, 0xCD, 0xAB, |
2989 // nonce proof | 2876 // rejected sequence number |
2990 0x89, 0x67, 0x45, 0x23, | 2877 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, |
2991 0x01, 0xEF, 0xCD, 0xAB, | |
2992 // rejected sequence number | |
2993 0xBC, 0x9A, 0x78, 0x56, | |
2994 0x34, 0x12, 0x00, 0x00, | |
2995 }; | 2878 }; |
2996 | 2879 |
2997 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2880 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2998 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2881 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2999 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); | 2882 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); |
3000 ASSERT_TRUE(visitor_.public_reset_packet_.get()); | 2883 ASSERT_TRUE(visitor_.public_reset_packet_.get()); |
3001 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 2884 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
3002 visitor_.public_reset_packet_->public_header.connection_id); | 2885 visitor_.public_reset_packet_->public_header.connection_id); |
3003 EXPECT_TRUE(visitor_.public_reset_packet_->public_header.reset_flag); | 2886 EXPECT_TRUE(visitor_.public_reset_packet_->public_header.reset_flag); |
3004 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); | 2887 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); |
3005 EXPECT_EQ(GG_UINT64_C(0xABCDEF0123456789), | 2888 EXPECT_EQ(GG_UINT64_C(0xABCDEF0123456789), |
3006 visitor_.public_reset_packet_->nonce_proof); | 2889 visitor_.public_reset_packet_->nonce_proof); |
3007 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 2890 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
3008 visitor_.public_reset_packet_->rejected_sequence_number); | 2891 visitor_.public_reset_packet_->rejected_sequence_number); |
3009 EXPECT_TRUE( | 2892 EXPECT_TRUE(visitor_.public_reset_packet_->client_address.address().empty()); |
3010 visitor_.public_reset_packet_->client_address.address().empty()); | |
3011 | 2893 |
3012 // Now test framing boundaries | 2894 // Now test framing boundaries |
3013 for (size_t i = 0; i < arraysize(packet); ++i) { | 2895 for (size_t i = 0; i < arraysize(packet); ++i) { |
3014 string expected_error; | 2896 string expected_error; |
3015 DVLOG(1) << "iteration: " << i; | 2897 DVLOG(1) << "iteration: " << i; |
3016 if (i < kConnectionIdOffset) { | 2898 if (i < kConnectionIdOffset) { |
3017 expected_error = "Unable to read public flags."; | 2899 expected_error = "Unable to read public flags."; |
3018 CheckProcessingFails(packet, i, expected_error, | 2900 CheckProcessingFails( |
3019 QUIC_INVALID_PACKET_HEADER); | 2901 packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
3020 } else if (i < kPublicResetPacketMessageTagOffset) { | 2902 } else if (i < kPublicResetPacketMessageTagOffset) { |
3021 expected_error = "Unable to read ConnectionId."; | 2903 expected_error = "Unable to read ConnectionId."; |
3022 CheckProcessingFails(packet, i, expected_error, | 2904 CheckProcessingFails( |
3023 QUIC_INVALID_PACKET_HEADER); | 2905 packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
3024 } else { | 2906 } else { |
3025 expected_error = "Unable to read reset message."; | 2907 expected_error = "Unable to read reset message."; |
3026 CheckProcessingFails(packet, i, expected_error, | 2908 CheckProcessingFails( |
3027 QUIC_INVALID_PUBLIC_RST_PACKET); | 2909 packet, i, expected_error, QUIC_INVALID_PUBLIC_RST_PACKET); |
3028 } | 2910 } |
3029 } | 2911 } |
3030 } | 2912 } |
3031 | 2913 |
3032 TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) { | 2914 TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) { |
3033 unsigned char packet[] = { | 2915 unsigned char packet[] = {// public flags (public reset, 8 byte connection_id) |
3034 // public flags (public reset, 8 byte connection_id) | 2916 0x0E, |
3035 0x0E, | 2917 // connection_id |
3036 // connection_id | 2918 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3037 0x10, 0x32, 0x54, 0x76, | 2919 // message tag (kPRST) |
3038 0x98, 0xBA, 0xDC, 0xFE, | 2920 'P', 'R', 'S', 'T', |
3039 // message tag (kPRST) | 2921 // num_entries (2) + padding |
3040 'P', 'R', 'S', 'T', | 2922 0x02, 0x00, 0x00, 0x00, |
3041 // num_entries (2) + padding | 2923 // tag kRNON |
3042 0x02, 0x00, 0x00, 0x00, | 2924 'R', 'N', 'O', 'N', |
3043 // tag kRNON | 2925 // end offset 8 |
3044 'R', 'N', 'O', 'N', | 2926 0x08, 0x00, 0x00, 0x00, |
3045 // end offset 8 | 2927 // tag kRSEQ |
3046 0x08, 0x00, 0x00, 0x00, | 2928 'R', 'S', 'E', 'Q', |
3047 // tag kRSEQ | 2929 // end offset 16 |
3048 'R', 'S', 'E', 'Q', | 2930 0x10, 0x00, 0x00, 0x00, |
3049 // end offset 16 | 2931 // nonce proof |
3050 0x10, 0x00, 0x00, 0x00, | 2932 0x89, 0x67, 0x45, 0x23, 0x01, 0xEF, 0xCD, 0xAB, |
3051 // nonce proof | 2933 // rejected sequence number |
3052 0x89, 0x67, 0x45, 0x23, | 2934 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, |
3053 0x01, 0xEF, 0xCD, 0xAB, | 2935 // trailing junk |
3054 // rejected sequence number | 2936 'j', 'u', 'n', 'k', |
3055 0xBC, 0x9A, 0x78, 0x56, | |
3056 0x34, 0x12, 0x00, 0x00, | |
3057 // trailing junk | |
3058 'j', 'u', 'n', 'k', | |
3059 }; | 2937 }; |
3060 | 2938 |
3061 string expected_error = "Unable to read reset message."; | 2939 string expected_error = "Unable to read reset message."; |
3062 CheckProcessingFails(packet, arraysize(packet), expected_error, | 2940 CheckProcessingFails(packet, |
| 2941 arraysize(packet), |
| 2942 expected_error, |
3063 QUIC_INVALID_PUBLIC_RST_PACKET); | 2943 QUIC_INVALID_PUBLIC_RST_PACKET); |
3064 } | 2944 } |
3065 | 2945 |
3066 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) { | 2946 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) { |
3067 unsigned char packet[] = { | 2947 unsigned char packet[] = {// public flags (public reset, 8 byte connection_id) |
3068 // public flags (public reset, 8 byte connection_id) | 2948 0x0E, |
3069 0x0E, | 2949 // connection_id |
3070 // connection_id | 2950 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3071 0x10, 0x32, 0x54, 0x76, | 2951 // message tag (kPRST) |
3072 0x98, 0xBA, 0xDC, 0xFE, | 2952 'P', 'R', 'S', 'T', |
3073 // message tag (kPRST) | 2953 // num_entries (3) + padding |
3074 'P', 'R', 'S', 'T', | 2954 0x03, 0x00, 0x00, 0x00, |
3075 // num_entries (3) + padding | 2955 // tag kRNON |
3076 0x03, 0x00, 0x00, 0x00, | 2956 'R', 'N', 'O', 'N', |
3077 // tag kRNON | 2957 // end offset 8 |
3078 'R', 'N', 'O', 'N', | 2958 0x08, 0x00, 0x00, 0x00, |
3079 // end offset 8 | 2959 // tag kRSEQ |
3080 0x08, 0x00, 0x00, 0x00, | 2960 'R', 'S', 'E', 'Q', |
3081 // tag kRSEQ | 2961 // end offset 16 |
3082 'R', 'S', 'E', 'Q', | 2962 0x10, 0x00, 0x00, 0x00, |
3083 // end offset 16 | 2963 // tag kCADR |
3084 0x10, 0x00, 0x00, 0x00, | 2964 'C', 'A', 'D', 'R', |
3085 // tag kCADR | 2965 // end offset 24 |
3086 'C', 'A', 'D', 'R', | 2966 0x18, 0x00, 0x00, 0x00, |
3087 // end offset 24 | 2967 // nonce proof |
3088 0x18, 0x00, 0x00, 0x00, | 2968 0x89, 0x67, 0x45, 0x23, 0x01, 0xEF, 0xCD, 0xAB, |
3089 // nonce proof | 2969 // rejected sequence number |
3090 0x89, 0x67, 0x45, 0x23, | 2970 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, |
3091 0x01, 0xEF, 0xCD, 0xAB, | 2971 // client address: 4.31.198.44:443 |
3092 // rejected sequence number | 2972 0x02, 0x00, 0x04, 0x1F, 0xC6, 0x2C, 0xBB, 0x01, |
3093 0xBC, 0x9A, 0x78, 0x56, | |
3094 0x34, 0x12, 0x00, 0x00, | |
3095 // client address: 4.31.198.44:443 | |
3096 0x02, 0x00, | |
3097 0x04, 0x1F, 0xC6, 0x2C, | |
3098 0xBB, 0x01, | |
3099 }; | 2973 }; |
3100 | 2974 |
3101 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2975 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
3102 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2976 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
3103 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); | 2977 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); |
3104 ASSERT_TRUE(visitor_.public_reset_packet_.get()); | 2978 ASSERT_TRUE(visitor_.public_reset_packet_.get()); |
3105 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), | 2979 EXPECT_EQ(GG_UINT64_C(0xFEDCBA9876543210), |
3106 visitor_.public_reset_packet_->public_header.connection_id); | 2980 visitor_.public_reset_packet_->public_header.connection_id); |
3107 EXPECT_TRUE(visitor_.public_reset_packet_->public_header.reset_flag); | 2981 EXPECT_TRUE(visitor_.public_reset_packet_->public_header.reset_flag); |
3108 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); | 2982 EXPECT_FALSE(visitor_.public_reset_packet_->public_header.version_flag); |
3109 EXPECT_EQ(GG_UINT64_C(0xABCDEF0123456789), | 2983 EXPECT_EQ(GG_UINT64_C(0xABCDEF0123456789), |
3110 visitor_.public_reset_packet_->nonce_proof); | 2984 visitor_.public_reset_packet_->nonce_proof); |
3111 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), | 2985 EXPECT_EQ(GG_UINT64_C(0x123456789ABC), |
3112 visitor_.public_reset_packet_->rejected_sequence_number); | 2986 visitor_.public_reset_packet_->rejected_sequence_number); |
3113 EXPECT_EQ("4.31.198.44", | 2987 EXPECT_EQ("4.31.198.44", |
3114 IPAddressToString(visitor_.public_reset_packet_-> | 2988 IPAddressToString( |
3115 client_address.address())); | 2989 visitor_.public_reset_packet_->client_address.address())); |
3116 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); | 2990 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); |
3117 | 2991 |
3118 // Now test framing boundaries | 2992 // Now test framing boundaries |
3119 for (size_t i = 0; i < arraysize(packet); ++i) { | 2993 for (size_t i = 0; i < arraysize(packet); ++i) { |
3120 string expected_error; | 2994 string expected_error; |
3121 DVLOG(1) << "iteration: " << i; | 2995 DVLOG(1) << "iteration: " << i; |
3122 if (i < kConnectionIdOffset) { | 2996 if (i < kConnectionIdOffset) { |
3123 expected_error = "Unable to read public flags."; | 2997 expected_error = "Unable to read public flags."; |
3124 CheckProcessingFails(packet, i, expected_error, | 2998 CheckProcessingFails( |
3125 QUIC_INVALID_PACKET_HEADER); | 2999 packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
3126 } else if (i < kPublicResetPacketMessageTagOffset) { | 3000 } else if (i < kPublicResetPacketMessageTagOffset) { |
3127 expected_error = "Unable to read ConnectionId."; | 3001 expected_error = "Unable to read ConnectionId."; |
3128 CheckProcessingFails(packet, i, expected_error, | 3002 CheckProcessingFails( |
3129 QUIC_INVALID_PACKET_HEADER); | 3003 packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
3130 } else { | 3004 } else { |
3131 expected_error = "Unable to read reset message."; | 3005 expected_error = "Unable to read reset message."; |
3132 CheckProcessingFails(packet, i, expected_error, | 3006 CheckProcessingFails( |
3133 QUIC_INVALID_PUBLIC_RST_PACKET); | 3007 packet, i, expected_error, QUIC_INVALID_PUBLIC_RST_PACKET); |
3134 } | 3008 } |
3135 } | 3009 } |
3136 } | 3010 } |
3137 | 3011 |
3138 TEST_P(QuicFramerTest, VersionNegotiationPacket) { | 3012 TEST_P(QuicFramerTest, VersionNegotiationPacket) { |
3139 unsigned char packet[] = { | 3013 unsigned char packet[] = { |
3140 // public flags (version, 8 byte connection_id) | 3014 // public flags (version, 8 byte connection_id) |
3141 0x3D, | 3015 0x3D, |
3142 // connection_id | 3016 // connection_id |
3143 0x10, 0x32, 0x54, 0x76, | 3017 0x10, 0x32, 0x54, 0x76, |
3144 0x98, 0xBA, 0xDC, 0xFE, | 3018 0x98, 0xBA, 0xDC, 0xFE, |
3145 // version tag | 3019 // version tag |
3146 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 3020 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
3147 'Q', '2', '.', '0', | 3021 'Q', '2', '.', '0', |
3148 }; | 3022 }; |
3149 | 3023 |
3150 QuicFramerPeer::SetIsServer(&framer_, false); | 3024 QuicFramerPeer::SetIsServer(&framer_, false); |
3151 | 3025 |
3152 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 3026 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
3153 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 3027 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
3154 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); | 3028 ASSERT_EQ(QUIC_NO_ERROR, framer_.error()); |
3155 ASSERT_TRUE(visitor_.version_negotiation_packet_.get()); | 3029 ASSERT_TRUE(visitor_.version_negotiation_packet_.get()); |
3156 EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size()); | 3030 EXPECT_EQ(2u, visitor_.version_negotiation_packet_->versions.size()); |
3157 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]); | 3031 EXPECT_EQ(GetParam(), visitor_.version_negotiation_packet_->versions[0]); |
3158 | 3032 |
3159 for (size_t i = 0; i <= kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID; ++i) { | 3033 for (size_t i = 0; i <= kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID; ++i) { |
3160 string expected_error; | 3034 string expected_error; |
3161 QuicErrorCode error_code = QUIC_INVALID_PACKET_HEADER; | 3035 QuicErrorCode error_code = QUIC_INVALID_PACKET_HEADER; |
3162 if (i < kConnectionIdOffset) { | 3036 if (i < kConnectionIdOffset) { |
3163 expected_error = "Unable to read public flags."; | 3037 expected_error = "Unable to read public flags."; |
3164 } else if (i < kVersionOffset) { | 3038 } else if (i < kVersionOffset) { |
3165 expected_error = "Unable to read ConnectionId."; | 3039 expected_error = "Unable to read ConnectionId."; |
3166 } else { | 3040 } else { |
3167 expected_error = "Unable to read supported version in negotiation."; | 3041 expected_error = "Unable to read supported version in negotiation."; |
3168 error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET; | 3042 error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET; |
3169 } | 3043 } |
3170 CheckProcessingFails(packet, i, expected_error, error_code); | 3044 CheckProcessingFails(packet, i, expected_error, error_code); |
3171 } | 3045 } |
3172 } | 3046 } |
3173 | 3047 |
3174 TEST_P(QuicFramerTest, FecPacket) { | 3048 TEST_P(QuicFramerTest, FecPacket) { |
3175 unsigned char packet[] = { | 3049 unsigned char packet[] = {// public flags (8 byte connection_id) |
3176 // public flags (8 byte connection_id) | 3050 0x3C, |
3177 0x3C, | 3051 // connection_id |
3178 // connection_id | 3052 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3179 0x10, 0x32, 0x54, 0x76, | 3053 // packet sequence number |
3180 0x98, 0xBA, 0xDC, 0xFE, | 3054 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3181 // packet sequence number | 3055 // private flags (fec group & FEC) |
3182 0xBC, 0x9A, 0x78, 0x56, | 3056 0x06, |
3183 0x34, 0x12, | 3057 // first fec protected packet offset |
3184 // private flags (fec group & FEC) | 3058 0x01, |
3185 0x06, | |
3186 // first fec protected packet offset | |
3187 0x01, | |
3188 | 3059 |
3189 // redundancy | 3060 // redundancy |
3190 'a', 'b', 'c', 'd', | 3061 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', |
3191 'e', 'f', 'g', 'h', | 3062 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', |
3192 'i', 'j', 'k', 'l', | |
3193 'm', 'n', 'o', 'p', | |
3194 }; | 3063 }; |
3195 | 3064 |
3196 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 3065 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
3197 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 3066 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
3198 | 3067 |
3199 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 3068 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
3200 ASSERT_TRUE(visitor_.header_.get()); | 3069 ASSERT_TRUE(visitor_.header_.get()); |
3201 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 3070 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
3202 | 3071 |
3203 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 3072 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
(...skipping 12 matching lines...) Expand all Loading... |
3216 header.fec_flag = false; | 3085 header.fec_flag = false; |
3217 header.entropy_flag = false; | 3086 header.entropy_flag = false; |
3218 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3087 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3219 header.fec_group = 0; | 3088 header.fec_group = 0; |
3220 | 3089 |
3221 QuicPaddingFrame padding_frame; | 3090 QuicPaddingFrame padding_frame; |
3222 | 3091 |
3223 QuicFrames frames; | 3092 QuicFrames frames; |
3224 frames.push_back(QuicFrame(&padding_frame)); | 3093 frames.push_back(QuicFrame(&padding_frame)); |
3225 | 3094 |
3226 unsigned char packet[kMaxPacketSize] = { | 3095 unsigned char packet[kMaxPacketSize] = {// public flags (8 byte connection_id) |
3227 // public flags (8 byte connection_id) | 3096 0x3C, |
3228 0x3C, | 3097 // connection_id |
3229 // connection_id | 3098 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, |
3230 0x10, 0x32, 0x54, 0x76, | 3099 0xDC, 0xFE, |
3231 0x98, 0xBA, 0xDC, 0xFE, | 3100 // packet sequence number |
3232 // packet sequence number | 3101 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3233 0xBC, 0x9A, 0x78, 0x56, | 3102 // private flags |
3234 0x34, 0x12, | 3103 0x00, |
3235 // private flags | |
3236 0x00, | |
3237 | 3104 |
3238 // frame type (padding frame) | 3105 // frame type (padding frame) |
3239 0x00, | 3106 0x00, 0x00, 0x00, 0x00, 0x00}; |
3240 0x00, 0x00, 0x00, 0x00 | |
3241 }; | |
3242 | 3107 |
3243 uint64 header_size = | 3108 uint64 header_size = GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
3244 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 3109 !kIncludeVersion, |
3245 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 3110 PACKET_6BYTE_SEQUENCE_NUMBER, |
| 3111 NOT_IN_FEC_GROUP); |
3246 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); | 3112 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
3247 | 3113 |
3248 scoped_ptr<QuicPacket> data( | 3114 scoped_ptr<QuicPacket> data( |
3249 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3115 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3250 ASSERT_TRUE(data != NULL); | 3116 ASSERT_TRUE(data != NULL); |
3251 | 3117 |
3252 test::CompareCharArraysWithHexError("constructed packet", | 3118 test::CompareCharArraysWithHexError("constructed packet", |
3253 data->data(), data->length(), | 3119 data->data(), |
| 3120 data->length(), |
3254 AsChars(packet), | 3121 AsChars(packet), |
3255 arraysize(packet)); | 3122 arraysize(packet)); |
3256 } | 3123 } |
3257 | 3124 |
3258 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) { | 3125 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) { |
3259 QuicPacketHeader header; | 3126 QuicPacketHeader header; |
3260 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3127 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3261 header.public_header.reset_flag = false; | 3128 header.public_header.reset_flag = false; |
3262 header.public_header.version_flag = false; | 3129 header.public_header.version_flag = false; |
3263 header.fec_flag = false; | 3130 header.fec_flag = false; |
3264 header.entropy_flag = false; | 3131 header.entropy_flag = false; |
3265 header.public_header.sequence_number_length = PACKET_4BYTE_SEQUENCE_NUMBER; | 3132 header.public_header.sequence_number_length = PACKET_4BYTE_SEQUENCE_NUMBER; |
3266 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3133 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3267 header.fec_group = 0; | 3134 header.fec_group = 0; |
3268 | 3135 |
3269 QuicPaddingFrame padding_frame; | 3136 QuicPaddingFrame padding_frame; |
3270 | 3137 |
3271 QuicFrames frames; | 3138 QuicFrames frames; |
3272 frames.push_back(QuicFrame(&padding_frame)); | 3139 frames.push_back(QuicFrame(&padding_frame)); |
3273 | 3140 |
3274 unsigned char packet[kMaxPacketSize] = { | 3141 unsigned char packet[kMaxPacketSize] = { |
3275 // public flags (8 byte connection_id and 4 byte sequence number) | 3142 // public flags (8 byte connection_id and 4 byte sequence number) |
3276 0x2C, | 3143 0x2C, |
3277 // connection_id | 3144 // connection_id |
3278 0x10, 0x32, 0x54, 0x76, | 3145 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3279 0x98, 0xBA, 0xDC, 0xFE, | 3146 // packet sequence number |
3280 // packet sequence number | 3147 0xBC, 0x9A, 0x78, 0x56, |
3281 0xBC, 0x9A, 0x78, 0x56, | 3148 // private flags |
3282 // private flags | 3149 0x00, |
3283 0x00, | |
3284 | 3150 |
3285 // frame type (padding frame) | 3151 // frame type (padding frame) |
3286 0x00, | 3152 0x00, 0x00, 0x00, 0x00, 0x00}; |
3287 0x00, 0x00, 0x00, 0x00 | |
3288 }; | |
3289 | 3153 |
3290 uint64 header_size = | 3154 uint64 header_size = GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
3291 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 3155 !kIncludeVersion, |
3292 PACKET_4BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 3156 PACKET_4BYTE_SEQUENCE_NUMBER, |
| 3157 NOT_IN_FEC_GROUP); |
3293 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); | 3158 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
3294 | 3159 |
3295 scoped_ptr<QuicPacket> data( | 3160 scoped_ptr<QuicPacket> data( |
3296 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3161 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3297 ASSERT_TRUE(data != NULL); | 3162 ASSERT_TRUE(data != NULL); |
3298 | 3163 |
3299 test::CompareCharArraysWithHexError("constructed packet", | 3164 test::CompareCharArraysWithHexError("constructed packet", |
3300 data->data(), data->length(), | 3165 data->data(), |
| 3166 data->length(), |
3301 AsChars(packet), | 3167 AsChars(packet), |
3302 arraysize(packet)); | 3168 arraysize(packet)); |
3303 } | 3169 } |
3304 | 3170 |
3305 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) { | 3171 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) { |
3306 QuicPacketHeader header; | 3172 QuicPacketHeader header; |
3307 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3173 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3308 header.public_header.reset_flag = false; | 3174 header.public_header.reset_flag = false; |
3309 header.public_header.version_flag = false; | 3175 header.public_header.version_flag = false; |
3310 header.fec_flag = false; | 3176 header.fec_flag = false; |
3311 header.entropy_flag = false; | 3177 header.entropy_flag = false; |
3312 header.public_header.sequence_number_length = PACKET_2BYTE_SEQUENCE_NUMBER; | 3178 header.public_header.sequence_number_length = PACKET_2BYTE_SEQUENCE_NUMBER; |
3313 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3179 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3314 header.fec_group = 0; | 3180 header.fec_group = 0; |
3315 | 3181 |
3316 QuicPaddingFrame padding_frame; | 3182 QuicPaddingFrame padding_frame; |
3317 | 3183 |
3318 QuicFrames frames; | 3184 QuicFrames frames; |
3319 frames.push_back(QuicFrame(&padding_frame)); | 3185 frames.push_back(QuicFrame(&padding_frame)); |
3320 | 3186 |
3321 unsigned char packet[kMaxPacketSize] = { | 3187 unsigned char packet[kMaxPacketSize] = { |
3322 // public flags (8 byte connection_id and 2 byte sequence number) | 3188 // public flags (8 byte connection_id and 2 byte sequence number) |
3323 0x1C, | 3189 0x1C, |
3324 // connection_id | 3190 // connection_id |
3325 0x10, 0x32, 0x54, 0x76, | 3191 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3326 0x98, 0xBA, 0xDC, 0xFE, | 3192 // packet sequence number |
3327 // packet sequence number | 3193 0xBC, 0x9A, |
3328 0xBC, 0x9A, | 3194 // private flags |
3329 // private flags | 3195 0x00, |
3330 0x00, | |
3331 | 3196 |
3332 // frame type (padding frame) | 3197 // frame type (padding frame) |
3333 0x00, | 3198 0x00, 0x00, 0x00, 0x00, 0x00}; |
3334 0x00, 0x00, 0x00, 0x00 | |
3335 }; | |
3336 | 3199 |
3337 uint64 header_size = | 3200 uint64 header_size = GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
3338 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 3201 !kIncludeVersion, |
3339 PACKET_2BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 3202 PACKET_2BYTE_SEQUENCE_NUMBER, |
| 3203 NOT_IN_FEC_GROUP); |
3340 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); | 3204 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
3341 | 3205 |
3342 scoped_ptr<QuicPacket> data( | 3206 scoped_ptr<QuicPacket> data( |
3343 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3207 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3344 ASSERT_TRUE(data != NULL); | 3208 ASSERT_TRUE(data != NULL); |
3345 | 3209 |
3346 test::CompareCharArraysWithHexError("constructed packet", | 3210 test::CompareCharArraysWithHexError("constructed packet", |
3347 data->data(), data->length(), | 3211 data->data(), |
| 3212 data->length(), |
3348 AsChars(packet), | 3213 AsChars(packet), |
3349 arraysize(packet)); | 3214 arraysize(packet)); |
3350 } | 3215 } |
3351 | 3216 |
3352 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) { | 3217 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) { |
3353 QuicPacketHeader header; | 3218 QuicPacketHeader header; |
3354 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3219 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3355 header.public_header.reset_flag = false; | 3220 header.public_header.reset_flag = false; |
3356 header.public_header.version_flag = false; | 3221 header.public_header.version_flag = false; |
3357 header.fec_flag = false; | 3222 header.fec_flag = false; |
3358 header.entropy_flag = false; | 3223 header.entropy_flag = false; |
3359 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | 3224 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; |
3360 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3225 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3361 header.fec_group = 0; | 3226 header.fec_group = 0; |
3362 | 3227 |
3363 QuicPaddingFrame padding_frame; | 3228 QuicPaddingFrame padding_frame; |
3364 | 3229 |
3365 QuicFrames frames; | 3230 QuicFrames frames; |
3366 frames.push_back(QuicFrame(&padding_frame)); | 3231 frames.push_back(QuicFrame(&padding_frame)); |
3367 | 3232 |
3368 unsigned char packet[kMaxPacketSize] = { | 3233 unsigned char packet[kMaxPacketSize] = { |
3369 // public flags (8 byte connection_id and 1 byte sequence number) | 3234 // public flags (8 byte connection_id and 1 byte sequence number) |
3370 0x0C, | 3235 0x0C, |
3371 // connection_id | 3236 // connection_id |
3372 0x10, 0x32, 0x54, 0x76, | 3237 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3373 0x98, 0xBA, 0xDC, 0xFE, | 3238 // packet sequence number |
3374 // packet sequence number | 3239 0xBC, |
3375 0xBC, | 3240 // private flags |
3376 // private flags | 3241 0x00, |
3377 0x00, | |
3378 | 3242 |
3379 // frame type (padding frame) | 3243 // frame type (padding frame) |
3380 0x00, | 3244 0x00, 0x00, 0x00, 0x00, 0x00}; |
3381 0x00, 0x00, 0x00, 0x00 | |
3382 }; | |
3383 | 3245 |
3384 uint64 header_size = | 3246 uint64 header_size = GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, |
3385 GetPacketHeaderSize(PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 3247 !kIncludeVersion, |
3386 PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP); | 3248 PACKET_1BYTE_SEQUENCE_NUMBER, |
| 3249 NOT_IN_FEC_GROUP); |
3387 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); | 3250 memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1); |
3388 | 3251 |
3389 scoped_ptr<QuicPacket> data( | 3252 scoped_ptr<QuicPacket> data( |
3390 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3253 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3391 ASSERT_TRUE(data != NULL); | 3254 ASSERT_TRUE(data != NULL); |
3392 | 3255 |
3393 test::CompareCharArraysWithHexError("constructed packet", | 3256 test::CompareCharArraysWithHexError("constructed packet", |
3394 data->data(), data->length(), | 3257 data->data(), |
| 3258 data->length(), |
3395 AsChars(packet), | 3259 AsChars(packet), |
3396 arraysize(packet)); | 3260 arraysize(packet)); |
3397 } | 3261 } |
3398 | 3262 |
3399 TEST_P(QuicFramerTest, BuildStreamFramePacket) { | 3263 TEST_P(QuicFramerTest, BuildStreamFramePacket) { |
3400 QuicPacketHeader header; | 3264 QuicPacketHeader header; |
3401 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3265 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3402 header.public_header.reset_flag = false; | 3266 header.public_header.reset_flag = false; |
3403 header.public_header.version_flag = false; | 3267 header.public_header.version_flag = false; |
3404 header.fec_flag = false; | 3268 header.fec_flag = false; |
3405 header.entropy_flag = true; | 3269 header.entropy_flag = true; |
3406 header.packet_sequence_number = GG_UINT64_C(0x77123456789ABC); | 3270 header.packet_sequence_number = GG_UINT64_C(0x77123456789ABC); |
3407 header.fec_group = 0; | 3271 header.fec_group = 0; |
3408 | 3272 |
3409 QuicStreamFrame stream_frame; | 3273 QuicStreamFrame stream_frame; |
3410 stream_frame.stream_id = 0x01020304; | 3274 stream_frame.stream_id = 0x01020304; |
3411 stream_frame.fin = true; | 3275 stream_frame.fin = true; |
3412 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); | 3276 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); |
3413 stream_frame.data = MakeIOVector("hello world!"); | 3277 stream_frame.data = MakeIOVector("hello world!"); |
3414 | 3278 |
3415 QuicFrames frames; | 3279 QuicFrames frames; |
3416 frames.push_back(QuicFrame(&stream_frame)); | 3280 frames.push_back(QuicFrame(&stream_frame)); |
3417 | 3281 |
3418 unsigned char packet[] = { | 3282 unsigned char packet[] = {// public flags (8 byte connection_id) |
3419 // public flags (8 byte connection_id) | 3283 0x3C, |
3420 0x3C, | 3284 // connection_id |
3421 // connection_id | 3285 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3422 0x10, 0x32, 0x54, 0x76, | 3286 // packet sequence number |
3423 0x98, 0xBA, 0xDC, 0xFE, | 3287 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3424 // packet sequence number | 3288 // private flags (entropy) |
3425 0xBC, 0x9A, 0x78, 0x56, | 3289 0x01, |
3426 0x34, 0x12, | |
3427 // private flags (entropy) | |
3428 0x01, | |
3429 | 3290 |
3430 // frame type (stream frame with fin and no length) | 3291 // frame type (stream frame with fin and no length) |
3431 0xDF, | 3292 0xDF, |
3432 // stream id | 3293 // stream id |
3433 0x04, 0x03, 0x02, 0x01, | 3294 0x04, 0x03, 0x02, 0x01, |
3434 // offset | 3295 // offset |
3435 0x54, 0x76, 0x10, 0x32, | 3296 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
3436 0xDC, 0xFE, 0x98, 0xBA, | 3297 // data |
3437 // data | 3298 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', |
3438 'h', 'e', 'l', 'l', | 3299 'r', 'l', 'd', '!', |
3439 'o', ' ', 'w', 'o', | |
3440 'r', 'l', 'd', '!', | |
3441 }; | 3300 }; |
3442 | 3301 |
3443 scoped_ptr<QuicPacket> data( | 3302 scoped_ptr<QuicPacket> data( |
3444 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3303 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3445 ASSERT_TRUE(data != NULL); | 3304 ASSERT_TRUE(data != NULL); |
3446 | 3305 |
3447 test::CompareCharArraysWithHexError("constructed packet", | 3306 test::CompareCharArraysWithHexError("constructed packet", |
3448 data->data(), data->length(), | 3307 data->data(), |
3449 AsChars(packet), arraysize(packet)); | 3308 data->length(), |
| 3309 AsChars(packet), |
| 3310 arraysize(packet)); |
3450 } | 3311 } |
3451 | 3312 |
3452 TEST_P(QuicFramerTest, BuildStreamFramePacketInFecGroup) { | 3313 TEST_P(QuicFramerTest, BuildStreamFramePacketInFecGroup) { |
3453 QuicPacketHeader header; | 3314 QuicPacketHeader header; |
3454 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3315 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3455 header.public_header.reset_flag = false; | 3316 header.public_header.reset_flag = false; |
3456 header.public_header.version_flag = false; | 3317 header.public_header.version_flag = false; |
3457 header.fec_flag = false; | 3318 header.fec_flag = false; |
3458 header.entropy_flag = true; | 3319 header.entropy_flag = true; |
3459 header.packet_sequence_number = GG_UINT64_C(0x77123456789ABC); | 3320 header.packet_sequence_number = GG_UINT64_C(0x77123456789ABC); |
3460 header.is_in_fec_group = IN_FEC_GROUP; | 3321 header.is_in_fec_group = IN_FEC_GROUP; |
3461 header.fec_group = GG_UINT64_C(0x77123456789ABC); | 3322 header.fec_group = GG_UINT64_C(0x77123456789ABC); |
3462 | 3323 |
3463 QuicStreamFrame stream_frame; | 3324 QuicStreamFrame stream_frame; |
3464 stream_frame.stream_id = 0x01020304; | 3325 stream_frame.stream_id = 0x01020304; |
3465 stream_frame.fin = true; | 3326 stream_frame.fin = true; |
3466 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); | 3327 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); |
3467 stream_frame.data = MakeIOVector("hello world!"); | 3328 stream_frame.data = MakeIOVector("hello world!"); |
3468 | 3329 |
3469 QuicFrames frames; | 3330 QuicFrames frames; |
3470 frames.push_back(QuicFrame(&stream_frame)); | 3331 frames.push_back(QuicFrame(&stream_frame)); |
3471 unsigned char packet[] = { | 3332 unsigned char packet[] = { |
3472 // public flags (8 byte connection_id) | 3333 // public flags (8 byte connection_id) |
3473 0x3C, | 3334 0x3C, |
3474 // connection_id | 3335 // connection_id |
3475 0x10, 0x32, 0x54, 0x76, | 3336 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3476 0x98, 0xBA, 0xDC, 0xFE, | 3337 // packet sequence number |
3477 // packet sequence number | 3338 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3478 0xBC, 0x9A, 0x78, 0x56, | 3339 // private flags (entropy, is_in_fec_group) |
3479 0x34, 0x12, | 3340 0x03, |
3480 // private flags (entropy, is_in_fec_group) | 3341 // FEC group |
3481 0x03, | 3342 0x00, |
3482 // FEC group | 3343 // frame type (stream frame with fin and data length field) |
3483 0x00, | 3344 0xFF, |
3484 // frame type (stream frame with fin and data length field) | 3345 // stream id |
3485 0xFF, | 3346 0x04, 0x03, 0x02, 0x01, |
3486 // stream id | 3347 // offset |
3487 0x04, 0x03, 0x02, 0x01, | 3348 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
3488 // offset | 3349 // data length (since packet is in an FEC group) |
3489 0x54, 0x76, 0x10, 0x32, | 3350 0x0C, 0x00, |
3490 0xDC, 0xFE, 0x98, 0xBA, | 3351 // data |
3491 // data length (since packet is in an FEC group) | 3352 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', |
3492 0x0C, 0x00, | |
3493 // data | |
3494 'h', 'e', 'l', 'l', | |
3495 'o', ' ', 'w', 'o', | |
3496 'r', 'l', 'd', '!', | |
3497 }; | 3353 }; |
3498 | 3354 |
3499 scoped_ptr<QuicPacket> data( | 3355 scoped_ptr<QuicPacket> data( |
3500 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3356 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3501 ASSERT_TRUE(data != NULL); | 3357 ASSERT_TRUE(data != NULL); |
3502 | 3358 |
3503 test::CompareCharArraysWithHexError("constructed packet", | 3359 test::CompareCharArraysWithHexError("constructed packet", |
3504 data->data(), data->length(), | 3360 data->data(), |
3505 AsChars(packet), arraysize(packet)); | 3361 data->length(), |
| 3362 AsChars(packet), |
| 3363 arraysize(packet)); |
3506 } | 3364 } |
3507 | 3365 |
3508 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) { | 3366 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) { |
3509 QuicPacketHeader header; | 3367 QuicPacketHeader header; |
3510 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3368 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3511 header.public_header.reset_flag = false; | 3369 header.public_header.reset_flag = false; |
3512 header.public_header.version_flag = true; | 3370 header.public_header.version_flag = true; |
3513 header.fec_flag = false; | 3371 header.fec_flag = false; |
3514 header.entropy_flag = true; | 3372 header.entropy_flag = true; |
3515 header.packet_sequence_number = GG_UINT64_C(0x77123456789ABC); | 3373 header.packet_sequence_number = GG_UINT64_C(0x77123456789ABC); |
3516 header.fec_group = 0; | 3374 header.fec_group = 0; |
3517 | 3375 |
3518 QuicStreamFrame stream_frame; | 3376 QuicStreamFrame stream_frame; |
3519 stream_frame.stream_id = 0x01020304; | 3377 stream_frame.stream_id = 0x01020304; |
3520 stream_frame.fin = true; | 3378 stream_frame.fin = true; |
3521 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); | 3379 stream_frame.offset = GG_UINT64_C(0xBA98FEDC32107654); |
3522 stream_frame.data = MakeIOVector("hello world!"); | 3380 stream_frame.data = MakeIOVector("hello world!"); |
3523 | 3381 |
3524 QuicFrames frames; | 3382 QuicFrames frames; |
3525 frames.push_back(QuicFrame(&stream_frame)); | 3383 frames.push_back(QuicFrame(&stream_frame)); |
3526 | 3384 |
3527 unsigned char packet[] = { | 3385 unsigned char packet[] = { |
3528 // public flags (version, 8 byte connection_id) | 3386 // public flags (version, 8 byte connection_id) |
3529 0x3D, | 3387 0x3D, |
3530 // connection_id | 3388 // connection_id |
3531 0x10, 0x32, 0x54, 0x76, | 3389 0x10, 0x32, 0x54, 0x76, |
3532 0x98, 0xBA, 0xDC, 0xFE, | 3390 0x98, 0xBA, 0xDC, 0xFE, |
3533 // version tag | 3391 // version tag |
3534 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 3392 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
3535 // packet sequence number | 3393 // packet sequence number |
3536 0xBC, 0x9A, 0x78, 0x56, | 3394 0xBC, 0x9A, 0x78, 0x56, |
3537 0x34, 0x12, | 3395 0x34, 0x12, |
3538 // private flags (entropy) | 3396 // private flags (entropy) |
3539 0x01, | 3397 0x01, |
3540 | 3398 |
3541 // frame type (stream frame with fin and no length) | 3399 // frame type (stream frame with fin and no length) |
3542 0xDF, | 3400 0xDF, |
3543 // stream id | 3401 // stream id |
3544 0x04, 0x03, 0x02, 0x01, | 3402 0x04, 0x03, 0x02, 0x01, |
3545 // offset | 3403 // offset |
3546 0x54, 0x76, 0x10, 0x32, | 3404 0x54, 0x76, 0x10, 0x32, |
3547 0xDC, 0xFE, 0x98, 0xBA, | 3405 0xDC, 0xFE, 0x98, 0xBA, |
3548 // data | 3406 // data |
3549 'h', 'e', 'l', 'l', | 3407 'h', 'e', 'l', 'l', |
3550 'o', ' ', 'w', 'o', | 3408 'o', ' ', 'w', 'o', |
3551 'r', 'l', 'd', '!', | 3409 'r', 'l', 'd', '!', |
3552 }; | 3410 }; |
3553 | 3411 |
3554 QuicFramerPeer::SetIsServer(&framer_, false); | 3412 QuicFramerPeer::SetIsServer(&framer_, false); |
3555 scoped_ptr<QuicPacket> data( | 3413 scoped_ptr<QuicPacket> data( |
3556 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3414 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3557 ASSERT_TRUE(data != NULL); | 3415 ASSERT_TRUE(data != NULL); |
3558 | 3416 |
3559 test::CompareCharArraysWithHexError("constructed packet", | 3417 test::CompareCharArraysWithHexError("constructed packet", |
3560 data->data(), data->length(), | 3418 data->data(), |
3561 AsChars(packet), arraysize(packet)); | 3419 data->length(), |
| 3420 AsChars(packet), |
| 3421 arraysize(packet)); |
3562 } | 3422 } |
3563 | 3423 |
3564 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { | 3424 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) { |
3565 QuicPacketPublicHeader header; | 3425 QuicPacketPublicHeader header; |
3566 header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3426 header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3567 header.reset_flag = false; | 3427 header.reset_flag = false; |
3568 header.version_flag = true; | 3428 header.version_flag = true; |
3569 | 3429 |
3570 unsigned char packet[] = { | 3430 unsigned char packet[] = { |
3571 // public flags (version, 8 byte connection_id) | 3431 // public flags (version, 8 byte connection_id) |
3572 0x0D, | 3432 0x0D, |
3573 // connection_id | 3433 // connection_id |
3574 0x10, 0x32, 0x54, 0x76, | 3434 0x10, 0x32, 0x54, 0x76, |
3575 0x98, 0xBA, 0xDC, 0xFE, | 3435 0x98, 0xBA, 0xDC, 0xFE, |
3576 // version tag | 3436 // version tag |
3577 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), | 3437 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(), |
3578 }; | 3438 }; |
3579 | 3439 |
3580 QuicVersionVector versions; | 3440 QuicVersionVector versions; |
3581 versions.push_back(GetParam()); | 3441 versions.push_back(GetParam()); |
3582 scoped_ptr<QuicEncryptedPacket> data( | 3442 scoped_ptr<QuicEncryptedPacket> data( |
3583 framer_.BuildVersionNegotiationPacket(header, versions)); | 3443 framer_.BuildVersionNegotiationPacket(header, versions)); |
3584 | 3444 |
3585 test::CompareCharArraysWithHexError("constructed packet", | 3445 test::CompareCharArraysWithHexError("constructed packet", |
3586 data->data(), data->length(), | 3446 data->data(), |
3587 AsChars(packet), arraysize(packet)); | 3447 data->length(), |
| 3448 AsChars(packet), |
| 3449 arraysize(packet)); |
3588 } | 3450 } |
3589 | 3451 |
3590 TEST_P(QuicFramerTest, BuildAckFramePacket) { | 3452 TEST_P(QuicFramerTest, BuildAckFramePacket) { |
3591 if (version_ <= QUIC_VERSION_15) { | 3453 if (version_ <= QUIC_VERSION_15) { |
3592 return; | 3454 return; |
3593 } | 3455 } |
3594 QuicPacketHeader header; | 3456 QuicPacketHeader header; |
3595 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3457 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3596 header.public_header.reset_flag = false; | 3458 header.public_header.reset_flag = false; |
3597 header.public_header.version_flag = false; | 3459 header.public_header.version_flag = false; |
3598 header.fec_flag = false; | 3460 header.fec_flag = false; |
3599 header.entropy_flag = true; | 3461 header.entropy_flag = true; |
3600 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3462 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
3601 header.fec_group = 0; | 3463 header.fec_group = 0; |
3602 | 3464 |
3603 QuicAckFrame ack_frame; | 3465 QuicAckFrame ack_frame; |
3604 ack_frame.received_info.entropy_hash = 0x43; | 3466 ack_frame.received_info.entropy_hash = 0x43; |
3605 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); | 3467 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); |
3606 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); | 3468 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); |
3607 ack_frame.received_info.missing_packets.insert( | 3469 ack_frame.received_info.missing_packets.insert( |
3608 GG_UINT64_C(0x770123456789ABE)); | 3470 GG_UINT64_C(0x770123456789ABE)); |
3609 | 3471 |
3610 QuicFrames frames; | 3472 QuicFrames frames; |
3611 frames.push_back(QuicFrame(&ack_frame)); | 3473 frames.push_back(QuicFrame(&ack_frame)); |
3612 | 3474 |
3613 unsigned char packet[] = { | 3475 unsigned char packet[] = { |
3614 // public flags (8 byte connection_id) | 3476 // public flags (8 byte connection_id) |
3615 0x3C, | 3477 0x3C, |
3616 // connection_id | 3478 // connection_id |
3617 0x10, 0x32, 0x54, 0x76, | 3479 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3618 0x98, 0xBA, 0xDC, 0xFE, | 3480 // packet sequence number |
3619 // packet sequence number | 3481 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3620 0xA8, 0x9A, 0x78, 0x56, | 3482 // private flags (entropy) |
3621 0x34, 0x12, | 3483 0x01, |
3622 // private flags (entropy) | |
3623 0x01, | |
3624 | 3484 |
3625 // frame type (ack frame) | 3485 // frame type (ack frame) |
3626 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 3486 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
3627 0x6C, | 3487 0x6C, |
3628 // entropy hash of all received packets. | 3488 // entropy hash of all received packets. |
3629 0x43, | 3489 0x43, |
3630 // largest observed packet sequence number | 3490 // largest observed packet sequence number |
3631 0xBF, 0x9A, 0x78, 0x56, | 3491 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3632 0x34, 0x12, | 3492 // Zero delta time. |
3633 // Zero delta time. | 3493 0x0, 0x0, |
3634 0x0, 0x0, | 3494 // num missing packet ranges |
3635 // num missing packet ranges | 3495 0x01, |
3636 0x01, | 3496 // missing packet delta |
3637 // missing packet delta | 3497 0x01, |
3638 0x01, | 3498 // 0 more missing packets in range. |
3639 // 0 more missing packets in range. | 3499 0x00, |
3640 0x00, | 3500 // 0 revived packets. |
3641 // 0 revived packets. | 3501 0x00, |
3642 0x00, | |
3643 }; | 3502 }; |
3644 | 3503 |
3645 scoped_ptr<QuicPacket> data( | 3504 scoped_ptr<QuicPacket> data( |
3646 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3505 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3647 ASSERT_TRUE(data != NULL); | 3506 ASSERT_TRUE(data != NULL); |
3648 | 3507 |
3649 test::CompareCharArraysWithHexError("constructed packet", | 3508 test::CompareCharArraysWithHexError("constructed packet", |
3650 data->data(), data->length(), | 3509 data->data(), |
3651 AsChars(packet), arraysize(packet)); | 3510 data->length(), |
| 3511 AsChars(packet), |
| 3512 arraysize(packet)); |
3652 } | 3513 } |
3653 | 3514 |
3654 TEST_P(QuicFramerTest, BuildAckFramePacket15) { | 3515 TEST_P(QuicFramerTest, BuildAckFramePacket15) { |
3655 if (version_ != QUIC_VERSION_15) { | 3516 if (version_ != QUIC_VERSION_15) { |
3656 return; | 3517 return; |
3657 } | 3518 } |
3658 QuicPacketHeader header; | 3519 QuicPacketHeader header; |
3659 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3520 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3660 header.public_header.reset_flag = false; | 3521 header.public_header.reset_flag = false; |
3661 header.public_header.version_flag = false; | 3522 header.public_header.version_flag = false; |
3662 header.fec_flag = false; | 3523 header.fec_flag = false; |
3663 header.entropy_flag = true; | 3524 header.entropy_flag = true; |
3664 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3525 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
3665 header.fec_group = 0; | 3526 header.fec_group = 0; |
3666 | 3527 |
3667 QuicAckFrame ack_frame; | 3528 QuicAckFrame ack_frame; |
3668 ack_frame.received_info.entropy_hash = 0x43; | 3529 ack_frame.received_info.entropy_hash = 0x43; |
3669 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); | 3530 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); |
3670 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); | 3531 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); |
3671 ack_frame.received_info.missing_packets.insert( | 3532 ack_frame.received_info.missing_packets.insert( |
3672 GG_UINT64_C(0x770123456789ABE)); | 3533 GG_UINT64_C(0x770123456789ABE)); |
3673 ack_frame.sent_info.entropy_hash = 0x14; | 3534 ack_frame.sent_info.entropy_hash = 0x14; |
3674 ack_frame.sent_info.least_unacked = GG_UINT64_C(0x770123456789AA0); | 3535 ack_frame.sent_info.least_unacked = GG_UINT64_C(0x770123456789AA0); |
3675 | 3536 |
3676 QuicFrames frames; | 3537 QuicFrames frames; |
3677 frames.push_back(QuicFrame(&ack_frame)); | 3538 frames.push_back(QuicFrame(&ack_frame)); |
3678 | 3539 |
3679 unsigned char packet[] = { | 3540 unsigned char packet[] = { |
3680 // public flags (8 byte connection_id) | 3541 // public flags (8 byte connection_id) |
3681 0x3C, | 3542 0x3C, |
3682 // connection_id | 3543 // connection_id |
3683 0x10, 0x32, 0x54, 0x76, | 3544 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3684 0x98, 0xBA, 0xDC, 0xFE, | 3545 // packet sequence number |
3685 // packet sequence number | 3546 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3686 0xA8, 0x9A, 0x78, 0x56, | 3547 // private flags (entropy) |
3687 0x34, 0x12, | 3548 0x01, |
3688 // private flags (entropy) | |
3689 0x01, | |
3690 | 3549 |
3691 // frame type (ack frame) | 3550 // frame type (ack frame) |
3692 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 3551 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
3693 0x6C, | 3552 0x6C, |
3694 // entropy hash of sent packets till least awaiting - 1. | 3553 // entropy hash of sent packets till least awaiting - 1. |
3695 0x14, | 3554 0x14, |
3696 // least packet sequence number awaiting an ack, delta from sequence number. | 3555 // least packet sequence number awaiting an ack, delta from sequence |
3697 0x08, 0x00, 0x00, 0x00, | 3556 // number. |
3698 0x00, 0x00, | 3557 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
3699 // entropy hash of all received packets. | 3558 // entropy hash of all received packets. |
3700 0x43, | 3559 0x43, |
3701 // largest observed packet sequence number | 3560 // largest observed packet sequence number |
3702 0xBF, 0x9A, 0x78, 0x56, | 3561 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3703 0x34, 0x12, | 3562 // Zero delta time. |
3704 // Zero delta time. | 3563 0x0, 0x0, |
3705 0x0, 0x0, | 3564 // num missing packet ranges |
3706 // num missing packet ranges | 3565 0x01, |
3707 0x01, | 3566 // missing packet delta |
3708 // missing packet delta | 3567 0x01, |
3709 0x01, | 3568 // 0 more missing packets in range. |
3710 // 0 more missing packets in range. | 3569 0x00, |
3711 0x00, | 3570 // 0 revived packets. |
3712 // 0 revived packets. | 3571 0x00, |
3713 0x00, | |
3714 }; | 3572 }; |
3715 | 3573 |
3716 scoped_ptr<QuicPacket> data( | 3574 scoped_ptr<QuicPacket> data( |
3717 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3575 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3718 ASSERT_TRUE(data != NULL); | 3576 ASSERT_TRUE(data != NULL); |
3719 | 3577 |
3720 test::CompareCharArraysWithHexError("constructed packet", | 3578 test::CompareCharArraysWithHexError("constructed packet", |
3721 data->data(), data->length(), | 3579 data->data(), |
3722 AsChars(packet), arraysize(packet)); | 3580 data->length(), |
| 3581 AsChars(packet), |
| 3582 arraysize(packet)); |
3723 } | 3583 } |
3724 | 3584 |
3725 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) { | 3585 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) { |
3726 QuicPacketHeader header; | 3586 QuicPacketHeader header; |
3727 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3587 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3728 header.public_header.reset_flag = false; | 3588 header.public_header.reset_flag = false; |
3729 header.public_header.version_flag = false; | 3589 header.public_header.version_flag = false; |
3730 header.fec_flag = false; | 3590 header.fec_flag = false; |
3731 header.entropy_flag = false; | 3591 header.entropy_flag = false; |
3732 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3592 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3733 header.fec_group = 0; | 3593 header.fec_group = 0; |
3734 | 3594 |
3735 QuicCongestionFeedbackFrame congestion_feedback_frame; | 3595 QuicCongestionFeedbackFrame congestion_feedback_frame; |
3736 congestion_feedback_frame.type = kTCP; | 3596 congestion_feedback_frame.type = kTCP; |
3737 congestion_feedback_frame.tcp.receive_window = 0x4030; | 3597 congestion_feedback_frame.tcp.receive_window = 0x4030; |
3738 | 3598 |
3739 QuicFrames frames; | 3599 QuicFrames frames; |
3740 frames.push_back(QuicFrame(&congestion_feedback_frame)); | 3600 frames.push_back(QuicFrame(&congestion_feedback_frame)); |
3741 | 3601 |
3742 unsigned char packet[] = { | 3602 unsigned char packet[] = {// public flags (8 byte connection_id) |
3743 // public flags (8 byte connection_id) | 3603 0x3C, |
3744 0x3C, | 3604 // connection_id |
3745 // connection_id | 3605 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3746 0x10, 0x32, 0x54, 0x76, | 3606 // packet sequence number |
3747 0x98, 0xBA, 0xDC, 0xFE, | 3607 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3748 // packet sequence number | 3608 // private flags |
3749 0xBC, 0x9A, 0x78, 0x56, | 3609 0x00, |
3750 0x34, 0x12, | |
3751 // private flags | |
3752 0x00, | |
3753 | 3610 |
3754 // frame type (congestion feedback frame) | 3611 // frame type (congestion feedback frame) |
3755 0x20, | 3612 0x20, |
3756 // congestion feedback type (TCP) | 3613 // congestion feedback type (TCP) |
3757 0x00, | 3614 0x00, |
3758 // TCP receive window | 3615 // TCP receive window |
3759 0x03, 0x04, | 3616 0x03, 0x04, |
3760 }; | 3617 }; |
3761 | 3618 |
3762 scoped_ptr<QuicPacket> data( | 3619 scoped_ptr<QuicPacket> data( |
3763 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3620 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3764 ASSERT_TRUE(data != NULL); | 3621 ASSERT_TRUE(data != NULL); |
3765 | 3622 |
3766 test::CompareCharArraysWithHexError("constructed packet", | 3623 test::CompareCharArraysWithHexError("constructed packet", |
3767 data->data(), data->length(), | 3624 data->data(), |
3768 AsChars(packet), arraysize(packet)); | 3625 data->length(), |
| 3626 AsChars(packet), |
| 3627 arraysize(packet)); |
3769 } | 3628 } |
3770 | 3629 |
3771 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInterArrival) { | 3630 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInterArrival) { |
3772 QuicPacketHeader header; | 3631 QuicPacketHeader header; |
3773 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3632 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3774 header.public_header.reset_flag = false; | 3633 header.public_header.reset_flag = false; |
3775 header.public_header.version_flag = false; | 3634 header.public_header.version_flag = false; |
3776 header.fec_flag = false; | 3635 header.fec_flag = false; |
3777 header.entropy_flag = false; | 3636 header.entropy_flag = false; |
3778 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3637 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3779 header.fec_group = 0; | 3638 header.fec_group = 0; |
3780 | 3639 |
3781 QuicCongestionFeedbackFrame frame; | 3640 QuicCongestionFeedbackFrame frame; |
3782 frame.type = kInterArrival; | 3641 frame.type = kInterArrival; |
3783 frame.inter_arrival.received_packet_times.insert( | 3642 frame.inter_arrival.received_packet_times.insert(make_pair( |
3784 make_pair(GG_UINT64_C(0x0123456789ABA), | 3643 GG_UINT64_C(0x0123456789ABA), |
3785 start_.Add(QuicTime::Delta::FromMicroseconds( | 3644 start_.Add( |
3786 GG_UINT64_C(0x07E1D2C3B4A59687))))); | 3645 QuicTime::Delta::FromMicroseconds(GG_UINT64_C(0x07E1D2C3B4A59687))))); |
3787 frame.inter_arrival.received_packet_times.insert( | 3646 frame.inter_arrival.received_packet_times.insert(make_pair( |
3788 make_pair(GG_UINT64_C(0x0123456789ABB), | 3647 GG_UINT64_C(0x0123456789ABB), |
3789 start_.Add(QuicTime::Delta::FromMicroseconds( | 3648 start_.Add( |
3790 GG_UINT64_C(0x07E1D2C3B4A59688))))); | 3649 QuicTime::Delta::FromMicroseconds(GG_UINT64_C(0x07E1D2C3B4A59688))))); |
3791 frame.inter_arrival.received_packet_times.insert( | 3650 frame.inter_arrival.received_packet_times.insert(make_pair( |
3792 make_pair(GG_UINT64_C(0x0123456789ABD), | 3651 GG_UINT64_C(0x0123456789ABD), |
3793 start_.Add(QuicTime::Delta::FromMicroseconds( | 3652 start_.Add( |
3794 GG_UINT64_C(0x07E1D2C3B4A59689))))); | 3653 QuicTime::Delta::FromMicroseconds(GG_UINT64_C(0x07E1D2C3B4A59689))))); |
3795 QuicFrames frames; | 3654 QuicFrames frames; |
3796 frames.push_back(QuicFrame(&frame)); | 3655 frames.push_back(QuicFrame(&frame)); |
3797 | 3656 |
3798 unsigned char packet[] = { | 3657 unsigned char packet[] = {// public flags (8 byte connection_id) |
3799 // public flags (8 byte connection_id) | 3658 0x3C, |
3800 0x3C, | 3659 // connection_id |
3801 // connection_id | 3660 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3802 0x10, 0x32, 0x54, 0x76, | 3661 // packet sequence number |
3803 0x98, 0xBA, 0xDC, 0xFE, | 3662 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3804 // packet sequence number | 3663 // private flags |
3805 0xBC, 0x9A, 0x78, 0x56, | 3664 0x00, |
3806 0x34, 0x12, | |
3807 // private flags | |
3808 0x00, | |
3809 | 3665 |
3810 // frame type (congestion feedback frame) | 3666 // frame type (congestion feedback frame) |
3811 0x20, | 3667 0x20, |
3812 // congestion feedback type (inter arrival) | 3668 // congestion feedback type (inter arrival) |
3813 0x01, | 3669 0x01, |
3814 // num received packets | 3670 // num received packets |
3815 0x03, | 3671 0x03, |
3816 // lowest sequence number | 3672 // lowest sequence number |
3817 0xBA, 0x9A, 0x78, 0x56, | 3673 0xBA, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3818 0x34, 0x12, | 3674 // receive time |
3819 // receive time | 3675 0x87, 0x96, 0xA5, 0xB4, 0xC3, 0xD2, 0xE1, 0x07, |
3820 0x87, 0x96, 0xA5, 0xB4, | 3676 // sequence delta |
3821 0xC3, 0xD2, 0xE1, 0x07, | 3677 0x01, 0x00, |
3822 // sequence delta | 3678 // time delta |
3823 0x01, 0x00, | 3679 0x01, 0x00, 0x00, 0x00, |
3824 // time delta | 3680 // sequence delta (skip one packet) |
3825 0x01, 0x00, 0x00, 0x00, | 3681 0x03, 0x00, |
3826 // sequence delta (skip one packet) | 3682 // time delta |
3827 0x03, 0x00, | 3683 0x02, 0x00, 0x00, 0x00, |
3828 // time delta | |
3829 0x02, 0x00, 0x00, 0x00, | |
3830 }; | 3684 }; |
3831 | 3685 |
3832 scoped_ptr<QuicPacket> data( | 3686 scoped_ptr<QuicPacket> data( |
3833 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3687 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3834 ASSERT_TRUE(data != NULL); | 3688 ASSERT_TRUE(data != NULL); |
3835 | 3689 |
3836 test::CompareCharArraysWithHexError("constructed packet", | 3690 test::CompareCharArraysWithHexError("constructed packet", |
3837 data->data(), data->length(), | 3691 data->data(), |
3838 AsChars(packet), arraysize(packet)); | 3692 data->length(), |
| 3693 AsChars(packet), |
| 3694 arraysize(packet)); |
3839 } | 3695 } |
3840 | 3696 |
3841 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { | 3697 TEST_P(QuicFramerTest, BuildStopWaitingPacket) { |
3842 if (version_ <= QUIC_VERSION_15) { | 3698 if (version_ <= QUIC_VERSION_15) { |
3843 return; | 3699 return; |
3844 } | 3700 } |
3845 QuicPacketHeader header; | 3701 QuicPacketHeader header; |
3846 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3702 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3847 header.public_header.reset_flag = false; | 3703 header.public_header.reset_flag = false; |
3848 header.public_header.version_flag = false; | 3704 header.public_header.version_flag = false; |
3849 header.fec_flag = false; | 3705 header.fec_flag = false; |
3850 header.entropy_flag = true; | 3706 header.entropy_flag = true; |
3851 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3707 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
3852 header.fec_group = 0; | 3708 header.fec_group = 0; |
3853 | 3709 |
3854 QuicStopWaitingFrame stop_waiting_frame; | 3710 QuicStopWaitingFrame stop_waiting_frame; |
3855 stop_waiting_frame.entropy_hash = 0x14; | 3711 stop_waiting_frame.entropy_hash = 0x14; |
3856 stop_waiting_frame.least_unacked = GG_UINT64_C(0x770123456789AA0); | 3712 stop_waiting_frame.least_unacked = GG_UINT64_C(0x770123456789AA0); |
3857 | 3713 |
3858 QuicFrames frames; | 3714 QuicFrames frames; |
3859 frames.push_back(QuicFrame(&stop_waiting_frame)); | 3715 frames.push_back(QuicFrame(&stop_waiting_frame)); |
3860 | 3716 |
3861 unsigned char packet[] = { | 3717 unsigned char packet[] = { |
3862 // public flags (8 byte connection_id) | 3718 // public flags (8 byte connection_id) |
3863 0x3C, | 3719 0x3C, |
3864 // connection_id | 3720 // connection_id |
3865 0x10, 0x32, 0x54, 0x76, | 3721 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3866 0x98, 0xBA, 0xDC, 0xFE, | 3722 // packet sequence number |
3867 // packet sequence number | 3723 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3868 0xA8, 0x9A, 0x78, 0x56, | 3724 // private flags (entropy) |
3869 0x34, 0x12, | 3725 0x01, |
3870 // private flags (entropy) | |
3871 0x01, | |
3872 | 3726 |
3873 // frame type (stop waiting frame) | 3727 // frame type (stop waiting frame) |
3874 0x06, | 3728 0x06, |
3875 // entropy hash of sent packets till least awaiting - 1. | 3729 // entropy hash of sent packets till least awaiting - 1. |
3876 0x14, | 3730 0x14, |
3877 // least packet sequence number awaiting an ack, delta from sequence number. | 3731 // least packet sequence number awaiting an ack, delta from sequence |
3878 0x08, 0x00, 0x00, 0x00, | 3732 // number. |
3879 0x00, 0x00, | 3733 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, |
3880 }; | 3734 }; |
3881 | 3735 |
3882 scoped_ptr<QuicPacket> data( | 3736 scoped_ptr<QuicPacket> data( |
3883 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3737 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3884 ASSERT_TRUE(data != NULL); | 3738 ASSERT_TRUE(data != NULL); |
3885 | 3739 |
3886 test::CompareCharArraysWithHexError("constructed packet", | 3740 test::CompareCharArraysWithHexError("constructed packet", |
3887 data->data(), data->length(), | 3741 data->data(), |
3888 AsChars(packet), arraysize(packet)); | 3742 data->length(), |
| 3743 AsChars(packet), |
| 3744 arraysize(packet)); |
3889 } | 3745 } |
3890 | 3746 |
3891 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketFixRate) { | 3747 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketFixRate) { |
3892 QuicPacketHeader header; | 3748 QuicPacketHeader header; |
3893 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3749 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3894 header.public_header.reset_flag = false; | 3750 header.public_header.reset_flag = false; |
3895 header.public_header.version_flag = false; | 3751 header.public_header.version_flag = false; |
3896 header.fec_flag = false; | 3752 header.fec_flag = false; |
3897 header.entropy_flag = false; | 3753 header.entropy_flag = false; |
3898 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3754 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3899 header.fec_group = 0; | 3755 header.fec_group = 0; |
3900 | 3756 |
3901 QuicCongestionFeedbackFrame congestion_feedback_frame; | 3757 QuicCongestionFeedbackFrame congestion_feedback_frame; |
3902 congestion_feedback_frame.type = kFixRate; | 3758 congestion_feedback_frame.type = kFixRate; |
3903 congestion_feedback_frame.fix_rate.bitrate | 3759 congestion_feedback_frame.fix_rate.bitrate = |
3904 = QuicBandwidth::FromBytesPerSecond(0x04030201); | 3760 QuicBandwidth::FromBytesPerSecond(0x04030201); |
3905 | 3761 |
3906 QuicFrames frames; | 3762 QuicFrames frames; |
3907 frames.push_back(QuicFrame(&congestion_feedback_frame)); | 3763 frames.push_back(QuicFrame(&congestion_feedback_frame)); |
3908 | 3764 |
3909 unsigned char packet[] = { | 3765 unsigned char packet[] = {// public flags (8 byte connection_id) |
3910 // public flags (8 byte connection_id) | 3766 0x3C, |
3911 0x3C, | 3767 // connection_id |
3912 // connection_id | 3768 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3913 0x10, 0x32, 0x54, 0x76, | 3769 // packet sequence number |
3914 0x98, 0xBA, 0xDC, 0xFE, | 3770 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3915 // packet sequence number | 3771 // private flags |
3916 0xBC, 0x9A, 0x78, 0x56, | 3772 0x00, |
3917 0x34, 0x12, | |
3918 // private flags | |
3919 0x00, | |
3920 | 3773 |
3921 // frame type (congestion feedback frame) | 3774 // frame type (congestion feedback frame) |
3922 0x20, | 3775 0x20, |
3923 // congestion feedback type (fix rate) | 3776 // congestion feedback type (fix rate) |
3924 0x02, | 3777 0x02, |
3925 // bitrate_in_bytes_per_second; | 3778 // bitrate_in_bytes_per_second; |
3926 0x01, 0x02, 0x03, 0x04, | 3779 0x01, 0x02, 0x03, 0x04, |
3927 }; | 3780 }; |
3928 | 3781 |
3929 scoped_ptr<QuicPacket> data( | 3782 scoped_ptr<QuicPacket> data( |
3930 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3783 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3931 ASSERT_TRUE(data != NULL); | 3784 ASSERT_TRUE(data != NULL); |
3932 | 3785 |
3933 test::CompareCharArraysWithHexError("constructed packet", | 3786 test::CompareCharArraysWithHexError("constructed packet", |
3934 data->data(), data->length(), | 3787 data->data(), |
3935 AsChars(packet), arraysize(packet)); | 3788 data->length(), |
| 3789 AsChars(packet), |
| 3790 arraysize(packet)); |
3936 } | 3791 } |
3937 | 3792 |
3938 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInvalidFeedback) { | 3793 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInvalidFeedback) { |
3939 QuicPacketHeader header; | 3794 QuicPacketHeader header; |
3940 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3795 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3941 header.public_header.reset_flag = false; | 3796 header.public_header.reset_flag = false; |
3942 header.public_header.version_flag = false; | 3797 header.public_header.version_flag = false; |
3943 header.fec_flag = false; | 3798 header.fec_flag = false; |
3944 header.entropy_flag = false; | 3799 header.entropy_flag = false; |
3945 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3800 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
(...skipping 22 matching lines...) Expand all Loading... |
3968 header.entropy_flag = false; | 3823 header.entropy_flag = false; |
3969 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3824 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3970 header.fec_group = 0; | 3825 header.fec_group = 0; |
3971 | 3826 |
3972 QuicRstStreamFrame rst_frame; | 3827 QuicRstStreamFrame rst_frame; |
3973 rst_frame.stream_id = 0x01020304; | 3828 rst_frame.stream_id = 0x01020304; |
3974 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708); | 3829 rst_frame.error_code = static_cast<QuicRstStreamErrorCode>(0x05060708); |
3975 rst_frame.error_details = "because I can"; | 3830 rst_frame.error_details = "because I can"; |
3976 rst_frame.byte_offset = 0x0807060504030201; | 3831 rst_frame.byte_offset = 0x0807060504030201; |
3977 | 3832 |
3978 unsigned char packet[] = { | 3833 unsigned char packet[] = {// public flags (8 byte connection_id) |
3979 // public flags (8 byte connection_id) | 3834 0x3C, |
3980 0x3C, | 3835 // connection_id |
3981 // connection_id | 3836 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3982 0x10, 0x32, 0x54, 0x76, | 3837 // packet sequence number |
3983 0x98, 0xBA, 0xDC, 0xFE, | 3838 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3984 // packet sequence number | 3839 // private flags |
3985 0xBC, 0x9A, 0x78, 0x56, | 3840 0x00, |
3986 0x34, 0x12, | |
3987 // private flags | |
3988 0x00, | |
3989 | 3841 |
3990 // frame type (rst stream frame) | 3842 // frame type (rst stream frame) |
3991 0x01, | 3843 0x01, |
3992 // stream id | 3844 // stream id |
3993 0x04, 0x03, 0x02, 0x01, | 3845 0x04, 0x03, 0x02, 0x01, |
3994 // sent byte offset | 3846 // sent byte offset |
3995 0x01, 0x02, 0x03, 0x04, | 3847 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, |
3996 0x05, 0x06, 0x07, 0x08, | 3848 // error code |
3997 // error code | 3849 0x08, 0x07, 0x06, 0x05, |
3998 0x08, 0x07, 0x06, 0x05, | 3850 // error details length |
3999 // error details length | 3851 0x0d, 0x00, |
4000 0x0d, 0x00, | 3852 // error details |
4001 // error details | 3853 'b', 'e', 'c', 'a', 'u', 's', 'e', ' ', |
4002 'b', 'e', 'c', 'a', | 3854 'I', ' ', 'c', 'a', 'n', |
4003 'u', 's', 'e', ' ', | |
4004 'I', ' ', 'c', 'a', | |
4005 'n', | |
4006 }; | 3855 }; |
4007 | 3856 |
4008 QuicFrames frames; | 3857 QuicFrames frames; |
4009 frames.push_back(QuicFrame(&rst_frame)); | 3858 frames.push_back(QuicFrame(&rst_frame)); |
4010 | 3859 |
4011 scoped_ptr<QuicPacket> data( | 3860 scoped_ptr<QuicPacket> data( |
4012 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3861 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4013 ASSERT_TRUE(data != NULL); | 3862 ASSERT_TRUE(data != NULL); |
4014 | 3863 |
4015 test::CompareCharArraysWithHexError("constructed packet", | 3864 test::CompareCharArraysWithHexError("constructed packet", |
4016 data->data(), data->length(), | 3865 data->data(), |
4017 AsChars(packet), arraysize(packet)); | 3866 data->length(), |
| 3867 AsChars(packet), |
| 3868 arraysize(packet)); |
4018 } | 3869 } |
4019 | 3870 |
4020 TEST_P(QuicFramerTest, BuildCloseFramePacket) { | 3871 TEST_P(QuicFramerTest, BuildCloseFramePacket) { |
4021 QuicPacketHeader header; | 3872 QuicPacketHeader header; |
4022 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3873 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4023 header.public_header.reset_flag = false; | 3874 header.public_header.reset_flag = false; |
4024 header.public_header.version_flag = false; | 3875 header.public_header.version_flag = false; |
4025 header.fec_flag = false; | 3876 header.fec_flag = false; |
4026 header.entropy_flag = true; | 3877 header.entropy_flag = true; |
4027 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3878 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4028 header.fec_group = 0; | 3879 header.fec_group = 0; |
4029 | 3880 |
4030 QuicConnectionCloseFrame close_frame; | 3881 QuicConnectionCloseFrame close_frame; |
4031 close_frame.error_code = static_cast<QuicErrorCode>(0x05060708); | 3882 close_frame.error_code = static_cast<QuicErrorCode>(0x05060708); |
4032 close_frame.error_details = "because I can"; | 3883 close_frame.error_details = "because I can"; |
4033 | 3884 |
4034 QuicFrames frames; | 3885 QuicFrames frames; |
4035 frames.push_back(QuicFrame(&close_frame)); | 3886 frames.push_back(QuicFrame(&close_frame)); |
4036 | 3887 |
4037 unsigned char packet[] = { | 3888 unsigned char packet[] = {// public flags (8 byte connection_id) |
4038 // public flags (8 byte connection_id) | 3889 0x3C, |
4039 0x3C, | 3890 // connection_id |
4040 // connection_id | 3891 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4041 0x10, 0x32, 0x54, 0x76, | 3892 // packet sequence number |
4042 0x98, 0xBA, 0xDC, 0xFE, | 3893 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4043 // packet sequence number | 3894 // private flags (entropy) |
4044 0xBC, 0x9A, 0x78, 0x56, | 3895 0x01, |
4045 0x34, 0x12, | |
4046 // private flags (entropy) | |
4047 0x01, | |
4048 | 3896 |
4049 // frame type (connection close frame) | 3897 // frame type (connection close frame) |
4050 0x02, | 3898 0x02, |
4051 // error code | 3899 // error code |
4052 0x08, 0x07, 0x06, 0x05, | 3900 0x08, 0x07, 0x06, 0x05, |
4053 // error details length | 3901 // error details length |
4054 0x0d, 0x00, | 3902 0x0d, 0x00, |
4055 // error details | 3903 // error details |
4056 'b', 'e', 'c', 'a', | 3904 'b', 'e', 'c', 'a', 'u', 's', 'e', ' ', |
4057 'u', 's', 'e', ' ', | 3905 'I', ' ', 'c', 'a', 'n', |
4058 'I', ' ', 'c', 'a', | |
4059 'n', | |
4060 }; | 3906 }; |
4061 | 3907 |
4062 scoped_ptr<QuicPacket> data( | 3908 scoped_ptr<QuicPacket> data( |
4063 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3909 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4064 ASSERT_TRUE(data != NULL); | 3910 ASSERT_TRUE(data != NULL); |
4065 | 3911 |
4066 test::CompareCharArraysWithHexError("constructed packet", | 3912 test::CompareCharArraysWithHexError("constructed packet", |
4067 data->data(), data->length(), | 3913 data->data(), |
4068 AsChars(packet), arraysize(packet)); | 3914 data->length(), |
| 3915 AsChars(packet), |
| 3916 arraysize(packet)); |
4069 } | 3917 } |
4070 | 3918 |
4071 TEST_P(QuicFramerTest, BuildGoAwayPacket) { | 3919 TEST_P(QuicFramerTest, BuildGoAwayPacket) { |
4072 QuicPacketHeader header; | 3920 QuicPacketHeader header; |
4073 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3921 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4074 header.public_header.reset_flag = false; | 3922 header.public_header.reset_flag = false; |
4075 header.public_header.version_flag = false; | 3923 header.public_header.version_flag = false; |
4076 header.fec_flag = false; | 3924 header.fec_flag = false; |
4077 header.entropy_flag = true; | 3925 header.entropy_flag = true; |
4078 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3926 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4079 header.fec_group = 0; | 3927 header.fec_group = 0; |
4080 | 3928 |
4081 QuicGoAwayFrame goaway_frame; | 3929 QuicGoAwayFrame goaway_frame; |
4082 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708); | 3930 goaway_frame.error_code = static_cast<QuicErrorCode>(0x05060708); |
4083 goaway_frame.last_good_stream_id = 0x01020304; | 3931 goaway_frame.last_good_stream_id = 0x01020304; |
4084 goaway_frame.reason_phrase = "because I can"; | 3932 goaway_frame.reason_phrase = "because I can"; |
4085 | 3933 |
4086 QuicFrames frames; | 3934 QuicFrames frames; |
4087 frames.push_back(QuicFrame(&goaway_frame)); | 3935 frames.push_back(QuicFrame(&goaway_frame)); |
4088 | 3936 |
4089 unsigned char packet[] = { | 3937 unsigned char packet[] = {// public flags (8 byte connection_id) |
4090 // public flags (8 byte connection_id) | 3938 0x3C, |
4091 0x3C, | 3939 // connection_id |
4092 // connection_id | 3940 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4093 0x10, 0x32, 0x54, 0x76, | 3941 // packet sequence number |
4094 0x98, 0xBA, 0xDC, 0xFE, | 3942 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4095 // packet sequence number | 3943 // private flags(entropy) |
4096 0xBC, 0x9A, 0x78, 0x56, | 3944 0x01, |
4097 0x34, 0x12, | |
4098 // private flags(entropy) | |
4099 0x01, | |
4100 | 3945 |
4101 // frame type (go away frame) | 3946 // frame type (go away frame) |
4102 0x03, | 3947 0x03, |
4103 // error code | 3948 // error code |
4104 0x08, 0x07, 0x06, 0x05, | 3949 0x08, 0x07, 0x06, 0x05, |
4105 // stream id | 3950 // stream id |
4106 0x04, 0x03, 0x02, 0x01, | 3951 0x04, 0x03, 0x02, 0x01, |
4107 // error details length | 3952 // error details length |
4108 0x0d, 0x00, | 3953 0x0d, 0x00, |
4109 // error details | 3954 // error details |
4110 'b', 'e', 'c', 'a', | 3955 'b', 'e', 'c', 'a', 'u', 's', 'e', ' ', |
4111 'u', 's', 'e', ' ', | 3956 'I', ' ', 'c', 'a', 'n', |
4112 'I', ' ', 'c', 'a', | |
4113 'n', | |
4114 }; | 3957 }; |
4115 | 3958 |
4116 scoped_ptr<QuicPacket> data( | 3959 scoped_ptr<QuicPacket> data( |
4117 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3960 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4118 ASSERT_TRUE(data != NULL); | 3961 ASSERT_TRUE(data != NULL); |
4119 | 3962 |
4120 test::CompareCharArraysWithHexError("constructed packet", | 3963 test::CompareCharArraysWithHexError("constructed packet", |
4121 data->data(), data->length(), | 3964 data->data(), |
4122 AsChars(packet), arraysize(packet)); | 3965 data->length(), |
| 3966 AsChars(packet), |
| 3967 arraysize(packet)); |
4123 } | 3968 } |
4124 | 3969 |
4125 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) { | 3970 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) { |
4126 QuicPacketHeader header; | 3971 QuicPacketHeader header; |
4127 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3972 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4128 header.public_header.reset_flag = false; | 3973 header.public_header.reset_flag = false; |
4129 header.public_header.version_flag = false; | 3974 header.public_header.version_flag = false; |
4130 header.fec_flag = false; | 3975 header.fec_flag = false; |
4131 header.entropy_flag = true; | 3976 header.entropy_flag = true; |
4132 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3977 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4133 header.fec_group = 0; | 3978 header.fec_group = 0; |
4134 | 3979 |
4135 QuicWindowUpdateFrame window_update_frame; | 3980 QuicWindowUpdateFrame window_update_frame; |
4136 window_update_frame.stream_id = 0x01020304; | 3981 window_update_frame.stream_id = 0x01020304; |
4137 window_update_frame.byte_offset = 0x1122334455667788; | 3982 window_update_frame.byte_offset = 0x1122334455667788; |
4138 | 3983 |
4139 QuicFrames frames; | 3984 QuicFrames frames; |
4140 frames.push_back(QuicFrame(&window_update_frame)); | 3985 frames.push_back(QuicFrame(&window_update_frame)); |
4141 | 3986 |
4142 unsigned char packet[] = { | 3987 unsigned char packet[] = {// public flags (8 byte connection_id) |
4143 // public flags (8 byte connection_id) | 3988 0x3C, |
4144 0x3C, | 3989 // connection_id |
4145 // connection_id | 3990 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4146 0x10, 0x32, 0x54, 0x76, | 3991 // packet sequence number |
4147 0x98, 0xBA, 0xDC, 0xFE, | 3992 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4148 // packet sequence number | 3993 // private flags(entropy) |
4149 0xBC, 0x9A, 0x78, 0x56, | 3994 0x01, |
4150 0x34, 0x12, | |
4151 // private flags(entropy) | |
4152 0x01, | |
4153 | 3995 |
4154 // frame type (window update frame) | 3996 // frame type (window update frame) |
4155 0x04, | 3997 0x04, |
4156 // stream id | 3998 // stream id |
4157 0x04, 0x03, 0x02, 0x01, | 3999 0x04, 0x03, 0x02, 0x01, |
4158 // byte offset | 4000 // byte offset |
4159 0x88, 0x77, 0x66, 0x55, | 4001 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, |
4160 0x44, 0x33, 0x22, 0x11, | |
4161 }; | 4002 }; |
4162 | 4003 |
4163 scoped_ptr<QuicPacket> data( | 4004 scoped_ptr<QuicPacket> data( |
4164 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4005 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4165 ASSERT_TRUE(data != NULL); | 4006 ASSERT_TRUE(data != NULL); |
4166 | 4007 |
4167 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 4008 test::CompareCharArraysWithHexError("constructed packet", |
4168 data->length(), AsChars(packet), | 4009 data->data(), |
| 4010 data->length(), |
| 4011 AsChars(packet), |
4169 arraysize(packet)); | 4012 arraysize(packet)); |
4170 } | 4013 } |
4171 | 4014 |
4172 TEST_P(QuicFramerTest, BuildBlockedPacket) { | 4015 TEST_P(QuicFramerTest, BuildBlockedPacket) { |
4173 QuicPacketHeader header; | 4016 QuicPacketHeader header; |
4174 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4017 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4175 header.public_header.reset_flag = false; | 4018 header.public_header.reset_flag = false; |
4176 header.public_header.version_flag = false; | 4019 header.public_header.version_flag = false; |
4177 header.fec_flag = false; | 4020 header.fec_flag = false; |
4178 header.entropy_flag = true; | 4021 header.entropy_flag = true; |
4179 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4022 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4180 header.fec_group = 0; | 4023 header.fec_group = 0; |
4181 | 4024 |
4182 QuicBlockedFrame blocked_frame; | 4025 QuicBlockedFrame blocked_frame; |
4183 blocked_frame.stream_id = 0x01020304; | 4026 blocked_frame.stream_id = 0x01020304; |
4184 | 4027 |
4185 QuicFrames frames; | 4028 QuicFrames frames; |
4186 frames.push_back(QuicFrame(&blocked_frame)); | 4029 frames.push_back(QuicFrame(&blocked_frame)); |
4187 | 4030 |
4188 unsigned char packet[] = { | 4031 unsigned char packet[] = {// public flags (8 byte connection_id) |
4189 // public flags (8 byte connection_id) | 4032 0x3C, |
4190 0x3C, | 4033 // connection_id |
4191 // connection_id | 4034 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4192 0x10, 0x32, 0x54, 0x76, | 4035 // packet sequence number |
4193 0x98, 0xBA, 0xDC, 0xFE, | 4036 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4194 // packet sequence number | 4037 // private flags(entropy) |
4195 0xBC, 0x9A, 0x78, 0x56, | 4038 0x01, |
4196 0x34, 0x12, | |
4197 // private flags(entropy) | |
4198 0x01, | |
4199 | 4039 |
4200 // frame type (blocked frame) | 4040 // frame type (blocked frame) |
4201 0x05, | 4041 0x05, |
4202 // stream id | 4042 // stream id |
4203 0x04, 0x03, 0x02, 0x01, | 4043 0x04, 0x03, 0x02, 0x01, |
4204 }; | 4044 }; |
4205 | 4045 |
4206 scoped_ptr<QuicPacket> data( | 4046 scoped_ptr<QuicPacket> data( |
4207 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4047 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4208 ASSERT_TRUE(data != NULL); | 4048 ASSERT_TRUE(data != NULL); |
4209 | 4049 |
4210 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 4050 test::CompareCharArraysWithHexError("constructed packet", |
4211 data->length(), AsChars(packet), | 4051 data->data(), |
| 4052 data->length(), |
| 4053 AsChars(packet), |
4212 arraysize(packet)); | 4054 arraysize(packet)); |
4213 } | 4055 } |
4214 | 4056 |
4215 TEST_P(QuicFramerTest, BuildPingPacket) { | 4057 TEST_P(QuicFramerTest, BuildPingPacket) { |
4216 QuicPacketHeader header; | 4058 QuicPacketHeader header; |
4217 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4059 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4218 header.public_header.reset_flag = false; | 4060 header.public_header.reset_flag = false; |
4219 header.public_header.version_flag = false; | 4061 header.public_header.version_flag = false; |
4220 header.fec_flag = false; | 4062 header.fec_flag = false; |
4221 header.entropy_flag = true; | 4063 header.entropy_flag = true; |
4222 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4064 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4223 header.fec_group = 0; | 4065 header.fec_group = 0; |
4224 | 4066 |
4225 QuicPingFrame ping_frame; | 4067 QuicPingFrame ping_frame; |
4226 | 4068 |
4227 QuicFrames frames; | 4069 QuicFrames frames; |
4228 frames.push_back(QuicFrame(&ping_frame)); | 4070 frames.push_back(QuicFrame(&ping_frame)); |
4229 | 4071 |
4230 unsigned char packet[] = { | 4072 unsigned char packet[] = {// public flags (8 byte connection_id) |
4231 // public flags (8 byte connection_id) | 4073 0x3C, |
4232 0x3C, | 4074 // connection_id |
4233 // connection_id | 4075 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4234 0x10, 0x32, 0x54, 0x76, | 4076 // packet sequence number |
4235 0x98, 0xBA, 0xDC, 0xFE, | 4077 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4236 // packet sequence number | 4078 // private flags(entropy) |
4237 0xBC, 0x9A, 0x78, 0x56, | 4079 0x01, |
4238 0x34, 0x12, | |
4239 // private flags(entropy) | |
4240 0x01, | |
4241 | 4080 |
4242 // frame type (ping frame) | 4081 // frame type (ping frame) |
4243 0x07, | 4082 0x07, |
4244 }; | 4083 }; |
4245 | 4084 |
4246 if (version_ > QUIC_VERSION_17) { | 4085 if (version_ > QUIC_VERSION_17) { |
4247 scoped_ptr<QuicPacket> data( | 4086 scoped_ptr<QuicPacket> data( |
4248 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4087 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4249 ASSERT_TRUE(data != NULL); | 4088 ASSERT_TRUE(data != NULL); |
4250 | 4089 |
4251 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 4090 test::CompareCharArraysWithHexError("constructed packet", |
4252 data->length(), AsChars(packet), | 4091 data->data(), |
| 4092 data->length(), |
| 4093 AsChars(packet), |
4253 arraysize(packet)); | 4094 arraysize(packet)); |
4254 } else { | 4095 } else { |
4255 string expected_error = | 4096 string expected_error = |
4256 "Attempt to add a PingFrame in " + QuicVersionToString(version_); | 4097 "Attempt to add a PingFrame in " + QuicVersionToString(version_); |
4257 EXPECT_DFATAL(framer_.BuildUnsizedDataPacket(header, frames), | 4098 EXPECT_DFATAL(framer_.BuildUnsizedDataPacket(header, frames), |
4258 expected_error); | 4099 expected_error); |
4259 return; | 4100 return; |
4260 } | 4101 } |
4261 } | 4102 } |
4262 | 4103 |
4263 TEST_P(QuicFramerTest, BuildPublicResetPacket) { | 4104 TEST_P(QuicFramerTest, BuildPublicResetPacket) { |
4264 QuicPublicResetPacket reset_packet; | 4105 QuicPublicResetPacket reset_packet; |
4265 reset_packet.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4106 reset_packet.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4266 reset_packet.public_header.reset_flag = true; | 4107 reset_packet.public_header.reset_flag = true; |
4267 reset_packet.public_header.version_flag = false; | 4108 reset_packet.public_header.version_flag = false; |
4268 reset_packet.rejected_sequence_number = GG_UINT64_C(0x123456789ABC); | 4109 reset_packet.rejected_sequence_number = GG_UINT64_C(0x123456789ABC); |
4269 reset_packet.nonce_proof = GG_UINT64_C(0xABCDEF0123456789); | 4110 reset_packet.nonce_proof = GG_UINT64_C(0xABCDEF0123456789); |
4270 | 4111 |
4271 unsigned char packet[] = { | 4112 unsigned char packet[] = {// public flags (public reset, 8 byte ConnectionId) |
4272 // public flags (public reset, 8 byte ConnectionId) | 4113 0x0E, |
4273 0x0E, | 4114 // connection_id |
4274 // connection_id | 4115 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4275 0x10, 0x32, 0x54, 0x76, | 4116 // message tag (kPRST) |
4276 0x98, 0xBA, 0xDC, 0xFE, | 4117 'P', 'R', 'S', 'T', |
4277 // message tag (kPRST) | 4118 // num_entries (2) + padding |
4278 'P', 'R', 'S', 'T', | 4119 0x02, 0x00, 0x00, 0x00, |
4279 // num_entries (2) + padding | 4120 // tag kRNON |
4280 0x02, 0x00, 0x00, 0x00, | 4121 'R', 'N', 'O', 'N', |
4281 // tag kRNON | 4122 // end offset 8 |
4282 'R', 'N', 'O', 'N', | 4123 0x08, 0x00, 0x00, 0x00, |
4283 // end offset 8 | 4124 // tag kRSEQ |
4284 0x08, 0x00, 0x00, 0x00, | 4125 'R', 'S', 'E', 'Q', |
4285 // tag kRSEQ | 4126 // end offset 16 |
4286 'R', 'S', 'E', 'Q', | 4127 0x10, 0x00, 0x00, 0x00, |
4287 // end offset 16 | 4128 // nonce proof |
4288 0x10, 0x00, 0x00, 0x00, | 4129 0x89, 0x67, 0x45, 0x23, 0x01, 0xEF, 0xCD, 0xAB, |
4289 // nonce proof | 4130 // rejected sequence number |
4290 0x89, 0x67, 0x45, 0x23, | 4131 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, |
4291 0x01, 0xEF, 0xCD, 0xAB, | |
4292 // rejected sequence number | |
4293 0xBC, 0x9A, 0x78, 0x56, | |
4294 0x34, 0x12, 0x00, 0x00, | |
4295 }; | 4132 }; |
4296 | 4133 |
4297 scoped_ptr<QuicEncryptedPacket> data( | 4134 scoped_ptr<QuicEncryptedPacket> data( |
4298 framer_.BuildPublicResetPacket(reset_packet)); | 4135 framer_.BuildPublicResetPacket(reset_packet)); |
4299 ASSERT_TRUE(data != NULL); | 4136 ASSERT_TRUE(data != NULL); |
4300 | 4137 |
4301 test::CompareCharArraysWithHexError("constructed packet", | 4138 test::CompareCharArraysWithHexError("constructed packet", |
4302 data->data(), data->length(), | 4139 data->data(), |
4303 AsChars(packet), arraysize(packet)); | 4140 data->length(), |
| 4141 AsChars(packet), |
| 4142 arraysize(packet)); |
4304 } | 4143 } |
4305 | 4144 |
4306 TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) { | 4145 TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) { |
4307 QuicPublicResetPacket reset_packet; | 4146 QuicPublicResetPacket reset_packet; |
4308 reset_packet.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4147 reset_packet.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4309 reset_packet.public_header.reset_flag = true; | 4148 reset_packet.public_header.reset_flag = true; |
4310 reset_packet.public_header.version_flag = false; | 4149 reset_packet.public_header.version_flag = false; |
4311 reset_packet.rejected_sequence_number = GG_UINT64_C(0x123456789ABC); | 4150 reset_packet.rejected_sequence_number = GG_UINT64_C(0x123456789ABC); |
4312 reset_packet.nonce_proof = GG_UINT64_C(0xABCDEF0123456789); | 4151 reset_packet.nonce_proof = GG_UINT64_C(0xABCDEF0123456789); |
4313 reset_packet.client_address = IPEndPoint(Loopback4(), 0x1234); | 4152 reset_packet.client_address = IPEndPoint(Loopback4(), 0x1234); |
4314 | 4153 |
4315 unsigned char packet[] = { | 4154 unsigned char packet[] = {// public flags (public reset, 8 byte ConnectionId) |
4316 // public flags (public reset, 8 byte ConnectionId) | 4155 0x0E, |
4317 0x0E, | 4156 // connection_id |
4318 // connection_id | 4157 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4319 0x10, 0x32, 0x54, 0x76, | 4158 // message tag (kPRST) |
4320 0x98, 0xBA, 0xDC, 0xFE, | 4159 'P', 'R', 'S', 'T', |
4321 // message tag (kPRST) | 4160 // num_entries (3) + padding |
4322 'P', 'R', 'S', 'T', | 4161 0x03, 0x00, 0x00, 0x00, |
4323 // num_entries (3) + padding | 4162 // tag kRNON |
4324 0x03, 0x00, 0x00, 0x00, | 4163 'R', 'N', 'O', 'N', |
4325 // tag kRNON | 4164 // end offset 8 |
4326 'R', 'N', 'O', 'N', | 4165 0x08, 0x00, 0x00, 0x00, |
4327 // end offset 8 | 4166 // tag kRSEQ |
4328 0x08, 0x00, 0x00, 0x00, | 4167 'R', 'S', 'E', 'Q', |
4329 // tag kRSEQ | 4168 // end offset 16 |
4330 'R', 'S', 'E', 'Q', | 4169 0x10, 0x00, 0x00, 0x00, |
4331 // end offset 16 | 4170 // tag kCADR |
4332 0x10, 0x00, 0x00, 0x00, | 4171 'C', 'A', 'D', 'R', |
4333 // tag kCADR | 4172 // end offset 24 |
4334 'C', 'A', 'D', 'R', | 4173 0x18, 0x00, 0x00, 0x00, |
4335 // end offset 24 | 4174 // nonce proof |
4336 0x18, 0x00, 0x00, 0x00, | 4175 0x89, 0x67, 0x45, 0x23, 0x01, 0xEF, 0xCD, 0xAB, |
4337 // nonce proof | 4176 // rejected sequence number |
4338 0x89, 0x67, 0x45, 0x23, | 4177 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, 0x00, 0x00, |
4339 0x01, 0xEF, 0xCD, 0xAB, | 4178 // client address |
4340 // rejected sequence number | 4179 0x02, 0x00, 0x7F, 0x00, 0x00, 0x01, 0x34, 0x12, |
4341 0xBC, 0x9A, 0x78, 0x56, | |
4342 0x34, 0x12, 0x00, 0x00, | |
4343 // client address | |
4344 0x02, 0x00, | |
4345 0x7F, 0x00, 0x00, 0x01, | |
4346 0x34, 0x12, | |
4347 }; | 4180 }; |
4348 | 4181 |
4349 scoped_ptr<QuicEncryptedPacket> data( | 4182 scoped_ptr<QuicEncryptedPacket> data( |
4350 framer_.BuildPublicResetPacket(reset_packet)); | 4183 framer_.BuildPublicResetPacket(reset_packet)); |
4351 ASSERT_TRUE(data != NULL); | 4184 ASSERT_TRUE(data != NULL); |
4352 | 4185 |
4353 test::CompareCharArraysWithHexError("constructed packet", | 4186 test::CompareCharArraysWithHexError("constructed packet", |
4354 data->data(), data->length(), | 4187 data->data(), |
4355 AsChars(packet), arraysize(packet)); | 4188 data->length(), |
| 4189 AsChars(packet), |
| 4190 arraysize(packet)); |
4356 } | 4191 } |
4357 | 4192 |
4358 TEST_P(QuicFramerTest, BuildFecPacket) { | 4193 TEST_P(QuicFramerTest, BuildFecPacket) { |
4359 QuicPacketHeader header; | 4194 QuicPacketHeader header; |
4360 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4195 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4361 header.public_header.reset_flag = false; | 4196 header.public_header.reset_flag = false; |
4362 header.public_header.version_flag = false; | 4197 header.public_header.version_flag = false; |
4363 header.fec_flag = true; | 4198 header.fec_flag = true; |
4364 header.entropy_flag = true; | 4199 header.entropy_flag = true; |
4365 header.packet_sequence_number = (GG_UINT64_C(0x123456789ABC)); | 4200 header.packet_sequence_number = (GG_UINT64_C(0x123456789ABC)); |
4366 header.is_in_fec_group = IN_FEC_GROUP; | 4201 header.is_in_fec_group = IN_FEC_GROUP; |
4367 header.fec_group = GG_UINT64_C(0x123456789ABB);; | 4202 header.fec_group = GG_UINT64_C(0x123456789ABB); |
| 4203 ; |
4368 | 4204 |
4369 QuicFecData fec_data; | 4205 QuicFecData fec_data; |
4370 fec_data.fec_group = 1; | 4206 fec_data.fec_group = 1; |
4371 fec_data.redundancy = "abcdefghijklmnop"; | 4207 fec_data.redundancy = "abcdefghijklmnop"; |
4372 | 4208 |
4373 unsigned char packet[] = { | 4209 unsigned char packet[] = {// public flags (8 byte connection_id) |
4374 // public flags (8 byte connection_id) | 4210 0x3C, |
4375 0x3C, | 4211 // connection_id |
4376 // connection_id | 4212 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4377 0x10, 0x32, 0x54, 0x76, | 4213 // packet sequence number |
4378 0x98, 0xBA, 0xDC, 0xFE, | 4214 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4379 // packet sequence number | 4215 // private flags (entropy & fec group & fec packet) |
4380 0xBC, 0x9A, 0x78, 0x56, | 4216 0x07, |
4381 0x34, 0x12, | 4217 // first fec protected packet offset |
4382 // private flags (entropy & fec group & fec packet) | 4218 0x01, |
4383 0x07, | |
4384 // first fec protected packet offset | |
4385 0x01, | |
4386 | 4219 |
4387 // redundancy | 4220 // redundancy |
4388 'a', 'b', 'c', 'd', | 4221 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', |
4389 'e', 'f', 'g', 'h', | 4222 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', |
4390 'i', 'j', 'k', 'l', | |
4391 'm', 'n', 'o', 'p', | |
4392 }; | 4223 }; |
4393 | 4224 |
4394 scoped_ptr<QuicPacket> data( | 4225 scoped_ptr<QuicPacket> data(framer_.BuildFecPacket(header, fec_data).packet); |
4395 framer_.BuildFecPacket(header, fec_data).packet); | |
4396 ASSERT_TRUE(data != NULL); | 4226 ASSERT_TRUE(data != NULL); |
4397 | 4227 |
4398 test::CompareCharArraysWithHexError("constructed packet", | 4228 test::CompareCharArraysWithHexError("constructed packet", |
4399 data->data(), data->length(), | 4229 data->data(), |
4400 AsChars(packet), arraysize(packet)); | 4230 data->length(), |
| 4231 AsChars(packet), |
| 4232 arraysize(packet)); |
4401 } | 4233 } |
4402 | 4234 |
4403 TEST_P(QuicFramerTest, EncryptPacket) { | 4235 TEST_P(QuicFramerTest, EncryptPacket) { |
4404 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); | 4236 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); |
4405 unsigned char packet[] = { | 4237 unsigned char packet[] = {// public flags (8 byte connection_id) |
4406 // public flags (8 byte connection_id) | 4238 0x3C, |
4407 0x3C, | 4239 // connection_id |
4408 // connection_id | 4240 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4409 0x10, 0x32, 0x54, 0x76, | 4241 // packet sequence number |
4410 0x98, 0xBA, 0xDC, 0xFE, | 4242 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4411 // packet sequence number | 4243 // private flags (fec group & fec packet) |
4412 0xBC, 0x9A, 0x78, 0x56, | 4244 0x06, |
4413 0x34, 0x12, | 4245 // first fec protected packet offset |
4414 // private flags (fec group & fec packet) | 4246 0x01, |
4415 0x06, | |
4416 // first fec protected packet offset | |
4417 0x01, | |
4418 | 4247 |
4419 // redundancy | 4248 // redundancy |
4420 'a', 'b', 'c', 'd', | 4249 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', |
4421 'e', 'f', 'g', 'h', | 4250 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', |
4422 'i', 'j', 'k', 'l', | |
4423 'm', 'n', 'o', 'p', | |
4424 }; | 4251 }; |
4425 | 4252 |
4426 scoped_ptr<QuicPacket> raw( | 4253 scoped_ptr<QuicPacket> raw( |
4427 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, | 4254 QuicPacket::NewDataPacket(AsChars(packet), |
4428 PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion, | 4255 arraysize(packet), |
| 4256 false, |
| 4257 PACKET_8BYTE_CONNECTION_ID, |
| 4258 !kIncludeVersion, |
4429 PACKET_6BYTE_SEQUENCE_NUMBER)); | 4259 PACKET_6BYTE_SEQUENCE_NUMBER)); |
4430 scoped_ptr<QuicEncryptedPacket> encrypted( | 4260 scoped_ptr<QuicEncryptedPacket> encrypted( |
4431 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 4261 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
4432 | 4262 |
4433 ASSERT_TRUE(encrypted.get() != NULL); | 4263 ASSERT_TRUE(encrypted.get() != NULL); |
4434 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 4264 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
4435 } | 4265 } |
4436 | 4266 |
4437 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { | 4267 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { |
4438 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); | 4268 QuicPacketSequenceNumber sequence_number = GG_UINT64_C(0x123456789ABC); |
4439 unsigned char packet[] = { | 4269 unsigned char packet[] = {// public flags (version, 8 byte connection_id) |
4440 // public flags (version, 8 byte connection_id) | 4270 0x3D, |
4441 0x3D, | 4271 // connection_id |
4442 // connection_id | 4272 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4443 0x10, 0x32, 0x54, 0x76, | 4273 // version tag |
4444 0x98, 0xBA, 0xDC, 0xFE, | 4274 'Q', '.', '1', '0', |
4445 // version tag | 4275 // packet sequence number |
4446 'Q', '.', '1', '0', | 4276 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4447 // packet sequence number | 4277 // private flags (fec group & fec flags) |
4448 0xBC, 0x9A, 0x78, 0x56, | 4278 0x06, |
4449 0x34, 0x12, | 4279 // first fec protected packet offset |
4450 // private flags (fec group & fec flags) | 4280 0x01, |
4451 0x06, | |
4452 // first fec protected packet offset | |
4453 0x01, | |
4454 | 4281 |
4455 // redundancy | 4282 // redundancy |
4456 'a', 'b', 'c', 'd', | 4283 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', |
4457 'e', 'f', 'g', 'h', | 4284 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', |
4458 'i', 'j', 'k', 'l', | |
4459 'm', 'n', 'o', 'p', | |
4460 }; | 4285 }; |
4461 | 4286 |
4462 scoped_ptr<QuicPacket> raw( | 4287 scoped_ptr<QuicPacket> raw( |
4463 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, | 4288 QuicPacket::NewDataPacket(AsChars(packet), |
4464 PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, | 4289 arraysize(packet), |
| 4290 false, |
| 4291 PACKET_8BYTE_CONNECTION_ID, |
| 4292 kIncludeVersion, |
4465 PACKET_6BYTE_SEQUENCE_NUMBER)); | 4293 PACKET_6BYTE_SEQUENCE_NUMBER)); |
4466 scoped_ptr<QuicEncryptedPacket> encrypted( | 4294 scoped_ptr<QuicEncryptedPacket> encrypted( |
4467 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 4295 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
4468 | 4296 |
4469 ASSERT_TRUE(encrypted.get() != NULL); | 4297 ASSERT_TRUE(encrypted.get() != NULL); |
4470 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 4298 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
4471 } | 4299 } |
4472 | 4300 |
4473 TEST_P(QuicFramerTest, Truncation) { | 4301 TEST_P(QuicFramerTest, Truncation) { |
4474 if (framer_.version() <= QUIC_VERSION_15) { | 4302 if (framer_.version() <= QUIC_VERSION_15) { |
(...skipping 18 matching lines...) Expand all Loading... |
4493 QuicFrame frame; | 4321 QuicFrame frame; |
4494 frame.type = ACK_FRAME; | 4322 frame.type = ACK_FRAME; |
4495 frame.ack_frame = &ack_frame; | 4323 frame.ack_frame = &ack_frame; |
4496 QuicFrames frames; | 4324 QuicFrames frames; |
4497 frames.push_back(frame); | 4325 frames.push_back(frame); |
4498 | 4326 |
4499 scoped_ptr<QuicPacket> raw_ack_packet( | 4327 scoped_ptr<QuicPacket> raw_ack_packet( |
4500 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4328 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4501 ASSERT_TRUE(raw_ack_packet != NULL); | 4329 ASSERT_TRUE(raw_ack_packet != NULL); |
4502 | 4330 |
4503 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4331 scoped_ptr<QuicEncryptedPacket> ack_packet(framer_.EncryptPacket( |
4504 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4332 ENCRYPTION_NONE, header.packet_sequence_number, *raw_ack_packet)); |
4505 *raw_ack_packet)); | |
4506 | 4333 |
4507 // Now make sure we can turn our ack packet back into an ack frame | 4334 // Now make sure we can turn our ack packet back into an ack frame |
4508 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4335 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
4509 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4336 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
4510 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4337 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
4511 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); | 4338 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); |
4512 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); | 4339 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); |
4513 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); | 4340 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); |
4514 SequenceNumberSet::const_iterator missing_iter = | 4341 SequenceNumberSet::const_iterator missing_iter = |
4515 processed_ack_frame.received_info.missing_packets.begin(); | 4342 processed_ack_frame.received_info.missing_packets.begin(); |
(...skipping 27 matching lines...) Expand all Loading... |
4543 QuicFrame frame; | 4370 QuicFrame frame; |
4544 frame.type = ACK_FRAME; | 4371 frame.type = ACK_FRAME; |
4545 frame.ack_frame = &ack_frame; | 4372 frame.ack_frame = &ack_frame; |
4546 QuicFrames frames; | 4373 QuicFrames frames; |
4547 frames.push_back(frame); | 4374 frames.push_back(frame); |
4548 | 4375 |
4549 scoped_ptr<QuicPacket> raw_ack_packet( | 4376 scoped_ptr<QuicPacket> raw_ack_packet( |
4550 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4377 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4551 ASSERT_TRUE(raw_ack_packet != NULL); | 4378 ASSERT_TRUE(raw_ack_packet != NULL); |
4552 | 4379 |
4553 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4380 scoped_ptr<QuicEncryptedPacket> ack_packet(framer_.EncryptPacket( |
4554 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4381 ENCRYPTION_NONE, header.packet_sequence_number, *raw_ack_packet)); |
4555 *raw_ack_packet)); | |
4556 | 4382 |
4557 // Now make sure we can turn our ack packet back into an ack frame | 4383 // Now make sure we can turn our ack packet back into an ack frame |
4558 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4384 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
4559 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4385 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
4560 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4386 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
4561 EXPECT_EQ(header.packet_sequence_number - 1, | 4387 EXPECT_EQ(header.packet_sequence_number - 1, |
4562 processed_ack_frame.sent_info.least_unacked); | 4388 processed_ack_frame.sent_info.least_unacked); |
4563 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); | 4389 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); |
4564 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); | 4390 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); |
4565 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); | 4391 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); |
(...skipping 26 matching lines...) Expand all Loading... |
4592 QuicFrame frame; | 4418 QuicFrame frame; |
4593 frame.type = ACK_FRAME; | 4419 frame.type = ACK_FRAME; |
4594 frame.ack_frame = &ack_frame; | 4420 frame.ack_frame = &ack_frame; |
4595 QuicFrames frames; | 4421 QuicFrames frames; |
4596 frames.push_back(frame); | 4422 frames.push_back(frame); |
4597 | 4423 |
4598 scoped_ptr<QuicPacket> raw_ack_packet( | 4424 scoped_ptr<QuicPacket> raw_ack_packet( |
4599 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4425 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4600 ASSERT_TRUE(raw_ack_packet != NULL); | 4426 ASSERT_TRUE(raw_ack_packet != NULL); |
4601 | 4427 |
4602 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4428 scoped_ptr<QuicEncryptedPacket> ack_packet(framer_.EncryptPacket( |
4603 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4429 ENCRYPTION_NONE, header.packet_sequence_number, *raw_ack_packet)); |
4604 *raw_ack_packet)); | |
4605 | 4430 |
4606 // Now make sure we can turn our ack packet back into an ack frame | 4431 // Now make sure we can turn our ack packet back into an ack frame |
4607 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4432 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
4608 | 4433 |
4609 // Test for clean truncation of the ack by comparing the length of the | 4434 // Test for clean truncation of the ack by comparing the length of the |
4610 // original packets to the re-serialized packets. | 4435 // original packets to the re-serialized packets. |
4611 frames.clear(); | 4436 frames.clear(); |
4612 frame.type = ACK_FRAME; | 4437 frame.type = ACK_FRAME; |
4613 frame.ack_frame = visitor_.ack_frames_[0]; | 4438 frame.ack_frame = visitor_.ack_frames_[0]; |
4614 frames.push_back(frame); | 4439 frames.push_back(frame); |
4615 | 4440 |
4616 size_t original_raw_length = raw_ack_packet->length(); | 4441 size_t original_raw_length = raw_ack_packet->length(); |
4617 raw_ack_packet.reset( | 4442 raw_ack_packet.reset(framer_.BuildUnsizedDataPacket(header, frames).packet); |
4618 framer_.BuildUnsizedDataPacket(header, frames).packet); | |
4619 ASSERT_TRUE(raw_ack_packet != NULL); | 4443 ASSERT_TRUE(raw_ack_packet != NULL); |
4620 EXPECT_EQ(original_raw_length, raw_ack_packet->length()); | 4444 EXPECT_EQ(original_raw_length, raw_ack_packet->length()); |
4621 ASSERT_TRUE(raw_ack_packet != NULL); | 4445 ASSERT_TRUE(raw_ack_packet != NULL); |
4622 } | 4446 } |
4623 | 4447 |
4624 TEST_P(QuicFramerTest, EntropyFlagTest) { | 4448 TEST_P(QuicFramerTest, EntropyFlagTest) { |
4625 unsigned char packet[] = { | 4449 unsigned char packet[] = {// public flags (8 byte connection_id) |
4626 // public flags (8 byte connection_id) | 4450 0x3C, |
4627 0x3C, | 4451 // connection_id |
4628 // connection_id | 4452 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4629 0x10, 0x32, 0x54, 0x76, | 4453 // packet sequence number |
4630 0x98, 0xBA, 0xDC, 0xFE, | 4454 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4631 // packet sequence number | 4455 // private flags (Entropy) |
4632 0xBC, 0x9A, 0x78, 0x56, | 4456 0x01, |
4633 0x34, 0x12, | |
4634 // private flags (Entropy) | |
4635 0x01, | |
4636 | 4457 |
4637 // frame type (stream frame with fin and no length) | 4458 // frame type (stream frame with fin and no length) |
4638 0xDF, | 4459 0xDF, |
4639 // stream id | 4460 // stream id |
4640 0x04, 0x03, 0x02, 0x01, | 4461 0x04, 0x03, 0x02, 0x01, |
4641 // offset | 4462 // offset |
4642 0x54, 0x76, 0x10, 0x32, | 4463 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
4643 0xDC, 0xFE, 0x98, 0xBA, | 4464 // data |
4644 // data | 4465 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', |
4645 'h', 'e', 'l', 'l', | 4466 'r', 'l', 'd', '!', |
4646 'o', ' ', 'w', 'o', | |
4647 'r', 'l', 'd', '!', | |
4648 }; | 4467 }; |
4649 | 4468 |
4650 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 4469 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
4651 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4470 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
4652 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4471 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
4653 ASSERT_TRUE(visitor_.header_.get()); | 4472 ASSERT_TRUE(visitor_.header_.get()); |
4654 EXPECT_TRUE(visitor_.header_->entropy_flag); | 4473 EXPECT_TRUE(visitor_.header_->entropy_flag); |
4655 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); | 4474 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); |
4656 EXPECT_FALSE(visitor_.header_->fec_flag); | 4475 EXPECT_FALSE(visitor_.header_->fec_flag); |
4657 }; | 4476 }; |
4658 | 4477 |
4659 TEST_P(QuicFramerTest, FecEntropyTest) { | 4478 TEST_P(QuicFramerTest, FecEntropyTest) { |
4660 unsigned char packet[] = { | 4479 unsigned char packet[] = {// public flags (8 byte connection_id) |
4661 // public flags (8 byte connection_id) | 4480 0x3C, |
4662 0x3C, | 4481 // connection_id |
4663 // connection_id | 4482 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4664 0x10, 0x32, 0x54, 0x76, | 4483 // packet sequence number |
4665 0x98, 0xBA, 0xDC, 0xFE, | 4484 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4666 // packet sequence number | 4485 // private flags (Entropy & fec group & FEC) |
4667 0xBC, 0x9A, 0x78, 0x56, | 4486 0x07, |
4668 0x34, 0x12, | 4487 // first fec protected packet offset |
4669 // private flags (Entropy & fec group & FEC) | 4488 0xFF, |
4670 0x07, | |
4671 // first fec protected packet offset | |
4672 0xFF, | |
4673 | 4489 |
4674 // frame type (stream frame with fin and no length) | 4490 // frame type (stream frame with fin and no length) |
4675 0xDF, | 4491 0xDF, |
4676 // stream id | 4492 // stream id |
4677 0x04, 0x03, 0x02, 0x01, | 4493 0x04, 0x03, 0x02, 0x01, |
4678 // offset | 4494 // offset |
4679 0x54, 0x76, 0x10, 0x32, | 4495 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
4680 0xDC, 0xFE, 0x98, 0xBA, | 4496 // data |
4681 // data | 4497 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', |
4682 'h', 'e', 'l', 'l', | 4498 'r', 'l', 'd', '!', |
4683 'o', ' ', 'w', 'o', | |
4684 'r', 'l', 'd', '!', | |
4685 }; | 4499 }; |
4686 | 4500 |
4687 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 4501 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
4688 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4502 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
4689 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4503 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
4690 ASSERT_TRUE(visitor_.header_.get()); | 4504 ASSERT_TRUE(visitor_.header_.get()); |
4691 EXPECT_TRUE(visitor_.header_->fec_flag); | 4505 EXPECT_TRUE(visitor_.header_->fec_flag); |
4692 EXPECT_TRUE(visitor_.header_->entropy_flag); | 4506 EXPECT_TRUE(visitor_.header_->entropy_flag); |
4693 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); | 4507 EXPECT_EQ(1 << 4, visitor_.header_->entropy_hash); |
4694 }; | 4508 }; |
4695 | 4509 |
4696 TEST_P(QuicFramerTest, StopPacketProcessing) { | 4510 TEST_P(QuicFramerTest, StopPacketProcessing) { |
4697 unsigned char packet[] = { | 4511 unsigned char packet[] = { |
4698 // public flags (8 byte connection_id) | 4512 // public flags (8 byte connection_id) |
4699 0x3C, | 4513 0x3C, |
4700 // connection_id | 4514 // connection_id |
4701 0x10, 0x32, 0x54, 0x76, | 4515 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
4702 0x98, 0xBA, 0xDC, 0xFE, | 4516 // packet sequence number |
4703 // packet sequence number | 4517 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4704 0xBC, 0x9A, 0x78, 0x56, | 4518 // Entropy |
4705 0x34, 0x12, | 4519 0x01, |
4706 // Entropy | |
4707 0x01, | |
4708 | 4520 |
4709 // frame type (stream frame with fin) | 4521 // frame type (stream frame with fin) |
4710 0xFF, | 4522 0xFF, |
4711 // stream id | 4523 // stream id |
4712 0x04, 0x03, 0x02, 0x01, | 4524 0x04, 0x03, 0x02, 0x01, |
4713 // offset | 4525 // offset |
4714 0x54, 0x76, 0x10, 0x32, | 4526 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA, |
4715 0xDC, 0xFE, 0x98, 0xBA, | 4527 // data length |
4716 // data length | 4528 0x0c, 0x00, |
4717 0x0c, 0x00, | 4529 // data |
4718 // data | 4530 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!', |
4719 'h', 'e', 'l', 'l', | |
4720 'o', ' ', 'w', 'o', | |
4721 'r', 'l', 'd', '!', | |
4722 | 4531 |
4723 // frame type (ack frame) | 4532 // frame type (ack frame) |
4724 0x40, | 4533 0x40, |
4725 // entropy hash of sent packets till least awaiting - 1. | 4534 // entropy hash of sent packets till least awaiting - 1. |
4726 0x14, | 4535 0x14, |
4727 // least packet sequence number awaiting an ack | 4536 // least packet sequence number awaiting an ack |
4728 0xA0, 0x9A, 0x78, 0x56, | 4537 0xA0, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4729 0x34, 0x12, | 4538 // entropy hash of all received packets. |
4730 // entropy hash of all received packets. | 4539 0x43, |
4731 0x43, | 4540 // largest observed packet sequence number |
4732 // largest observed packet sequence number | 4541 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4733 0xBF, 0x9A, 0x78, 0x56, | 4542 // num missing packets |
4734 0x34, 0x12, | 4543 0x01, |
4735 // num missing packets | 4544 // missing packet |
4736 0x01, | 4545 0xBE, 0x9A, 0x78, 0x56, 0x34, 0x12, |
4737 // missing packet | |
4738 0xBE, 0x9A, 0x78, 0x56, | |
4739 0x34, 0x12, | |
4740 }; | 4546 }; |
4741 | 4547 |
4742 MockFramerVisitor visitor; | 4548 MockFramerVisitor visitor; |
4743 framer_.set_visitor(&visitor); | 4549 framer_.set_visitor(&visitor); |
4744 EXPECT_CALL(visitor, OnPacket()); | 4550 EXPECT_CALL(visitor, OnPacket()); |
4745 EXPECT_CALL(visitor, OnPacketHeader(_)); | 4551 EXPECT_CALL(visitor, OnPacketHeader(_)); |
4746 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false)); | 4552 EXPECT_CALL(visitor, OnStreamFrame(_)).WillOnce(Return(false)); |
4747 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); | 4553 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); |
4748 EXPECT_CALL(visitor, OnPacketComplete()); | 4554 EXPECT_CALL(visitor, OnPacketComplete()); |
4749 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); | 4555 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); |
4750 | 4556 |
4751 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 4557 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
4752 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4558 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
4753 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4559 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
4754 } | 4560 } |
4755 | 4561 |
4756 } // namespace test | 4562 } // namespace test |
4757 } // namespace net | 4563 } // namespace net |
OLD | NEW |