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 <algorithm> | 5 #include <algorithm> |
6 #include <iostream> | 6 #include <iostream> |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 LOG(FATAL); | 191 LOG(FATAL); |
192 } | 192 } |
193 | 193 |
194 virtual void OnPriority(SpdyStreamId stream_id, | 194 virtual void OnPriority(SpdyStreamId stream_id, |
195 SpdyStreamId parent_stream_id, | 195 SpdyStreamId parent_stream_id, |
196 uint8 weight, | 196 uint8 weight, |
197 bool exclusive) OVERRIDE { | 197 bool exclusive) OVERRIDE { |
198 // Do nothing. | 198 // Do nothing. |
199 } | 199 } |
200 | 200 |
| 201 virtual bool OnUnknownFrame(SpdyStreamId stream_id, |
| 202 int frame_type) override { |
| 203 LOG(FATAL); |
| 204 return false; |
| 205 } |
| 206 |
201 char* ReleaseBuffer() { | 207 char* ReleaseBuffer() { |
202 CHECK(finished_); | 208 CHECK(finished_); |
203 return buffer_.release(); | 209 return buffer_.release(); |
204 } | 210 } |
205 | 211 |
206 virtual void OnWindowUpdate(SpdyStreamId stream_id, | 212 virtual void OnWindowUpdate(SpdyStreamId stream_id, |
207 uint32 delta_window_size) OVERRIDE { | 213 uint32 delta_window_size) OVERRIDE { |
208 LOG(FATAL); | 214 LOG(FATAL); |
209 } | 215 } |
210 | 216 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 headers_frame_count_(0), | 248 headers_frame_count_(0), |
243 push_promise_frame_count_(0), | 249 push_promise_frame_count_(0), |
244 goaway_count_(0), | 250 goaway_count_(0), |
245 setting_count_(0), | 251 setting_count_(0), |
246 settings_ack_sent_(0), | 252 settings_ack_sent_(0), |
247 settings_ack_received_(0), | 253 settings_ack_received_(0), |
248 continuation_count_(0), | 254 continuation_count_(0), |
249 altsvc_count_(0), | 255 altsvc_count_(0), |
250 priority_count_(0), | 256 priority_count_(0), |
251 test_altsvc_ir_(0), | 257 test_altsvc_ir_(0), |
| 258 on_unknown_frame_result_(false), |
252 last_window_update_stream_(0), | 259 last_window_update_stream_(0), |
253 last_window_update_delta_(0), | 260 last_window_update_delta_(0), |
254 last_push_promise_stream_(0), | 261 last_push_promise_stream_(0), |
255 last_push_promise_promised_stream_(0), | 262 last_push_promise_promised_stream_(0), |
256 data_bytes_(0), | 263 data_bytes_(0), |
257 fin_frame_count_(0), | 264 fin_frame_count_(0), |
258 fin_opaque_data_(), | 265 fin_opaque_data_(), |
259 fin_flag_count_(0), | 266 fin_flag_count_(0), |
260 zero_length_data_frame_count_(0), | 267 zero_length_data_frame_count_(0), |
261 control_frame_header_data_count_(0), | 268 control_frame_header_data_count_(0), |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
431 test_altsvc_ir_.set_max_age(max_age); | 438 test_altsvc_ir_.set_max_age(max_age); |
432 test_altsvc_ir_.set_port(port); | 439 test_altsvc_ir_.set_port(port); |
433 test_altsvc_ir_.set_protocol_id(protocol_id.as_string()); | 440 test_altsvc_ir_.set_protocol_id(protocol_id.as_string()); |
434 test_altsvc_ir_.set_host(host.as_string()); | 441 test_altsvc_ir_.set_host(host.as_string()); |
435 if (origin.length() > 0) { | 442 if (origin.length() > 0) { |
436 test_altsvc_ir_.set_origin(origin.as_string()); | 443 test_altsvc_ir_.set_origin(origin.as_string()); |
437 } | 444 } |
438 ++altsvc_count_; | 445 ++altsvc_count_; |
439 } | 446 } |
440 | 447 |
| 448 virtual void OnPriority(SpdyStreamId stream_id, |
| 449 SpdyStreamId parent_stream_id, |
| 450 uint8 weight, |
| 451 bool exclusive) OVERRIDE { |
| 452 ++priority_count_; |
| 453 } |
| 454 |
| 455 virtual bool OnUnknownFrame(SpdyStreamId stream_id, int frame_type) override { |
| 456 DLOG(INFO) << "Unknown frame type " << frame_type; |
| 457 return on_unknown_frame_result_; |
| 458 } |
| 459 |
441 virtual void OnSendCompressedFrame(SpdyStreamId stream_id, | 460 virtual void OnSendCompressedFrame(SpdyStreamId stream_id, |
442 SpdyFrameType type, | 461 SpdyFrameType type, |
443 size_t payload_len, | 462 size_t payload_len, |
444 size_t frame_len) OVERRIDE { | 463 size_t frame_len) OVERRIDE { |
445 last_payload_len_ = payload_len; | 464 last_payload_len_ = payload_len; |
446 last_frame_len_ = frame_len; | 465 last_frame_len_ = frame_len; |
447 } | 466 } |
448 | 467 |
449 virtual void OnPriority(SpdyStreamId stream_id, | |
450 SpdyStreamId parent_stream_id, | |
451 uint8 weight, | |
452 bool exclusive) OVERRIDE { | |
453 ++priority_count_; | |
454 } | |
455 | |
456 virtual void OnReceiveCompressedFrame(SpdyStreamId stream_id, | 468 virtual void OnReceiveCompressedFrame(SpdyStreamId stream_id, |
457 SpdyFrameType type, | 469 SpdyFrameType type, |
458 size_t frame_len) OVERRIDE { | 470 size_t frame_len) OVERRIDE { |
459 last_frame_len_ = frame_len; | 471 last_frame_len_ = frame_len; |
460 } | 472 } |
461 | 473 |
462 // Convenience function which runs a framer simulation with particular input. | 474 // Convenience function which runs a framer simulation with particular input. |
463 void SimulateInFramer(const unsigned char* input, size_t size) { | 475 void SimulateInFramer(const unsigned char* input, size_t size) { |
464 framer_.set_enable_compression(use_compression_); | 476 framer_.set_enable_compression(use_compression_); |
465 framer_.set_visitor(this); | 477 framer_.set_visitor(this); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
516 int headers_frame_count_; | 528 int headers_frame_count_; |
517 int push_promise_frame_count_; | 529 int push_promise_frame_count_; |
518 int goaway_count_; | 530 int goaway_count_; |
519 int setting_count_; | 531 int setting_count_; |
520 int settings_ack_sent_; | 532 int settings_ack_sent_; |
521 int settings_ack_received_; | 533 int settings_ack_received_; |
522 int continuation_count_; | 534 int continuation_count_; |
523 int altsvc_count_; | 535 int altsvc_count_; |
524 int priority_count_; | 536 int priority_count_; |
525 SpdyAltSvcIR test_altsvc_ir_; | 537 SpdyAltSvcIR test_altsvc_ir_; |
| 538 bool on_unknown_frame_result_; |
526 SpdyStreamId last_window_update_stream_; | 539 SpdyStreamId last_window_update_stream_; |
527 uint32 last_window_update_delta_; | 540 uint32 last_window_update_delta_; |
528 SpdyStreamId last_push_promise_stream_; | 541 SpdyStreamId last_push_promise_stream_; |
529 SpdyStreamId last_push_promise_promised_stream_; | 542 SpdyStreamId last_push_promise_promised_stream_; |
530 int data_bytes_; | 543 int data_bytes_; |
531 int fin_frame_count_; // The count of RST_STREAM type frames received. | 544 int fin_frame_count_; // The count of RST_STREAM type frames received. |
532 std::string fin_opaque_data_; | 545 std::string fin_opaque_data_; |
533 int fin_flag_count_; // The count of frames with the FIN flag set. | 546 int fin_flag_count_; // The count of frames with the FIN flag set. |
534 int zero_length_data_frame_count_; // The count of zero-length data frames. | 547 int zero_length_data_frame_count_; // The count of zero-length data frames. |
535 int control_frame_header_data_count_; // The count of chunks received. | 548 int control_frame_header_data_count_; // The count of chunks received. |
(...skipping 10 matching lines...) Expand all Loading... |
546 SpdyStreamId header_stream_id_; | 559 SpdyStreamId header_stream_id_; |
547 SpdyFrameType header_control_type_; | 560 SpdyFrameType header_control_type_; |
548 bool header_buffer_valid_; | 561 bool header_buffer_valid_; |
549 SpdyHeaderBlock headers_; | 562 SpdyHeaderBlock headers_; |
550 }; | 563 }; |
551 | 564 |
552 // Retrieves serialized headers from a HEADERS or SYN_STREAM frame. | 565 // Retrieves serialized headers from a HEADERS or SYN_STREAM frame. |
553 base::StringPiece GetSerializedHeaders(const SpdyFrame* frame, | 566 base::StringPiece GetSerializedHeaders(const SpdyFrame* frame, |
554 const SpdyFramer& framer) { | 567 const SpdyFramer& framer) { |
555 SpdyFrameReader reader(frame->data(), frame->size()); | 568 SpdyFrameReader reader(frame->data(), frame->size()); |
556 reader.Seek(2); // Seek past the frame length. | 569 if (framer.protocol_version() > SPDY3) { |
| 570 reader.Seek(3); // Seek past the frame length. |
| 571 } else { |
| 572 reader.Seek(2); // Seek past the frame length. |
| 573 } |
557 SpdyFrameType frame_type; | 574 SpdyFrameType frame_type; |
558 if (framer.protocol_version() > SPDY3) { | 575 if (framer.protocol_version() > SPDY3) { |
559 uint8 serialized_type; | 576 uint8 serialized_type; |
560 reader.ReadUInt8(&serialized_type); | 577 reader.ReadUInt8(&serialized_type); |
561 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), | 578 frame_type = SpdyConstants::ParseFrameType(framer.protocol_version(), |
562 serialized_type); | 579 serialized_type); |
563 DCHECK_EQ(HEADERS, frame_type); | 580 DCHECK_EQ(HEADERS, frame_type); |
564 uint8 flags; | 581 uint8 flags; |
565 reader.ReadUInt8(&flags); | 582 reader.ReadUInt8(&flags); |
566 if (flags & HEADERS_FLAG_PRIORITY) { | 583 if (flags & HEADERS_FLAG_PRIORITY) { |
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1149 | 1166 |
1150 0x80, spdy_version_ch_, 0x00, 0x03, // RST_STREAM on Stream #3 | 1167 0x80, spdy_version_ch_, 0x00, 0x03, // RST_STREAM on Stream #3 |
1151 0x00, 0x00, 0x00, 0x08, | 1168 0x00, 0x00, 0x00, 0x08, |
1152 0x00, 0x00, 0x00, 0x03, | 1169 0x00, 0x00, 0x00, 0x03, |
1153 0x00, 0x00, 0x00, 0x05, // RST_STREAM_CANCEL | 1170 0x00, 0x00, 0x00, 0x05, // RST_STREAM_CANCEL |
1154 }; | 1171 }; |
1155 | 1172 |
1156 // SYN_STREAM doesn't exist in SPDY4, so instead we send | 1173 // SYN_STREAM doesn't exist in SPDY4, so instead we send |
1157 // HEADERS frames with PRIORITY and END_HEADERS set. | 1174 // HEADERS frames with PRIORITY and END_HEADERS set. |
1158 const unsigned char kV4Input[] = { | 1175 const unsigned char kV4Input[] = { |
1159 0x00, 0x05, 0x01, 0x24, // HEADERS: PRIORITY | END_HEADERS | 1176 0x00, 0x00, 0x05, 0x01, // HEADERS: PRIORITY | END_HEADERS |
1160 0x00, 0x00, 0x00, 0x01, // Stream 1 | 1177 0x24, 0x00, 0x00, 0x00, |
1161 0x00, 0x00, 0x00, 0x00, // Priority 0 | 1178 0x01, 0x00, 0x00, 0x00, // Stream 1, Priority 0 |
1162 0x82, // :method: GET | 1179 0x00, 0x82, // :method: GET |
1163 | 1180 |
1164 0x00, 0x01, 0x01, 0x04, // HEADERS: END_HEADERS | 1181 0x00, 0x00, 0x01, 0x01, // HEADERS: END_HEADERS |
1165 0x00, 0x00, 0x00, 0x01, // Stream 1 | 1182 0x04, 0x00, 0x00, 0x00, // Stream 1 |
1166 0x8c, // :status: 200 | 1183 0x01, 0x8c, // :status: 200 |
1167 | 1184 |
1168 0x00, 0x0c, 0x00, 0x00, // DATA on Stream #1 | 1185 0x00, 0x00, 0x0c, 0x00, // DATA on Stream #1 |
1169 0x00, 0x00, 0x00, 0x01, | 1186 0x00, 0x00, 0x00, 0x00, |
1170 0xde, 0xad, 0xbe, 0xef, | 1187 0x01, 0xde, 0xad, 0xbe, |
1171 0xde, 0xad, 0xbe, 0xef, | 1188 0xef, 0xde, 0xad, 0xbe, |
1172 0xde, 0xad, 0xbe, 0xef, | 1189 0xef, 0xde, 0xad, 0xbe, |
| 1190 0xef, |
1173 | 1191 |
1174 0x00, 0x05, 0x01, 0x24, // HEADERS: PRIORITY | END_HEADERS | 1192 0x00, 0x00, 0x05, 0x01, // HEADERS: PRIORITY | END_HEADERS |
1175 0x00, 0x00, 0x00, 0x03, // Stream 3 | 1193 0x24, 0x00, 0x00, 0x00, |
1176 0x00, 0x00, 0x00, 0x00, // Priority 0 | 1194 0x03, 0x00, 0x00, 0x00, // Stream 3, Priority 0 |
1177 0x82, // :method: GET | 1195 0x00, 0x82, // :method: GET |
1178 | 1196 |
1179 0x00, 0x08, 0x00, 0x00, // DATA on Stream #3 | 1197 0x00, 0x00, 0x08, 0x00, // DATA on Stream #3 |
1180 0x00, 0x00, 0x00, 0x03, | 1198 0x00, 0x00, 0x00, 0x00, |
1181 0xde, 0xad, 0xbe, 0xef, | 1199 0x03, 0xde, 0xad, 0xbe, |
1182 0xde, 0xad, 0xbe, 0xef, | 1200 0xef, 0xde, 0xad, 0xbe, |
| 1201 0xef, |
1183 | 1202 |
1184 0x00, 0x04, 0x00, 0x00, // DATA on Stream #1 | 1203 0x00, 0x00, 0x04, 0x00, // DATA on Stream #1 |
1185 0x00, 0x00, 0x00, 0x01, | 1204 0x00, 0x00, 0x00, 0x00, |
1186 0xde, 0xad, 0xbe, 0xef, | 1205 0x01, 0xde, 0xad, 0xbe, |
| 1206 0xef, |
1187 | 1207 |
1188 0x00, 0x04, 0x03, 0x00, // RST_STREAM on Stream #1 | 1208 0x00, 0x00, 0x04, 0x03, // RST_STREAM on Stream #1 |
1189 0x00, 0x00, 0x00, 0x01, | 1209 0x00, 0x00, 0x00, 0x00, |
1190 0x00, 0x00, 0x00, 0x08, // RST_STREAM_CANCEL | 1210 0x01, 0x00, 0x00, 0x00, |
| 1211 0x08, // RST_STREAM_CANCEL |
1191 | 1212 |
1192 0x00, 0x00, 0x00, 0x00, // DATA on Stream #3 | 1213 0x00, 0x00, 0x00, 0x00, // DATA on Stream #3 |
1193 0x00, 0x00, 0x00, 0x03, | 1214 0x00, 0x00, 0x00, 0x00, |
| 1215 0x03, |
1194 | 1216 |
1195 0x00, 0x0f, 0x03, 0x00, // RST_STREAM on Stream #3 | 1217 0x00, 0x00, 0x0f, 0x03, // RST_STREAM on Stream #3 |
1196 0x00, 0x00, 0x00, 0x03, | 1218 0x00, 0x00, 0x00, 0x00, |
1197 0x00, 0x00, 0x00, 0x08, // RST_STREAM_CANCEL | 1219 0x03, 0x00, 0x00, 0x00, // RST_STREAM_CANCEL |
1198 0x52, 0x45, 0x53, 0x45, // opaque data | 1220 0x08, 0x52, 0x45, 0x53, // opaque data |
1199 0x54, 0x53, 0x54, 0x52, | 1221 0x45, 0x54, 0x53, 0x54, |
1200 0x45, 0x41, 0x4d, | 1222 0x52, 0x45, 0x41, 0x4d, |
1201 }; | 1223 }; |
1202 | 1224 |
1203 TestSpdyVisitor visitor(spdy_version_); | 1225 TestSpdyVisitor visitor(spdy_version_); |
1204 if (IsSpdy2()) { | 1226 if (IsSpdy2()) { |
1205 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | 1227 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); |
1206 } else if (IsSpdy3()) { | 1228 } else if (IsSpdy3()) { |
1207 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 1229 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
1208 } else { | 1230 } else { |
1209 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); | 1231 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); |
1210 } | 1232 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1284 0xde, 0xad, 0xbe, 0xef, | 1306 0xde, 0xad, 0xbe, 0xef, |
1285 | 1307 |
1286 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1, with EOF | 1308 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1, with EOF |
1287 0x01, 0x00, 0x00, 0x04, | 1309 0x01, 0x00, 0x00, 0x04, |
1288 0xde, 0xad, 0xbe, 0xef, | 1310 0xde, 0xad, 0xbe, 0xef, |
1289 }; | 1311 }; |
1290 | 1312 |
1291 // SYN_STREAM and SYN_REPLY don't exist in SPDY4, so instead we send | 1313 // SYN_STREAM and SYN_REPLY don't exist in SPDY4, so instead we send |
1292 // HEADERS frames with PRIORITY(SYN_STREAM only) and END_HEADERS set. | 1314 // HEADERS frames with PRIORITY(SYN_STREAM only) and END_HEADERS set. |
1293 const unsigned char kV4Input[] = { | 1315 const unsigned char kV4Input[] = { |
1294 0x00, 0x05, 0x01, 0x24, // HEADERS: PRIORITY | END_HEADERS | 1316 0x00, 0x00, 0x05, 0x01, // HEADERS: PRIORITY | END_HEADERS |
1295 0x00, 0x00, 0x00, 0x01, // Stream 1 | 1317 0x24, 0x00, 0x00, 0x00, // Stream 1 |
1296 0x00, 0x00, 0x00, 0x00, // Priority 0 | 1318 0x01, 0x00, 0x00, 0x00, // Priority 0 |
1297 0x82, // :method: GET | 1319 0x00, 0x82, // :method: GET |
1298 | 1320 |
1299 0x00, 0x01, 0x01, 0x04, // HEADERS: END_HEADERS | 1321 0x00, 0x00, 0x01, 0x01, // HEADERS: END_HEADERS |
1300 0x00, 0x00, 0x00, 0x01, // Stream 1 | 1322 0x04, 0x00, 0x00, 0x00, // Stream 1 |
1301 0x8c, // :status: 200 | 1323 0x01, 0x8c, // :status: 200 |
1302 | 1324 |
1303 0x00, 0x0c, 0x00, 0x00, // DATA on Stream #1 | 1325 0x00, 0x00, 0x0c, 0x00, // DATA on Stream #1 |
1304 0x00, 0x00, 0x00, 0x01, | 1326 0x00, 0x00, 0x00, 0x00, |
1305 0xde, 0xad, 0xbe, 0xef, | 1327 0x01, 0xde, 0xad, 0xbe, |
1306 0xde, 0xad, 0xbe, 0xef, | 1328 0xef, 0xde, 0xad, 0xbe, |
1307 0xde, 0xad, 0xbe, 0xef, | 1329 0xef, 0xde, 0xad, 0xbe, |
| 1330 0xef, |
1308 | 1331 |
1309 0x00, 0x04, 0x00, 0x01, // DATA on Stream #1, with FIN | 1332 0x00, 0x00, 0x04, 0x00, // DATA on Stream #1, with FIN |
1310 0x00, 0x00, 0x00, 0x01, | 1333 0x01, 0x00, 0x00, 0x00, |
1311 0xde, 0xad, 0xbe, 0xef, | 1334 0x01, 0xde, 0xad, 0xbe, |
| 1335 0xef, |
1312 }; | 1336 }; |
1313 | 1337 |
1314 TestSpdyVisitor visitor(spdy_version_); | 1338 TestSpdyVisitor visitor(spdy_version_); |
1315 if (IsSpdy2()) { | 1339 if (IsSpdy2()) { |
1316 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | 1340 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); |
1317 } else if (IsSpdy3()) { | 1341 } else if (IsSpdy3()) { |
1318 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 1342 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
1319 } else { | 1343 } else { |
1320 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); | 1344 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); |
1321 } | 1345 } |
(...skipping 10 matching lines...) Expand all Loading... |
1332 EXPECT_EQ(16, visitor.data_bytes_); | 1356 EXPECT_EQ(16, visitor.data_bytes_); |
1333 EXPECT_EQ(0, visitor.fin_frame_count_); | 1357 EXPECT_EQ(0, visitor.fin_frame_count_); |
1334 EXPECT_EQ(0, visitor.fin_flag_count_); | 1358 EXPECT_EQ(0, visitor.fin_flag_count_); |
1335 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); | 1359 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); |
1336 EXPECT_EQ(2, visitor.data_frame_count_); | 1360 EXPECT_EQ(2, visitor.data_frame_count_); |
1337 } | 1361 } |
1338 | 1362 |
1339 // Test that the FIN flag on a SYN reply frame signifies EOF. | 1363 // Test that the FIN flag on a SYN reply frame signifies EOF. |
1340 TEST_P(SpdyFramerTest, FinOnSynReplyFrame) { | 1364 TEST_P(SpdyFramerTest, FinOnSynReplyFrame) { |
1341 const unsigned char kV2Input[] = { | 1365 const unsigned char kV2Input[] = { |
1342 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #1 | 1366 0x80, spdy_version_ch_, 0x00, // SYN Stream #1 |
1343 0x00, 0x00, 0x00, 0x14, | 1367 0x01, 0x00, 0x00, 0x00, |
1344 0x00, 0x00, 0x00, 0x01, | 1368 0x14, 0x00, 0x00, 0x00, |
| 1369 0x01, 0x00, 0x00, 0x00, |
1345 0x00, 0x00, 0x00, 0x00, | 1370 0x00, 0x00, 0x00, 0x00, |
1346 0x00, 0x00, 0x00, 0x01, | 1371 0x01, 0x00, 0x02, 'h', |
1347 0x00, 0x02, 'h', 'h', | 1372 'h', 0x00, 0x02, 'v', |
1348 0x00, 0x02, 'v', 'v', | 1373 'v', |
1349 | 1374 |
1350 0x80, spdy_version_ch_, 0x00, 0x02, // SYN REPLY Stream #1 | 1375 0x80, spdy_version_ch_, 0x00, // SYN REPLY Stream #1 |
1351 0x01, 0x00, 0x00, 0x10, | 1376 0x02, 0x01, 0x00, 0x00, |
1352 0x00, 0x00, 0x00, 0x01, | 1377 0x10, 0x00, 0x00, 0x00, |
1353 0x00, 0x00, 0x00, 0x01, | 1378 0x01, 0x00, 0x00, 0x00, |
1354 0x00, 0x02, 'a', 'a', | 1379 0x01, 0x00, 0x02, 'a', |
1355 0x00, 0x02, 'b', 'b', | 1380 'a', 0x00, 0x02, 'b', |
| 1381 'b', |
1356 }; | 1382 }; |
1357 const unsigned char kV3Input[] = { | 1383 const unsigned char kV3Input[] = { |
1358 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #1 | 1384 0x80, spdy_version_ch_, 0x00, // SYN Stream #1 |
1359 0x00, 0x00, 0x00, 0x1a, | 1385 0x01, 0x00, 0x00, 0x00, |
1360 0x00, 0x00, 0x00, 0x01, | 1386 0x1a, 0x00, 0x00, 0x00, |
| 1387 0x01, 0x00, 0x00, 0x00, |
1361 0x00, 0x00, 0x00, 0x00, | 1388 0x00, 0x00, 0x00, 0x00, |
1362 0x00, 0x00, 0x00, 0x00, | 1389 0x00, 0x00, 0x01, 0x00, |
1363 0x00, 0x01, 0x00, 0x00, | 1390 0x00, 0x00, 0x02, 'h', |
1364 0x00, 0x02, 'h', 'h', | 1391 'h', 0x00, 0x00, 0x00, |
1365 0x00, 0x00, 0x00, 0x02, | 1392 0x02, 'v', 'v', |
1366 'v', 'v', | |
1367 | 1393 |
1368 0x80, spdy_version_ch_, 0x00, 0x02, // SYN REPLY Stream #1 | 1394 0x80, spdy_version_ch_, 0x00, // SYN REPLY Stream #1 |
1369 0x01, 0x00, 0x00, 0x14, | 1395 0x02, 0x01, 0x00, 0x00, |
1370 0x00, 0x00, 0x00, 0x01, | 1396 0x14, 0x00, 0x00, 0x00, |
1371 0x00, 0x00, 0x00, 0x01, | 1397 0x01, 0x00, 0x00, 0x00, |
1372 0x00, 0x00, 0x00, 0x02, | 1398 0x01, 0x00, 0x00, 0x00, |
1373 'a', 'a', 0x00, 0x00, | 1399 0x02, 'a', 'a', 0x00, |
1374 0x00, 0x02, 'b', 'b', | 1400 0x00, 0x00, 0x02, 'b', |
| 1401 'b', |
1375 }; | 1402 }; |
1376 | 1403 |
1377 // SYN_STREAM and SYN_REPLY don't exist in SPDY4, so instead we send | 1404 // SYN_STREAM and SYN_REPLY don't exist in SPDY4, so instead we send |
1378 // HEADERS frames with PRIORITY(SYN_STREAM only) and END_HEADERS set. | 1405 // HEADERS frames with PRIORITY(SYN_STREAM only) and END_HEADERS set. |
1379 const unsigned char kV4Input[] = { | 1406 const unsigned char kV4Input[] = { |
1380 0x00, 0x05, 0x01, 0x24, // HEADERS: PRIORITY | END_HEADERS | 1407 0x00, 0x00, 0x05, 0x01, // HEADERS: PRIORITY | END_HEADERS |
1381 0x00, 0x00, 0x00, 0x01, // Stream 1 | 1408 0x24, 0x00, 0x00, 0x00, |
1382 0x00, 0x00, 0x00, 0x00, // Priority 0 | 1409 0x01, 0x00, 0x00, 0x00, // Stream 1, Priority 0 |
1383 0x82, // :method: GET | 1410 0x00, 0x82, // :method: GET |
1384 | 1411 |
1385 0x00, 0x01, 0x01, 0x05, // HEADERS: FIN | END_HEADERS | 1412 0x00, 0x00, 0x01, 0x01, // HEADERS: FIN | END_HEADERS |
1386 0x00, 0x00, 0x00, 0x01, // Stream 1 | 1413 0x05, 0x00, 0x00, 0x00, |
1387 0x8c, // :status: 200 | 1414 0x01, 0x8c, // Stream 1, :status: 200 |
1388 }; | 1415 }; |
1389 | 1416 |
1390 TestSpdyVisitor visitor(spdy_version_); | 1417 TestSpdyVisitor visitor(spdy_version_); |
1391 if (IsSpdy2()) { | 1418 if (IsSpdy2()) { |
1392 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | 1419 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); |
1393 } else if (IsSpdy3()) { | 1420 } else if (IsSpdy3()) { |
1394 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 1421 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
1395 } else { | 1422 } else { |
1396 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); | 1423 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); |
1397 } | 1424 } |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1535 SpdyWindowUpdateIR(1, 0x12345678))); | 1562 SpdyWindowUpdateIR(1, 0x12345678))); |
1536 | 1563 |
1537 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678"; | 1564 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678"; |
1538 const unsigned char kV3FrameData[] = { // Also applies for V2. | 1565 const unsigned char kV3FrameData[] = { // Also applies for V2. |
1539 0x80, spdy_version_ch_, 0x00, 0x09, | 1566 0x80, spdy_version_ch_, 0x00, 0x09, |
1540 0x00, 0x00, 0x00, 0x08, | 1567 0x00, 0x00, 0x00, 0x08, |
1541 0x00, 0x00, 0x00, 0x01, | 1568 0x00, 0x00, 0x00, 0x01, |
1542 0x12, 0x34, 0x56, 0x78 | 1569 0x12, 0x34, 0x56, 0x78 |
1543 }; | 1570 }; |
1544 const unsigned char kV4FrameData[] = { | 1571 const unsigned char kV4FrameData[] = { |
1545 0x00, 0x04, 0x08, 0x00, | 1572 0x00, 0x00, 0x04, 0x08, |
1546 0x00, 0x00, 0x00, 0x01, | 1573 0x00, 0x00, 0x00, 0x00, |
1547 0x12, 0x34, 0x56, 0x78 | 1574 0x01, 0x12, 0x34, 0x56, |
| 1575 0x78 |
1548 }; | 1576 }; |
1549 | 1577 |
1550 if (IsSpdy4()) { | 1578 if (IsSpdy4()) { |
1551 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 1579 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
1552 } else { | 1580 } else { |
1553 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 1581 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
1554 } | 1582 } |
1555 } | 1583 } |
1556 | 1584 |
1557 TEST_P(SpdyFramerTest, CreateDataFrame) { | 1585 TEST_P(SpdyFramerTest, CreateDataFrame) { |
1558 SpdyFramer framer(spdy_version_); | 1586 SpdyFramer framer(spdy_version_); |
1559 | 1587 |
1560 { | 1588 { |
1561 const char kDescription[] = "'hello' data frame, no FIN"; | 1589 const char kDescription[] = "'hello' data frame, no FIN"; |
1562 const unsigned char kV3FrameData[] = { // Also applies for V2. | 1590 const unsigned char kV3FrameData[] = { // Also applies for V2. |
1563 0x00, 0x00, 0x00, 0x01, | 1591 0x00, 0x00, 0x00, 0x01, |
1564 0x00, 0x00, 0x00, 0x05, | 1592 0x00, 0x00, 0x00, 0x05, |
1565 'h', 'e', 'l', 'l', | 1593 'h', 'e', 'l', 'l', |
1566 'o' | 1594 'o' |
1567 }; | 1595 }; |
1568 const unsigned char kV4FrameData[] = { | 1596 const unsigned char kV4FrameData[] = { |
1569 0x00, 0x05, 0x00, 0x00, | 1597 0x00, 0x00, 0x05, 0x00, |
1570 0x00, 0x00, 0x00, 0x01, | 1598 0x00, 0x00, 0x00, 0x00, |
1571 'h', 'e', 'l', 'l', | 1599 0x01, 'h', 'e', 'l', |
1572 'o' | 1600 'l', 'o' |
1573 }; | 1601 }; |
1574 const char bytes[] = "hello"; | 1602 const char bytes[] = "hello"; |
1575 | 1603 |
1576 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); | 1604 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); |
1577 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 1605 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
1578 if (IsSpdy4()) { | 1606 if (IsSpdy4()) { |
1579 CompareFrame( | 1607 CompareFrame( |
1580 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 1608 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
1581 } else { | 1609 } else { |
1582 CompareFrame( | 1610 CompareFrame( |
(...skipping 15 matching lines...) Expand all Loading... |
1598 { | 1626 { |
1599 const char kDescription[] = "'hello' data frame with more padding, no FIN"; | 1627 const char kDescription[] = "'hello' data frame with more padding, no FIN"; |
1600 const unsigned char kV3FrameData[] = { // Also applies for V2. | 1628 const unsigned char kV3FrameData[] = { // Also applies for V2. |
1601 0x00, 0x00, 0x00, 0x01, | 1629 0x00, 0x00, 0x00, 0x01, |
1602 0x00, 0x00, 0x00, 0x05, | 1630 0x00, 0x00, 0x00, 0x05, |
1603 'h', 'e', 'l', 'l', | 1631 'h', 'e', 'l', 'l', |
1604 'o' | 1632 'o' |
1605 }; | 1633 }; |
1606 | 1634 |
1607 const unsigned char kV4FrameData[] = { | 1635 const unsigned char kV4FrameData[] = { |
1608 0x00, 0xfd, 0x00, 0x08, // Length = 253. PADDED set. | 1636 0x00, 0x00, 0xfd, 0x00, // Length = 253. PADDED set. |
1609 0x00, 0x00, 0x00, 0x01, | 1637 0x08, 0x00, 0x00, 0x00, |
1610 0xf7, // Pad length field. | 1638 0x01, 0xf7, // Pad length field. |
1611 'h', 'e', 'l', 'l', // Data | 1639 'h', 'e', 'l', 'l', // Data |
1612 'o', | 1640 'o', |
1613 // Padding of 247 zeros. | 1641 // Padding of 247 zeros. |
1614 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', | 1642 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', |
1615 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', | 1643 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', |
1616 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', | 1644 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', |
1617 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', | 1645 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', |
1618 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', | 1646 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', |
1619 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', | 1647 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', |
1620 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', | 1648 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1658 { | 1686 { |
1659 const char kDescription[] = "'hello' data frame with few padding, no FIN"; | 1687 const char kDescription[] = "'hello' data frame with few padding, no FIN"; |
1660 const unsigned char kV3FrameData[] = { // Also applies for V2. | 1688 const unsigned char kV3FrameData[] = { // Also applies for V2. |
1661 0x00, 0x00, 0x00, 0x01, | 1689 0x00, 0x00, 0x00, 0x01, |
1662 0x00, 0x00, 0x00, 0x05, | 1690 0x00, 0x00, 0x00, 0x05, |
1663 'h', 'e', 'l', 'l', | 1691 'h', 'e', 'l', 'l', |
1664 'o' | 1692 'o' |
1665 }; | 1693 }; |
1666 | 1694 |
1667 const unsigned char kV4FrameData[] = { | 1695 const unsigned char kV4FrameData[] = { |
1668 0x00, 0x0d, 0x00, 0x08, // Length = 13. PADDED set. | 1696 0x00, 0x00, 0x0d, 0x00, // Length = 13. PADDED set. |
1669 0x00, 0x00, 0x00, 0x01, | 1697 0x08, 0x00, 0x00, 0x00, |
1670 0x07, // Pad length field. | 1698 0x01, 0x07, // Pad length field. |
1671 'h', 'e', 'l', 'l', // Data | 1699 'h', 'e', 'l', 'l', // Data |
1672 'o', | 1700 'o', |
1673 '0', '0', '0', '0', // Padding | 1701 '0', '0', '0', '0', // Padding |
1674 '0', '0', '0' | 1702 '0', '0', '0' |
1675 }; | 1703 }; |
1676 const char bytes[] = "hello"; | 1704 const char bytes[] = "hello"; |
1677 | 1705 |
1678 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); | 1706 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); |
1679 // 7 zeros and the pad length field make the overall padding to be 8 bytes. | 1707 // 7 zeros and the pad length field make the overall padding to be 8 bytes. |
1680 data_ir.set_padding_len(8); | 1708 data_ir.set_padding_len(8); |
(...skipping 11 matching lines...) Expand all Loading... |
1692 const char kDescription[] = | 1720 const char kDescription[] = |
1693 "'hello' data frame with 1 byte padding, no FIN"; | 1721 "'hello' data frame with 1 byte padding, no FIN"; |
1694 const unsigned char kV3FrameData[] = { // Also applies for V2. | 1722 const unsigned char kV3FrameData[] = { // Also applies for V2. |
1695 0x00, 0x00, 0x00, 0x01, | 1723 0x00, 0x00, 0x00, 0x01, |
1696 0x00, 0x00, 0x00, 0x05, | 1724 0x00, 0x00, 0x00, 0x05, |
1697 'h', 'e', 'l', 'l', | 1725 'h', 'e', 'l', 'l', |
1698 'o' | 1726 'o' |
1699 }; | 1727 }; |
1700 | 1728 |
1701 const unsigned char kV4FrameData[] = { | 1729 const unsigned char kV4FrameData[] = { |
1702 0x00, 0x06, 0x00, 0x08, // Length = 6. PADDED set. | 1730 0x00, 0x00, 0x06, 0x00, // Length = 6. PADDED set. |
1703 0x00, 0x00, 0x00, 0x01, | 1731 0x08, 0x00, 0x00, 0x00, |
1704 0x00, // Pad length field. | 1732 0x01, 0x00, // Pad length field. |
1705 'h', 'e', 'l', 'l', // Data | 1733 'h', 'e', 'l', 'l', // Data |
1706 'o', | 1734 'o', |
1707 }; | 1735 }; |
1708 const char bytes[] = "hello"; | 1736 const char bytes[] = "hello"; |
1709 | 1737 |
1710 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); | 1738 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); |
1711 // The pad length field itself is used for the 1-byte padding and no padding | 1739 // The pad length field itself is used for the 1-byte padding and no padding |
1712 // payload is needed. | 1740 // payload is needed. |
1713 data_ir.set_padding_len(1); | 1741 data_ir.set_padding_len(1); |
1714 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 1742 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
(...skipping 15 matching lines...) Expand all Loading... |
1730 } | 1758 } |
1731 | 1759 |
1732 { | 1760 { |
1733 const char kDescription[] = "Data frame with negative data byte, no FIN"; | 1761 const char kDescription[] = "Data frame with negative data byte, no FIN"; |
1734 const unsigned char kV3FrameData[] = { // Also applies for V2. | 1762 const unsigned char kV3FrameData[] = { // Also applies for V2. |
1735 0x00, 0x00, 0x00, 0x01, | 1763 0x00, 0x00, 0x00, 0x01, |
1736 0x00, 0x00, 0x00, 0x01, | 1764 0x00, 0x00, 0x00, 0x01, |
1737 0xff | 1765 0xff |
1738 }; | 1766 }; |
1739 const unsigned char kV4FrameData[] = { | 1767 const unsigned char kV4FrameData[] = { |
1740 0x00, 0x01, 0x00, 0x00, | 1768 0x00, 0x00, 0x01, 0x00, 0x00, |
1741 0x00, 0x00, 0x00, 0x01, | 1769 0x00, 0x00, 0x00, 0x01, |
1742 0xff | 1770 0xff |
1743 }; | 1771 }; |
1744 SpdyDataIR data_ir(1, StringPiece("\xff", 1)); | 1772 SpdyDataIR data_ir(1, StringPiece("\xff", 1)); |
1745 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 1773 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
1746 if (IsSpdy4()) { | 1774 if (IsSpdy4()) { |
1747 CompareFrame( | 1775 CompareFrame( |
1748 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 1776 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
1749 } else { | 1777 } else { |
1750 CompareFrame( | 1778 CompareFrame( |
1751 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 1779 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
1752 } | 1780 } |
1753 } | 1781 } |
1754 | 1782 |
1755 { | 1783 { |
1756 const char kDescription[] = "'hello' data frame, with FIN"; | 1784 const char kDescription[] = "'hello' data frame, with FIN"; |
1757 const unsigned char kV3FrameData[] = { // Also applies for V2. | 1785 const unsigned char kV3FrameData[] = { // Also applies for V2. |
1758 0x00, 0x00, 0x00, 0x01, | 1786 0x00, 0x00, 0x00, 0x01, |
1759 0x01, 0x00, 0x00, 0x05, | 1787 0x01, 0x00, 0x00, 0x05, |
1760 'h', 'e', 'l', 'l', | 1788 'h', 'e', 'l', 'l', |
1761 'o' | 1789 'o' |
1762 }; | 1790 }; |
1763 const unsigned char kV4FrameData[] = { | 1791 const unsigned char kV4FrameData[] = { |
1764 0x00, 0x05, 0x00, 0x01, | 1792 0x00, 0x00, 0x05, 0x00, |
1765 0x00, 0x00, 0x00, 0x01, | 1793 0x01, 0x00, 0x00, 0x00, |
1766 'h', 'e', 'l', 'l', | 1794 0x01, 'h', 'e', 'l', |
1767 'o' | 1795 'l', 'o' |
1768 }; | 1796 }; |
1769 SpdyDataIR data_ir(1, StringPiece("hello", 5)); | 1797 SpdyDataIR data_ir(1, StringPiece("hello", 5)); |
1770 data_ir.set_fin(true); | 1798 data_ir.set_fin(true); |
1771 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 1799 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
1772 if (IsSpdy4()) { | 1800 if (IsSpdy4()) { |
1773 CompareFrame( | 1801 CompareFrame( |
1774 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 1802 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
1775 } else { | 1803 } else { |
1776 CompareFrame( | 1804 CompareFrame( |
1777 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 1805 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
1778 } | 1806 } |
1779 } | 1807 } |
1780 | 1808 |
1781 { | 1809 { |
1782 const char kDescription[] = "Empty data frame"; | 1810 const char kDescription[] = "Empty data frame"; |
1783 const unsigned char kV3FrameData[] = { // Also applies for V2. | 1811 const unsigned char kV3FrameData[] = { // Also applies for V2. |
1784 0x00, 0x00, 0x00, 0x01, | 1812 0x00, 0x00, 0x00, 0x01, |
1785 0x00, 0x00, 0x00, 0x00, | 1813 0x00, 0x00, 0x00, 0x00, |
1786 }; | 1814 }; |
1787 const unsigned char kV4FrameData[] = { | 1815 const unsigned char kV4FrameData[] = { |
1788 0x00, 0x00, 0x00, 0x00, | 1816 0x00, 0x00, 0x00, 0x00, |
1789 0x00, 0x00, 0x00, 0x01, | 1817 0x00, 0x00, 0x00, 0x00, |
| 1818 0x01, |
1790 }; | 1819 }; |
1791 SpdyDataIR data_ir(1, StringPiece()); | 1820 SpdyDataIR data_ir(1, StringPiece()); |
1792 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 1821 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
1793 if (IsSpdy4()) { | 1822 if (IsSpdy4()) { |
1794 CompareFrame( | 1823 CompareFrame( |
1795 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 1824 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
1796 } else { | 1825 } else { |
1797 CompareFrame( | 1826 CompareFrame( |
1798 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 1827 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
1799 } | 1828 } |
1800 | 1829 |
1801 frame.reset(framer.SerializeDataFrameHeaderWithPaddingLengthField(data_ir)); | 1830 frame.reset(framer.SerializeDataFrameHeaderWithPaddingLengthField(data_ir)); |
1802 CompareCharArraysWithHexError( | 1831 CompareCharArraysWithHexError( |
1803 kDescription, | 1832 kDescription, |
1804 reinterpret_cast<const unsigned char*>(frame->data()), | 1833 reinterpret_cast<const unsigned char*>(frame->data()), |
1805 framer.GetDataFrameMinimumSize(), | 1834 framer.GetDataFrameMinimumSize(), |
1806 IsSpdy4() ? kV4FrameData : kV3FrameData, | 1835 IsSpdy4() ? kV4FrameData : kV3FrameData, |
1807 framer.GetDataFrameMinimumSize()); | 1836 framer.GetDataFrameMinimumSize()); |
1808 } | 1837 } |
1809 | 1838 |
1810 { | 1839 { |
1811 const char kDescription[] = "Data frame with max stream ID"; | 1840 const char kDescription[] = "Data frame with max stream ID"; |
1812 const unsigned char kV3FrameData[] = { // Also applies for V2. | 1841 const unsigned char kV3FrameData[] = { // Also applies for V2. |
1813 0x7f, 0xff, 0xff, 0xff, | 1842 0x7f, 0xff, 0xff, 0xff, |
1814 0x01, 0x00, 0x00, 0x05, | 1843 0x01, 0x00, 0x00, 0x05, |
1815 'h', 'e', 'l', 'l', | 1844 'h', 'e', 'l', 'l', |
1816 'o' | 1845 'o' |
1817 }; | 1846 }; |
1818 const unsigned char kV4FrameData[] = { | 1847 const unsigned char kV4FrameData[] = { |
1819 0x00, 0x05, 0x00, 0x01, | 1848 0x00, 0x00, 0x05, 0x00, |
1820 0x7f, 0xff, 0xff, 0xff, | 1849 0x01, 0x7f, 0xff, 0xff, |
1821 'h', 'e', 'l', 'l', | 1850 0xff, 'h', 'e', 'l', |
1822 'o' | 1851 'l', 'o' |
1823 }; | 1852 }; |
1824 SpdyDataIR data_ir(0x7fffffff, "hello"); | 1853 SpdyDataIR data_ir(0x7fffffff, "hello"); |
1825 data_ir.set_fin(true); | 1854 data_ir.set_fin(true); |
1826 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 1855 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
1827 if (IsSpdy4()) { | 1856 if (IsSpdy4()) { |
1828 CompareFrame( | 1857 CompareFrame( |
1829 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 1858 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
1830 } else { | 1859 } else { |
1831 CompareFrame( | 1860 CompareFrame( |
1832 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 1861 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2275 | 2304 |
2276 { | 2305 { |
2277 const char kDescription[] = "RST_STREAM frame"; | 2306 const char kDescription[] = "RST_STREAM frame"; |
2278 const unsigned char kV3FrameData[] = { // Also applies for V2. | 2307 const unsigned char kV3FrameData[] = { // Also applies for V2. |
2279 0x80, spdy_version_ch_, 0x00, 0x03, | 2308 0x80, spdy_version_ch_, 0x00, 0x03, |
2280 0x00, 0x00, 0x00, 0x08, | 2309 0x00, 0x00, 0x00, 0x08, |
2281 0x00, 0x00, 0x00, 0x01, | 2310 0x00, 0x00, 0x00, 0x01, |
2282 0x00, 0x00, 0x00, 0x01, | 2311 0x00, 0x00, 0x00, 0x01, |
2283 }; | 2312 }; |
2284 const unsigned char kV4FrameData[] = { | 2313 const unsigned char kV4FrameData[] = { |
2285 0x00, 0x07, 0x03, 0x00, | 2314 0x00, 0x00, 0x07, 0x03, |
2286 0x00, 0x00, 0x00, 0x01, | 2315 0x00, 0x00, 0x00, 0x00, |
2287 0x00, 0x00, 0x00, 0x01, | 2316 0x01, 0x00, 0x00, 0x00, |
2288 0x52, 0x53, 0x54 | 2317 0x01, 0x52, 0x53, 0x54 |
2289 }; | 2318 }; |
2290 SpdyRstStreamIR rst_stream(1, RST_STREAM_PROTOCOL_ERROR, "RST"); | 2319 SpdyRstStreamIR rst_stream(1, RST_STREAM_PROTOCOL_ERROR, "RST"); |
2291 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); | 2320 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); |
2292 if (IsSpdy4()) { | 2321 if (IsSpdy4()) { |
2293 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2322 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2294 } else { | 2323 } else { |
2295 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2324 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2296 } | 2325 } |
2297 } | 2326 } |
2298 | 2327 |
2299 { | 2328 { |
2300 const char kDescription[] = "RST_STREAM frame with max stream ID"; | 2329 const char kDescription[] = "RST_STREAM frame with max stream ID"; |
2301 const unsigned char kV3FrameData[] = { // Also applies for V2. | 2330 const unsigned char kV3FrameData[] = { // Also applies for V2. |
2302 0x80, spdy_version_ch_, 0x00, 0x03, | 2331 0x80, spdy_version_ch_, 0x00, 0x03, |
2303 0x00, 0x00, 0x00, 0x08, | 2332 0x00, 0x00, 0x00, 0x08, |
2304 0x7f, 0xff, 0xff, 0xff, | 2333 0x7f, 0xff, 0xff, 0xff, |
2305 0x00, 0x00, 0x00, 0x01, | 2334 0x00, 0x00, 0x00, 0x01, |
2306 }; | 2335 }; |
2307 const unsigned char kV4FrameData[] = { | 2336 const unsigned char kV4FrameData[] = { |
2308 0x00, 0x04, 0x03, 0x00, | 2337 0x00, 0x00, 0x04, 0x03, |
2309 0x7f, 0xff, 0xff, 0xff, | 2338 0x00, 0x7f, 0xff, 0xff, |
2310 0x00, 0x00, 0x00, 0x01, | 2339 0xff, 0x00, 0x00, 0x00, |
| 2340 0x01, |
2311 }; | 2341 }; |
2312 SpdyRstStreamIR rst_stream(0x7FFFFFFF, | 2342 SpdyRstStreamIR rst_stream(0x7FFFFFFF, |
2313 RST_STREAM_PROTOCOL_ERROR, | 2343 RST_STREAM_PROTOCOL_ERROR, |
2314 ""); | 2344 ""); |
2315 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); | 2345 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); |
2316 if (IsSpdy4()) { | 2346 if (IsSpdy4()) { |
2317 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2347 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2318 } else { | 2348 } else { |
2319 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2349 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2320 } | 2350 } |
2321 } | 2351 } |
2322 | 2352 |
2323 { | 2353 { |
2324 const char kDescription[] = "RST_STREAM frame with max status code"; | 2354 const char kDescription[] = "RST_STREAM frame with max status code"; |
2325 const unsigned char kV3FrameData[] = { // Also applies for V2. | 2355 const unsigned char kV3FrameData[] = { // Also applies for V2. |
2326 0x80, spdy_version_ch_, 0x00, 0x03, | 2356 0x80, spdy_version_ch_, 0x00, 0x03, |
2327 0x00, 0x00, 0x00, 0x08, | 2357 0x00, 0x00, 0x00, 0x08, |
2328 0x7f, 0xff, 0xff, 0xff, | 2358 0x7f, 0xff, 0xff, 0xff, |
2329 0x00, 0x00, 0x00, 0x06, | 2359 0x00, 0x00, 0x00, 0x06, |
2330 }; | 2360 }; |
2331 const unsigned char kV4FrameData[] = { | 2361 const unsigned char kV4FrameData[] = { |
2332 0x00, 0x04, 0x03, 0x00, | 2362 0x00, 0x00, 0x04, 0x03, |
2333 0x7f, 0xff, 0xff, 0xff, | 2363 0x00, 0x7f, 0xff, 0xff, |
2334 0x00, 0x00, 0x00, 0x06, | 2364 0xff, 0x00, 0x00, 0x00, |
| 2365 0x06, |
2335 }; | 2366 }; |
2336 SpdyRstStreamIR rst_stream(0x7FFFFFFF, | 2367 SpdyRstStreamIR rst_stream(0x7FFFFFFF, |
2337 RST_STREAM_INTERNAL_ERROR, | 2368 RST_STREAM_INTERNAL_ERROR, |
2338 ""); | 2369 ""); |
2339 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); | 2370 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); |
2340 if (IsSpdy4()) { | 2371 if (IsSpdy4()) { |
2341 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2372 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2342 } else { | 2373 } else { |
2343 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2374 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2344 } | 2375 } |
(...skipping 14 matching lines...) Expand all Loading... |
2359 0x0a, 0x0b, 0x0c, 0x0d, | 2390 0x0a, 0x0b, 0x0c, 0x0d, |
2360 }; | 2391 }; |
2361 const unsigned char kV3FrameData[] = { | 2392 const unsigned char kV3FrameData[] = { |
2362 0x80, spdy_version_ch_, 0x00, 0x04, | 2393 0x80, spdy_version_ch_, 0x00, 0x04, |
2363 0x00, 0x00, 0x00, 0x0c, | 2394 0x00, 0x00, 0x00, 0x0c, |
2364 0x00, 0x00, 0x00, 0x01, | 2395 0x00, 0x00, 0x00, 0x01, |
2365 0x01, 0x00, 0x00, 0x07, | 2396 0x01, 0x00, 0x00, 0x07, |
2366 0x0a, 0x0b, 0x0c, 0x0d, | 2397 0x0a, 0x0b, 0x0c, 0x0d, |
2367 }; | 2398 }; |
2368 const unsigned char kV4FrameData[] = { | 2399 const unsigned char kV4FrameData[] = { |
2369 0x00, 0x06, 0x04, 0x00, | 2400 0x00, 0x00, 0x06, 0x04, |
2370 0x00, 0x00, 0x00, 0x00, | 2401 0x00, 0x00, 0x00, 0x00, |
2371 0x00, 0x04, 0x0a, 0x0b, | 2402 0x00, 0x00, 0x04, 0x0a, |
2372 0x0c, 0x0d, | 2403 0x0b, 0x0c, 0x0d, |
2373 }; | 2404 }; |
2374 | 2405 |
2375 uint32 kValue = 0x0a0b0c0d; | 2406 uint32 kValue = 0x0a0b0c0d; |
2376 SpdySettingsIR settings_ir; | 2407 SpdySettingsIR settings_ir; |
2377 | 2408 |
2378 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01); | 2409 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01); |
2379 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE; | 2410 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE; |
2380 SettingsMap settings; | 2411 SettingsMap settings; |
2381 settings[kId] = SettingsFlagsAndValue(kFlags, kValue); | 2412 settings[kId] = SettingsFlagsAndValue(kFlags, kValue); |
2382 EXPECT_EQ(kFlags, settings[kId].first); | 2413 EXPECT_EQ(kFlags, settings[kId].first); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2422 0x00, 0x00, 0x00, 0x06, | 2453 0x00, 0x00, 0x00, 0x06, |
2423 0x00, 0x00, 0x00, 0x03, // 3rd Setting | 2454 0x00, 0x00, 0x00, 0x03, // 3rd Setting |
2424 0x00, 0x00, 0x00, 0x07, | 2455 0x00, 0x00, 0x00, 0x07, |
2425 0x00, 0x00, 0x00, 0x04, // 4th Setting | 2456 0x00, 0x00, 0x00, 0x04, // 4th Setting |
2426 0x00, 0x00, 0x00, 0x08, | 2457 0x00, 0x00, 0x00, 0x08, |
2427 }; | 2458 }; |
2428 // These end up seemingly out of order because of the way that our internal | 2459 // These end up seemingly out of order because of the way that our internal |
2429 // ordering for settings_ir works. HTTP2 has no requirement on ordering on | 2460 // ordering for settings_ir works. HTTP2 has no requirement on ordering on |
2430 // the wire. | 2461 // the wire. |
2431 const unsigned char kV4FrameData[] = { | 2462 const unsigned char kV4FrameData[] = { |
2432 0x00, 0x18, 0x04, 0x00, | 2463 0x00, 0x00, 0x18, 0x04, |
2433 0x00, 0x00, 0x00, 0x00, | 2464 0x00, 0x00, 0x00, 0x00, |
2434 0x00, 0x03, // 3rd Setting | 2465 0x00, 0x00, 0x03, // 3rd Setting |
2435 0x00, 0x00, 0x00, 0x07, | 2466 0x00, 0x00, 0x00, 0x07, |
2436 0x00, 0x04, // 4th Setting | 2467 0x00, 0x04, // 4th Setting |
2437 0x00, 0x00, 0x00, 0x08, | 2468 0x00, 0x00, 0x00, 0x08, |
2438 0x00, 0x01, // 1st Setting | 2469 0x00, 0x01, // 1st Setting |
2439 0x00, 0x00, 0x00, 0x05, | 2470 0x00, 0x00, 0x00, 0x05, |
2440 0x00, 0x02, // 2nd Setting | 2471 0x00, 0x02, // 2nd Setting |
2441 0x00, 0x00, 0x00, 0x06, | 2472 0x00, 0x00, 0x00, 0x06, |
2442 }; | 2473 }; |
2443 | 2474 |
2444 SpdySettingsIR settings_ir; | 2475 SpdySettingsIR settings_ir; |
(...skipping 26 matching lines...) Expand all Loading... |
2471 | 2502 |
2472 { | 2503 { |
2473 const char kDescription[] = "Empty SETTINGS frame"; | 2504 const char kDescription[] = "Empty SETTINGS frame"; |
2474 | 2505 |
2475 const unsigned char kV3FrameData[] = { // Also applies for V2. | 2506 const unsigned char kV3FrameData[] = { // Also applies for V2. |
2476 0x80, spdy_version_ch_, 0x00, 0x04, | 2507 0x80, spdy_version_ch_, 0x00, 0x04, |
2477 0x00, 0x00, 0x00, 0x04, | 2508 0x00, 0x00, 0x00, 0x04, |
2478 0x00, 0x00, 0x00, 0x00, | 2509 0x00, 0x00, 0x00, 0x00, |
2479 }; | 2510 }; |
2480 const unsigned char kV4FrameData[] = { | 2511 const unsigned char kV4FrameData[] = { |
2481 0x00, 0x00, 0x04, 0x00, | 2512 0x00, 0x00, 0x00, 0x04, |
2482 0x00, 0x00, 0x00, 0x00, | 2513 0x00, 0x00, 0x00, 0x00, |
| 2514 0x00, |
2483 }; | 2515 }; |
2484 SpdySettingsIR settings_ir; | 2516 SpdySettingsIR settings_ir; |
2485 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); | 2517 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); |
2486 if (IsSpdy4()) { | 2518 if (IsSpdy4()) { |
2487 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2519 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2488 } else { | 2520 } else { |
2489 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2521 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2490 } | 2522 } |
2491 } | 2523 } |
2492 } | 2524 } |
2493 | 2525 |
2494 TEST_P(SpdyFramerTest, CreatePingFrame) { | 2526 TEST_P(SpdyFramerTest, CreatePingFrame) { |
2495 SpdyFramer framer(spdy_version_); | 2527 SpdyFramer framer(spdy_version_); |
2496 | 2528 |
2497 { | 2529 { |
2498 const char kDescription[] = "PING frame"; | 2530 const char kDescription[] = "PING frame"; |
2499 const unsigned char kV3FrameData[] = { // Also applies for V2. | 2531 const unsigned char kV3FrameData[] = { // Also applies for V2. |
2500 0x80, spdy_version_ch_, 0x00, 0x06, | 2532 0x80, spdy_version_ch_, 0x00, 0x06, |
2501 0x00, 0x00, 0x00, 0x04, | 2533 0x00, 0x00, 0x00, 0x04, |
2502 0x12, 0x34, 0x56, 0x78, | 2534 0x12, 0x34, 0x56, 0x78, |
2503 }; | 2535 }; |
2504 const unsigned char kV4FrameData[] = { | 2536 const unsigned char kV4FrameData[] = { |
2505 0x00, 0x08, 0x06, 0x00, | 2537 0x00, 0x00, 0x08, 0x06, |
2506 0x00, 0x00, 0x00, 0x00, | 2538 0x00, 0x00, 0x00, 0x00, |
2507 0x12, 0x34, 0x56, 0x78, | 2539 0x00, 0x12, 0x34, 0x56, |
2508 0x9a, 0xbc, 0xde, 0xff, | 2540 0x78, 0x9a, 0xbc, 0xde, |
| 2541 0xff, |
2509 }; | 2542 }; |
2510 const unsigned char kV4FrameDataWithAck[] = { | 2543 const unsigned char kV4FrameDataWithAck[] = { |
2511 0x00, 0x08, 0x06, 0x01, | 2544 0x00, 0x00, 0x08, 0x06, |
2512 0x00, 0x00, 0x00, 0x00, | 2545 0x01, 0x00, 0x00, 0x00, |
2513 0x12, 0x34, 0x56, 0x78, | 2546 0x00, 0x12, 0x34, 0x56, |
2514 0x9a, 0xbc, 0xde, 0xff, | 2547 0x78, 0x9a, 0xbc, 0xde, |
| 2548 0xff, |
2515 }; | 2549 }; |
2516 scoped_ptr<SpdyFrame> frame; | 2550 scoped_ptr<SpdyFrame> frame; |
2517 if (IsSpdy4()) { | 2551 if (IsSpdy4()) { |
2518 const SpdyPingId kPingId = 0x123456789abcdeffULL; | 2552 const SpdyPingId kPingId = 0x123456789abcdeffULL; |
2519 SpdyPingIR ping_ir(kPingId); | 2553 SpdyPingIR ping_ir(kPingId); |
2520 // Tests SpdyPingIR when the ping is not an ack. | 2554 // Tests SpdyPingIR when the ping is not an ack. |
2521 ASSERT_FALSE(ping_ir.is_ack()); | 2555 ASSERT_FALSE(ping_ir.is_ack()); |
2522 frame.reset(framer.SerializePing(ping_ir)); | 2556 frame.reset(framer.SerializePing(ping_ir)); |
2523 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2557 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2524 | 2558 |
(...skipping 20 matching lines...) Expand all Loading... |
2545 0x00, 0x00, 0x00, 0x04, | 2579 0x00, 0x00, 0x00, 0x04, |
2546 0x00, 0x00, 0x00, 0x00, // Stream Id | 2580 0x00, 0x00, 0x00, 0x00, // Stream Id |
2547 }; | 2581 }; |
2548 const unsigned char kV3FrameData[] = { | 2582 const unsigned char kV3FrameData[] = { |
2549 0x80, spdy_version_ch_, 0x00, 0x07, | 2583 0x80, spdy_version_ch_, 0x00, 0x07, |
2550 0x00, 0x00, 0x00, 0x08, | 2584 0x00, 0x00, 0x00, 0x08, |
2551 0x00, 0x00, 0x00, 0x00, // Stream Id | 2585 0x00, 0x00, 0x00, 0x00, // Stream Id |
2552 0x00, 0x00, 0x00, 0x00, // Status | 2586 0x00, 0x00, 0x00, 0x00, // Status |
2553 }; | 2587 }; |
2554 const unsigned char kV4FrameData[] = { | 2588 const unsigned char kV4FrameData[] = { |
2555 0x00, 0x0a, 0x07, 0x00, | 2589 0x00, 0x00, 0x0a, 0x07, |
2556 0x00, 0x00, 0x00, 0x00, | 2590 0x00, 0x00, 0x00, 0x00, |
2557 0x00, 0x00, 0x00, 0x00, // Stream id | 2591 0x00, 0x00, 0x00, 0x00, // Stream id |
2558 0x00, 0x00, 0x00, 0x00, // Status | 2592 0x00, 0x00, 0x00, 0x00, // Status |
2559 0x47, 0x41, // Opaque Description | 2593 0x00, 0x47, 0x41, // Opaque Description |
2560 }; | 2594 }; |
2561 SpdyGoAwayIR goaway_ir(0, GOAWAY_OK, "GA"); | 2595 SpdyGoAwayIR goaway_ir(0, GOAWAY_OK, "GA"); |
2562 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); | 2596 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); |
2563 if (IsSpdy2()) { | 2597 if (IsSpdy2()) { |
2564 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | 2598 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); |
2565 } else if (IsSpdy3()) { | 2599 } else if (IsSpdy3()) { |
2566 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2600 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2567 } else { | 2601 } else { |
2568 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2602 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2569 } | 2603 } |
2570 } | 2604 } |
2571 | 2605 |
2572 { | 2606 { |
2573 const char kDescription[] = "GOAWAY frame with max stream ID, status"; | 2607 const char kDescription[] = "GOAWAY frame with max stream ID, status"; |
2574 const unsigned char kV2FrameData[] = { | 2608 const unsigned char kV2FrameData[] = { |
2575 0x80, spdy_version_ch_, 0x00, 0x07, | 2609 0x80, spdy_version_ch_, 0x00, 0x07, |
2576 0x00, 0x00, 0x00, 0x04, | 2610 0x00, 0x00, 0x00, 0x04, |
2577 0x7f, 0xff, 0xff, 0xff, // Stream Id | 2611 0x7f, 0xff, 0xff, 0xff, // Stream Id |
2578 }; | 2612 }; |
2579 const unsigned char kV3FrameData[] = { | 2613 const unsigned char kV3FrameData[] = { |
2580 0x80, spdy_version_ch_, 0x00, 0x07, | 2614 0x80, spdy_version_ch_, 0x00, 0x07, |
2581 0x00, 0x00, 0x00, 0x08, | 2615 0x00, 0x00, 0x00, 0x08, |
2582 0x7f, 0xff, 0xff, 0xff, // Stream Id | 2616 0x7f, 0xff, 0xff, 0xff, // Stream Id |
2583 0x00, 0x00, 0x00, 0x01, // Status: PROTOCOL_ERROR. | 2617 0x00, 0x00, 0x00, 0x01, // Status: PROTOCOL_ERROR. |
2584 }; | 2618 }; |
2585 const unsigned char kV4FrameData[] = { | 2619 const unsigned char kV4FrameData[] = { |
2586 0x00, 0x0a, 0x07, 0x00, | 2620 0x00, 0x00, 0x0a, 0x07, |
2587 0x00, 0x00, 0x00, 0x00, | 2621 0x00, 0x00, 0x00, 0x00, |
2588 0x7f, 0xff, 0xff, 0xff, // Stream Id | 2622 0x00, 0x7f, 0xff, 0xff, // Stream Id |
2589 0x00, 0x00, 0x00, 0x02, // Status: INTERNAL_ERROR. | 2623 0xff, 0x00, 0x00, 0x00, // Status: INTERNAL_ERROR. |
2590 0x47, 0x41, // Opaque Description | 2624 0x02, 0x47, 0x41, // Opaque Description |
2591 }; | 2625 }; |
2592 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA"); | 2626 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA"); |
2593 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); | 2627 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); |
2594 if (IsSpdy2()) { | 2628 if (IsSpdy2()) { |
2595 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | 2629 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); |
2596 } else if (IsSpdy3()) { | 2630 } else if (IsSpdy3()) { |
2597 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2631 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2598 } else { | 2632 } else { |
2599 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2633 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2600 } | 2634 } |
(...skipping 25 matching lines...) Expand all Loading... |
2626 0x00, 0x00, 0x00, 0x02, | 2660 0x00, 0x00, 0x00, 0x02, |
2627 0x00, 0x00, 0x00, 0x03, | 2661 0x00, 0x00, 0x00, 0x03, |
2628 'b', 'a', 'r', 0x00, | 2662 'b', 'a', 'r', 0x00, |
2629 0x00, 0x00, 0x03, 'f', | 2663 0x00, 0x00, 0x03, 'f', |
2630 'o', 'o', 0x00, 0x00, | 2664 'o', 'o', 0x00, 0x00, |
2631 0x00, 0x03, 'f', 'o', | 2665 0x00, 0x03, 'f', 'o', |
2632 'o', 0x00, 0x00, 0x00, | 2666 'o', 0x00, 0x00, 0x00, |
2633 0x03, 'b', 'a', 'r' | 2667 0x03, 'b', 'a', 'r' |
2634 }; | 2668 }; |
2635 const unsigned char kV4FrameData[] = { | 2669 const unsigned char kV4FrameData[] = { |
2636 0x00, 0x12, 0x01, 0x04, // Headers: END_HEADERS | 2670 0x00, 0x00, 0x12, 0x01, // Headers: END_HEADERS |
2637 0x00, 0x00, 0x00, 0x01, // Stream 1 | 2671 0x04, 0x00, 0x00, 0x00, // Stream 1 |
2638 0x00, 0x03, 0x62, 0x61, // @.ba | 2672 0x01, 0x00, 0x03, 0x62, // @.ba |
2639 0x72, 0x03, 0x66, 0x6f, // r.fo | 2673 0x61, 0x72, 0x03, 0x66, // r.fo |
2640 0x6f, 0x00, 0x03, 0x66, // o@.f | 2674 0x6f, 0x6f, 0x00, 0x03, // o@.f |
2641 0x6f, 0x6f, 0x03, 0x62, // oo.b | 2675 0x66, 0x6f, 0x6f, 0x03, // oo.b |
2642 0x61, 0x72, // ar | 2676 0x62, 0x61, 0x72, // ar |
2643 }; | 2677 }; |
2644 SpdyHeadersIR headers_ir(1); | 2678 SpdyHeadersIR headers_ir(1); |
2645 headers_ir.SetHeader("bar", "foo"); | 2679 headers_ir.SetHeader("bar", "foo"); |
2646 headers_ir.SetHeader("foo", "bar"); | 2680 headers_ir.SetHeader("foo", "bar"); |
2647 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 2681 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
2648 if (IsSpdy2()) { | 2682 if (IsSpdy2()) { |
2649 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | 2683 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); |
2650 } else if (IsSpdy3()) { | 2684 } else if (IsSpdy3()) { |
2651 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2685 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2652 } else { | 2686 } else { |
(...skipping 23 matching lines...) Expand all Loading... |
2676 0x00, 0x00, 0x00, 0x02, | 2710 0x00, 0x00, 0x00, 0x02, |
2677 0x00, 0x00, 0x00, 0x00, | 2711 0x00, 0x00, 0x00, 0x00, |
2678 0x00, 0x00, 0x00, 0x03, | 2712 0x00, 0x00, 0x00, 0x03, |
2679 'f', 'o', 'o', 0x00, | 2713 'f', 'o', 'o', 0x00, |
2680 0x00, 0x00, 0x03, 'f', | 2714 0x00, 0x00, 0x03, 'f', |
2681 'o', 'o', 0x00, 0x00, | 2715 'o', 'o', 0x00, 0x00, |
2682 0x00, 0x03, 'b', 'a', | 2716 0x00, 0x03, 'b', 'a', |
2683 'r' | 2717 'r' |
2684 }; | 2718 }; |
2685 const unsigned char kV4FrameData[] = { | 2719 const unsigned char kV4FrameData[] = { |
2686 0x00, 0x0f, 0x01, 0x05, // HEADER: FIN | END_HEADERS | 2720 0x00, 0x00, 0x0f, 0x01, // Headers: FIN | END_HEADERS |
2687 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff | 2721 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff |
2688 0x00, 0x00, 0x03, 0x66, // @..f | 2722 0xff, 0x00, 0x00, 0x03, // @.. |
2689 0x6f, 0x6f, 0x00, 0x03, // oo@. | 2723 0x66, 0x6f, 0x6f, 0x00, // foo@ |
2690 0x66, 0x6f, 0x6f, 0x03, // foo. | 2724 0x03, 0x66, 0x6f, 0x6f, // .foo |
2691 0x62, 0x61, 0x72, // bar | 2725 0x03, 0x62, 0x61, 0x72, // .bar |
2692 }; | 2726 }; |
2693 SpdyHeadersIR headers_ir(0x7fffffff); | 2727 SpdyHeadersIR headers_ir(0x7fffffff); |
2694 headers_ir.set_fin(true); | 2728 headers_ir.set_fin(true); |
2695 headers_ir.SetHeader("", "foo"); | 2729 headers_ir.SetHeader("", "foo"); |
2696 headers_ir.SetHeader("foo", "bar"); | 2730 headers_ir.SetHeader("foo", "bar"); |
2697 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 2731 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
2698 if (IsSpdy2()) { | 2732 if (IsSpdy2()) { |
2699 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | 2733 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); |
2700 } else if (IsSpdy3()) { | 2734 } else if (IsSpdy3()) { |
2701 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2735 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
(...skipping 24 matching lines...) Expand all Loading... |
2726 0x00, 0x00, 0x00, 0x02, | 2760 0x00, 0x00, 0x00, 0x02, |
2727 0x00, 0x00, 0x00, 0x03, | 2761 0x00, 0x00, 0x00, 0x03, |
2728 'b', 'a', 'r', 0x00, | 2762 'b', 'a', 'r', 0x00, |
2729 0x00, 0x00, 0x03, 'f', | 2763 0x00, 0x00, 0x03, 'f', |
2730 'o', 'o', 0x00, 0x00, | 2764 'o', 'o', 0x00, 0x00, |
2731 0x00, 0x03, 'f', 'o', | 2765 0x00, 0x03, 'f', 'o', |
2732 'o', 0x00, 0x00, 0x00, | 2766 'o', 0x00, 0x00, 0x00, |
2733 0x00 | 2767 0x00 |
2734 }; | 2768 }; |
2735 const unsigned char kV4FrameData[] = { | 2769 const unsigned char kV4FrameData[] = { |
2736 0x00, 0x0f, 0x01, 0x05, // HEADER: FIN | END_HEADERS | 2770 0x00, 0x00, 0x0f, 0x01, // Headers: FIN | END_HEADERS |
2737 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff | 2771 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff |
2738 0x00, 0x03, 0x62, 0x61, // @.ba | 2772 0xff, 0x00, 0x03, 0x62, // @.b |
2739 0x72, 0x03, 0x66, 0x6f, // r.fo | 2773 0x61, 0x72, 0x03, 0x66, // ar.f |
2740 0x6f, 0x00, 0x03, 0x66, // o@.f | 2774 0x6f, 0x6f, 0x00, 0x03, // oo@. |
2741 0x6f, 0x6f, 0x00, // oo. | 2775 0x66, 0x6f, 0x6f, 0x00, // foo. |
2742 }; | 2776 }; |
2743 SpdyHeadersIR headers_ir(0x7fffffff); | 2777 SpdyHeadersIR headers_ir(0x7fffffff); |
2744 headers_ir.set_fin(true); | 2778 headers_ir.set_fin(true); |
2745 headers_ir.SetHeader("bar", "foo"); | 2779 headers_ir.SetHeader("bar", "foo"); |
2746 headers_ir.SetHeader("foo", ""); | 2780 headers_ir.SetHeader("foo", ""); |
2747 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 2781 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
2748 if (IsSpdy2()) { | 2782 if (IsSpdy2()) { |
2749 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | 2783 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); |
2750 } else if (IsSpdy3()) { | 2784 } else if (IsSpdy3()) { |
2751 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2785 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2752 } else { | 2786 } else { |
2753 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2787 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2754 } | 2788 } |
2755 } | 2789 } |
2756 | 2790 |
2757 { | 2791 { |
2758 const char kDescription[] = | 2792 const char kDescription[] = |
2759 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri"; | 2793 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri"; |
2760 | 2794 |
2761 const unsigned char kV4FrameData[] = { | 2795 const unsigned char kV4FrameData[] = { |
2762 0x00, 0x14, 0x01, 0x25, // Headers: FIN | END_HEADERS | PRIORITY | 2796 0x00, 0x00, 0x14, 0x01, // Headers: FIN | END_HEADERS | PRIORITY |
2763 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff | 2797 0x25, 0x7f, 0xff, 0xff, // Stream 0x7fffffff |
2764 0x00, 0x00, 0x00, 0x00, // parent stream | 2798 0xff, 0x00, 0x00, 0x00, // parent stream |
2765 0xdb, // weight | 2799 0x00, 0xdb, // weight |
2766 0x00, 0x03, 0x62, 0x61, // @.ba | 2800 0x00, 0x03, 0x62, 0x61, // @.ba |
2767 0x72, 0x03, 0x66, 0x6f, // r.fo | 2801 0x72, 0x03, 0x66, 0x6f, // r.fo |
2768 0x6f, 0x00, 0x03, 0x66, // o@.f | 2802 0x6f, 0x00, 0x03, 0x66, // o@.f |
2769 0x6f, 0x6f, 0x00, // oo. | 2803 0x6f, 0x6f, 0x00, // oo. |
2770 }; | 2804 }; |
2771 SpdyHeadersIR headers_ir(0x7fffffff); | 2805 SpdyHeadersIR headers_ir(0x7fffffff); |
2772 headers_ir.set_fin(true); | 2806 headers_ir.set_fin(true); |
2773 headers_ir.set_priority(1); | 2807 headers_ir.set_priority(1); |
2774 headers_ir.set_has_priority(true); | 2808 headers_ir.set_has_priority(true); |
2775 headers_ir.SetHeader("bar", "foo"); | 2809 headers_ir.SetHeader("bar", "foo"); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2847 | 2881 |
2848 { | 2882 { |
2849 const char kDescription[] = "WINDOW_UPDATE frame"; | 2883 const char kDescription[] = "WINDOW_UPDATE frame"; |
2850 const unsigned char kV3FrameData[] = { // Also applies for V2. | 2884 const unsigned char kV3FrameData[] = { // Also applies for V2. |
2851 0x80, spdy_version_ch_, 0x00, 0x09, | 2885 0x80, spdy_version_ch_, 0x00, 0x09, |
2852 0x00, 0x00, 0x00, 0x08, | 2886 0x00, 0x00, 0x00, 0x08, |
2853 0x00, 0x00, 0x00, 0x01, | 2887 0x00, 0x00, 0x00, 0x01, |
2854 0x00, 0x00, 0x00, 0x01, | 2888 0x00, 0x00, 0x00, 0x01, |
2855 }; | 2889 }; |
2856 const unsigned char kV4FrameData[] = { | 2890 const unsigned char kV4FrameData[] = { |
2857 0x00, 0x04, 0x08, 0x00, | 2891 0x00, 0x00, 0x04, 0x08, |
2858 0x00, 0x00, 0x00, 0x01, | 2892 0x00, 0x00, 0x00, 0x00, |
2859 0x00, 0x00, 0x00, 0x01, | 2893 0x01, 0x00, 0x00, 0x00, |
| 2894 0x01, |
2860 }; | 2895 }; |
2861 scoped_ptr<SpdyFrame> frame( | 2896 scoped_ptr<SpdyFrame> frame( |
2862 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 1))); | 2897 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 1))); |
2863 if (IsSpdy4()) { | 2898 if (IsSpdy4()) { |
2864 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2899 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2865 } else { | 2900 } else { |
2866 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2901 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2867 } | 2902 } |
2868 } | 2903 } |
2869 | 2904 |
2870 { | 2905 { |
2871 const char kDescription[] = "WINDOW_UPDATE frame with max stream ID"; | 2906 const char kDescription[] = "WINDOW_UPDATE frame with max stream ID"; |
2872 const unsigned char kV3FrameData[] = { // Also applies for V2. | 2907 const unsigned char kV3FrameData[] = { // Also applies for V2. |
2873 0x80, spdy_version_ch_, 0x00, 0x09, | 2908 0x80, spdy_version_ch_, 0x00, 0x09, |
2874 0x00, 0x00, 0x00, 0x08, | 2909 0x00, 0x00, 0x00, 0x08, |
2875 0x7f, 0xff, 0xff, 0xff, | 2910 0x7f, 0xff, 0xff, 0xff, |
2876 0x00, 0x00, 0x00, 0x01, | 2911 0x00, 0x00, 0x00, 0x01, |
2877 }; | 2912 }; |
2878 const unsigned char kV4FrameData[] = { | 2913 const unsigned char kV4FrameData[] = { |
2879 0x00, 0x04, 0x08, 0x00, | 2914 0x00, 0x00, 0x04, 0x08, |
2880 0x7f, 0xff, 0xff, 0xff, | 2915 0x00, 0x7f, 0xff, 0xff, |
2881 0x00, 0x00, 0x00, 0x01, | 2916 0xff, 0x00, 0x00, 0x00, |
| 2917 0x01, |
2882 }; | 2918 }; |
2883 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( | 2919 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( |
2884 SpdyWindowUpdateIR(0x7FFFFFFF, 1))); | 2920 SpdyWindowUpdateIR(0x7FFFFFFF, 1))); |
2885 if (IsSpdy4()) { | 2921 if (IsSpdy4()) { |
2886 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2922 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2887 } else { | 2923 } else { |
2888 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2924 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2889 } | 2925 } |
2890 } | 2926 } |
2891 | 2927 |
2892 { | 2928 { |
2893 const char kDescription[] = "WINDOW_UPDATE frame with max window delta"; | 2929 const char kDescription[] = "WINDOW_UPDATE frame with max window delta"; |
2894 const unsigned char kV3FrameData[] = { // Also applies for V2. | 2930 const unsigned char kV3FrameData[] = { // Also applies for V2. |
2895 0x80, spdy_version_ch_, 0x00, 0x09, | 2931 0x80, spdy_version_ch_, 0x00, 0x09, |
2896 0x00, 0x00, 0x00, 0x08, | 2932 0x00, 0x00, 0x00, 0x08, |
2897 0x00, 0x00, 0x00, 0x01, | 2933 0x00, 0x00, 0x00, 0x01, |
2898 0x7f, 0xff, 0xff, 0xff, | 2934 0x7f, 0xff, 0xff, 0xff, |
2899 }; | 2935 }; |
2900 const unsigned char kV4FrameData[] = { | 2936 const unsigned char kV4FrameData[] = { |
2901 0x00, 0x04, 0x08, 0x00, | 2937 0x00, 0x00, 0x04, 0x08, |
2902 0x00, 0x00, 0x00, 0x01, | 2938 0x00, 0x00, 0x00, 0x00, |
2903 0x7f, 0xff, 0xff, 0xff, | 2939 0x01, 0x7f, 0xff, 0xff, |
| 2940 0xff, |
2904 }; | 2941 }; |
2905 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( | 2942 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( |
2906 SpdyWindowUpdateIR(1, 0x7FFFFFFF))); | 2943 SpdyWindowUpdateIR(1, 0x7FFFFFFF))); |
2907 if (IsSpdy4()) { | 2944 if (IsSpdy4()) { |
2908 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2945 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
2909 } else { | 2946 } else { |
2910 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2947 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
2911 } | 2948 } |
2912 } | 2949 } |
2913 } | 2950 } |
2914 | 2951 |
2915 TEST_P(SpdyFramerTest, SerializeBlocked) { | 2952 TEST_P(SpdyFramerTest, SerializeBlocked) { |
2916 if (spdy_version_ <= SPDY3) { | 2953 if (spdy_version_ <= SPDY3) { |
2917 return; | 2954 return; |
2918 } | 2955 } |
2919 | 2956 |
2920 SpdyFramer framer(spdy_version_); | 2957 SpdyFramer framer(spdy_version_); |
2921 | 2958 |
2922 const char kDescription[] = "BLOCKED frame"; | 2959 const char kDescription[] = "BLOCKED frame"; |
2923 const unsigned char kType = static_cast<unsigned char>( | 2960 const unsigned char kType = static_cast<unsigned char>( |
2924 SpdyConstants::SerializeFrameType(spdy_version_, BLOCKED)); | 2961 SpdyConstants::SerializeFrameType(spdy_version_, BLOCKED)); |
2925 const unsigned char kFrameData[] = { | 2962 const unsigned char kFrameData[] = { |
2926 0x00, 0x00, kType, 0x00, | 2963 0x00, 0x00, 0x00, kType, 0x00, |
2927 0x00, 0x00, 0x00, 0x00, | 2964 0x00, 0x00, 0x00, 0x00, |
2928 }; | 2965 }; |
2929 SpdyBlockedIR blocked_ir(0); | 2966 SpdyBlockedIR blocked_ir(0); |
2930 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); | 2967 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); |
2931 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); | 2968 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
2932 } | 2969 } |
2933 | 2970 |
2934 TEST_P(SpdyFramerTest, CreateBlocked) { | 2971 TEST_P(SpdyFramerTest, CreateBlocked) { |
2935 if (spdy_version_ <= SPDY3) { | 2972 if (spdy_version_ <= SPDY3) { |
2936 return; | 2973 return; |
(...skipping 16 matching lines...) Expand all Loading... |
2953 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { | 2990 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { |
2954 if (spdy_version_ <= SPDY3) { | 2991 if (spdy_version_ <= SPDY3) { |
2955 return; | 2992 return; |
2956 } | 2993 } |
2957 | 2994 |
2958 SpdyFramer framer(spdy_version_); | 2995 SpdyFramer framer(spdy_version_); |
2959 framer.set_enable_compression(false); | 2996 framer.set_enable_compression(false); |
2960 const char kDescription[] = "PUSH_PROMISE frame"; | 2997 const char kDescription[] = "PUSH_PROMISE frame"; |
2961 | 2998 |
2962 const unsigned char kFrameData[] = { | 2999 const unsigned char kFrameData[] = { |
2963 0x00, 0x16, 0x05, 0x04, // PUSH_PROMISE: END_HEADERS | 3000 0x00, 0x00, 0x16, 0x05, 0x04, // PUSH_PROMISE: END_HEADERS |
2964 0x00, 0x00, 0x00, 0x2a, // Stream 42 | 3001 0x00, 0x00, 0x00, 0x2a, // Stream 42 |
2965 0x00, 0x00, 0x00, 0x39, // Promised stream 57 | 3002 0x00, 0x00, 0x00, 0x39, // Promised stream 57 |
2966 0x00, 0x03, 0x62, 0x61, // @.ba | 3003 0x00, 0x03, 0x62, 0x61, // @.ba |
2967 0x72, 0x03, 0x66, 0x6f, // r.fo | 3004 0x72, 0x03, 0x66, 0x6f, // r.fo |
2968 0x6f, 0x00, 0x03, 0x66, // o@.f | 3005 0x6f, 0x00, 0x03, 0x66, // o@.f |
2969 0x6f, 0x6f, 0x03, 0x62, // oo.b | 3006 0x6f, 0x6f, 0x03, 0x62, // oo.b |
2970 0x61, 0x72, // ar | 3007 0x61, 0x72, // ar |
2971 }; | 3008 }; |
2972 | 3009 |
2973 SpdyPushPromiseIR push_promise(42, 57); | 3010 SpdyPushPromiseIR push_promise(42, 57); |
2974 push_promise.SetHeader("bar", "foo"); | 3011 push_promise.SetHeader("bar", "foo"); |
2975 push_promise.SetHeader("foo", "bar"); | 3012 push_promise.SetHeader("foo", "bar"); |
2976 scoped_ptr<SpdySerializedFrame> frame( | 3013 scoped_ptr<SpdySerializedFrame> frame( |
2977 framer.SerializePushPromise(push_promise)); | 3014 framer.SerializePushPromise(push_promise)); |
2978 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); | 3015 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
2979 } | 3016 } |
2980 | 3017 |
| 3018 TEST_P(SpdyFramerTest, CreateContinuationUncompressed) { |
| 3019 if (spdy_version_ <= SPDY3) { |
| 3020 return; |
| 3021 } |
| 3022 |
| 3023 SpdyFramer framer(spdy_version_); |
| 3024 framer.set_enable_compression(false); |
| 3025 const char kDescription[] = "CONTINUATION frame"; |
| 3026 |
| 3027 const unsigned char kFrameData[] = { |
| 3028 0x00, 0x00, 0x12, 0x09, 0x00, // CONTINUATION |
| 3029 0x00, 0x00, 0x00, 0x2a, // Stream 42 |
| 3030 0x00, 0x03, 0x62, 0x61, // @.ba |
| 3031 0x72, 0x03, 0x66, 0x6f, // r.fo |
| 3032 0x6f, 0x00, 0x03, 0x66, // o@.f |
| 3033 0x6f, 0x6f, 0x03, 0x62, // oo.b |
| 3034 0x61, 0x72, // ar |
| 3035 }; |
| 3036 |
| 3037 SpdyContinuationIR continuation(42); |
| 3038 continuation.SetHeader("bar", "foo"); |
| 3039 continuation.SetHeader("foo", "bar"); |
| 3040 scoped_ptr<SpdySerializedFrame> frame( |
| 3041 framer.SerializeContinuation(continuation)); |
| 3042 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
| 3043 } |
| 3044 |
2981 TEST_P(SpdyFramerTest, CreateAltSvc) { | 3045 TEST_P(SpdyFramerTest, CreateAltSvc) { |
2982 if (spdy_version_ <= SPDY3) { | 3046 if (spdy_version_ <= SPDY3) { |
2983 return; | 3047 return; |
2984 } | 3048 } |
2985 | 3049 |
2986 SpdyFramer framer(spdy_version_); | 3050 SpdyFramer framer(spdy_version_); |
2987 | 3051 |
2988 const char kDescription[] = "ALTSVC frame"; | 3052 const char kDescription[] = "ALTSVC frame"; |
2989 const unsigned char kType = static_cast<unsigned char>( | 3053 const unsigned char kType = static_cast<unsigned char>( |
2990 SpdyConstants::SerializeFrameType(spdy_version_, ALTSVC)); | 3054 SpdyConstants::SerializeFrameType(spdy_version_, ALTSVC)); |
2991 const unsigned char kFrameData[] = { | 3055 const unsigned char kFrameData[] = { |
2992 0x00, 0x17, kType, 0x00, | 3056 0x00, 0x00, 0x17, kType, 0x00, |
2993 0x00, 0x00, 0x00, 0x03, | 3057 0x00, 0x00, 0x00, 0x03, |
2994 0x00, 0x00, 0x00, 0x05, | 3058 0x00, 0x00, 0x00, 0x05, |
2995 0x01, 0xbb, 0x00, 0x04, // Port = 443 | 3059 0x01, 0xbb, 0x00, 0x04, // Port = 443 |
2996 'p', 'i', 'd', '1', // Protocol-ID | 3060 'p', 'i', 'd', '1', // Protocol-ID |
2997 0x04, 'h', 'o', 's', | 3061 0x04, 'h', 'o', 's', |
2998 't', 'o', 'r', 'i', | 3062 't', 'o', 'r', 'i', |
2999 'g', 'i', 'n', | 3063 'g', 'i', 'n', |
3000 }; | 3064 }; |
3001 SpdyAltSvcIR altsvc_ir(3); | 3065 SpdyAltSvcIR altsvc_ir(3); |
3002 altsvc_ir.set_max_age(5); | 3066 altsvc_ir.set_max_age(5); |
3003 altsvc_ir.set_port(443); | 3067 altsvc_ir.set_port(443); |
3004 altsvc_ir.set_protocol_id("pid1"); | 3068 altsvc_ir.set_protocol_id("pid1"); |
3005 altsvc_ir.set_host("host"); | 3069 altsvc_ir.set_host("host"); |
3006 altsvc_ir.set_origin("origin"); | 3070 altsvc_ir.set_origin("origin"); |
3007 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(altsvc_ir)); | 3071 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(altsvc_ir)); |
3008 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); | 3072 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
3009 } | 3073 } |
3010 | 3074 |
3011 TEST_P(SpdyFramerTest, CreatePriority) { | 3075 TEST_P(SpdyFramerTest, CreatePriority) { |
3012 if (spdy_version_ <= SPDY3) { | 3076 if (spdy_version_ <= SPDY3) { |
3013 return; | 3077 return; |
3014 } | 3078 } |
3015 | 3079 |
3016 SpdyFramer framer(spdy_version_); | 3080 SpdyFramer framer(spdy_version_); |
3017 | 3081 |
3018 const char kDescription[] = "PRIORITY frame"; | 3082 const char kDescription[] = "PRIORITY frame"; |
3019 const unsigned char kType = static_cast<unsigned char>( | 3083 const unsigned char kType = static_cast<unsigned char>( |
3020 SpdyConstants::SerializeFrameType(spdy_version_, PRIORITY)); | 3084 SpdyConstants::SerializeFrameType(spdy_version_, PRIORITY)); |
3021 const unsigned char kFrameData[] = { | 3085 const unsigned char kFrameData[] = { |
3022 0x00, 0x05, kType, 0x00, | 3086 0x00, 0x00, 0x05, kType, 0x00, |
3023 0x00, 0x00, 0x00, 0x02, // Stream ID = 2 | 3087 0x00, 0x00, 0x00, 0x02, // Stream ID = 2 |
3024 0x80, 0x00, 0x00, 0x01, // Exclusive dependency, parent stream ID = 1 | 3088 0x80, 0x00, 0x00, 0x01, // Exclusive dependency, parent stream ID = 1 |
3025 0x10, // Weight = 16 | 3089 0x10, // Weight = 16 |
3026 }; | 3090 }; |
3027 SpdyPriorityIR priority_ir(2, 1, 16, true); | 3091 SpdyPriorityIR priority_ir(2, 1, 16, true); |
3028 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(priority_ir)); | 3092 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(priority_ir)); |
3029 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); | 3093 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
3030 } | 3094 } |
3031 | 3095 |
3032 TEST_P(SpdyFramerTest, ReadCompressedSynStreamHeaderBlock) { | 3096 TEST_P(SpdyFramerTest, ReadCompressedSynStreamHeaderBlock) { |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3338 0x00, 0x00, 0x00, length, | 3402 0x00, 0x00, 0x00, length, |
3339 0x00, 0x00, 0x00, 0x00, // Stream ID | 3403 0x00, 0x00, 0x00, 0x00, // Stream ID |
3340 0x00, 0x00, 0x00, 0x00, // Status | 3404 0x00, 0x00, 0x00, 0x00, // Status |
3341 }; | 3405 }; |
3342 | 3406 |
3343 // SPDY version 4 and up GOAWAY frames are only bound to a minimal length, | 3407 // SPDY version 4 and up GOAWAY frames are only bound to a minimal length, |
3344 // since it may carry opaque data. Verify that minimal length is tested. | 3408 // since it may carry opaque data. Verify that minimal length is tested. |
3345 const unsigned char less_than_min_length = | 3409 const unsigned char less_than_min_length = |
3346 framer.GetGoAwayMinimumSize() - framer.GetControlFrameHeaderSize() - 1; | 3410 framer.GetGoAwayMinimumSize() - framer.GetControlFrameHeaderSize() - 1; |
3347 const unsigned char kV4FrameData[] = { | 3411 const unsigned char kV4FrameData[] = { |
3348 0x00, static_cast<uint8>(less_than_min_length), 0x07, 0x00, | 3412 0x00, 0x00, static_cast<uint8>(less_than_min_length), 0x07, |
3349 0x00, 0x00, 0x00, 0x00, | 3413 0x00, 0x00, 0x00, 0x00, |
3350 0x00, 0x00, 0x00, 0x00, // Stream Id | 3414 0x00, 0x00, 0x00, 0x00, // Stream Id |
3351 0x00, 0x00, 0x00, 0x00, // Status | 3415 0x00, 0x00, 0x00, 0x00, // Status |
| 3416 0x00, |
3352 }; | 3417 }; |
3353 const size_t pad_length = | 3418 const size_t pad_length = |
3354 length + framer.GetControlFrameHeaderSize() - | 3419 length + framer.GetControlFrameHeaderSize() - |
3355 (IsSpdy4() ? sizeof(kV4FrameData) : sizeof(kV3FrameData)); | 3420 (IsSpdy4() ? sizeof(kV4FrameData) : sizeof(kV3FrameData)); |
3356 string pad('A', pad_length); | 3421 string pad('A', pad_length); |
3357 TestSpdyVisitor visitor(spdy_version_); | 3422 TestSpdyVisitor visitor(spdy_version_); |
3358 | 3423 |
3359 if (IsSpdy4()) { | 3424 if (IsSpdy4()) { |
3360 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); | 3425 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); |
3361 } else { | 3426 } else { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3487 0x00, 0x00, 0x00, 0x1C, | 3552 0x00, 0x00, 0x00, 0x1C, |
3488 0x00, 0x00, 0x00, 0x03, | 3553 0x00, 0x00, 0x00, 0x03, |
3489 0x00, 0x00, 0x00, 0x01, // 1st Setting | 3554 0x00, 0x00, 0x00, 0x01, // 1st Setting |
3490 0x00, 0x00, 0x00, 0x02, | 3555 0x00, 0x00, 0x00, 0x02, |
3491 0x00, 0x00, 0x00, 0x01, // 2nd (duplicate) Setting | 3556 0x00, 0x00, 0x00, 0x01, // 2nd (duplicate) Setting |
3492 0x00, 0x00, 0x00, 0x03, | 3557 0x00, 0x00, 0x00, 0x03, |
3493 0x00, 0x00, 0x00, 0x03, // 3rd (unprocessed) Setting | 3558 0x00, 0x00, 0x00, 0x03, // 3rd (unprocessed) Setting |
3494 0x00, 0x00, 0x00, 0x03, | 3559 0x00, 0x00, 0x00, 0x03, |
3495 }; | 3560 }; |
3496 const unsigned char kV4FrameData[] = { | 3561 const unsigned char kV4FrameData[] = { |
3497 0x00, 0x12, 0x04, 0x00, | 3562 0x00, 0x00, 0x12, 0x04, |
3498 0x00, 0x00, 0x00, 0x00, | 3563 0x00, 0x00, 0x00, 0x00, |
3499 0x00, 0x01, // 1st Setting | 3564 0x00, 0x00, 0x01, // 1st Setting |
3500 0x00, 0x00, 0x00, 0x02, | 3565 0x00, 0x00, 0x00, 0x02, |
3501 0x00, 0x01, // 2nd (duplicate) Setting | 3566 0x00, 0x01, // 2nd (duplicate) Setting |
3502 0x00, 0x00, 0x00, 0x03, | 3567 0x00, 0x00, 0x00, 0x03, |
3503 0x00, 0x03, // 3rd (unprocessed) Setting | 3568 0x00, 0x03, // 3rd (unprocessed) Setting |
3504 0x00, 0x00, 0x00, 0x03, | 3569 0x00, 0x00, 0x00, 0x03, |
3505 }; | 3570 }; |
3506 | 3571 |
3507 TestSpdyVisitor visitor(spdy_version_); | 3572 TestSpdyVisitor visitor(spdy_version_); |
3508 visitor.use_compression_ = false; | 3573 visitor.use_compression_ = false; |
3509 if (IsSpdy2()) { | 3574 if (IsSpdy2()) { |
3510 visitor.SimulateInFramer(kV2FrameData, sizeof(kV2FrameData)); | 3575 visitor.SimulateInFramer(kV2FrameData, sizeof(kV2FrameData)); |
3511 } else if (IsSpdy3()) { | 3576 } else if (IsSpdy3()) { |
3512 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); | 3577 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); |
3513 } else { | 3578 } else { |
3514 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); | 3579 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); |
3515 } | 3580 } |
3516 | 3581 |
3517 if (!IsSpdy4()) { | 3582 if (!IsSpdy4()) { |
3518 EXPECT_EQ(1, visitor.setting_count_); | 3583 EXPECT_EQ(1, visitor.setting_count_); |
3519 EXPECT_EQ(1, visitor.error_count_); | 3584 EXPECT_EQ(1, visitor.error_count_); |
3520 } else { | 3585 } else { |
3521 // In SPDY 4+, duplicate settings are allowed; | 3586 // In SPDY 4+, duplicate settings are allowed; |
3522 // each setting replaces the previous value for that setting. | 3587 // each setting replaces the previous value for that setting. |
3523 EXPECT_EQ(3, visitor.setting_count_); | 3588 EXPECT_EQ(3, visitor.setting_count_); |
3524 EXPECT_EQ(0, visitor.error_count_); | 3589 EXPECT_EQ(0, visitor.error_count_); |
3525 EXPECT_EQ(1, visitor.settings_ack_sent_); | 3590 EXPECT_EQ(1, visitor.settings_ack_sent_); |
3526 } | 3591 } |
3527 } | 3592 } |
3528 | 3593 |
| 3594 // Tests handling of SETTINGS frame with a setting we don't recognize. |
| 3595 TEST_P(SpdyFramerTest, ReadUnknownSettingsId) { |
| 3596 SpdyFramer framer(spdy_version_); |
| 3597 |
| 3598 const unsigned char kV2FrameData[] = { |
| 3599 0x80, spdy_version_ch_, 0x00, 0x04, |
| 3600 0x00, 0x00, 0x00, 0x1C, |
| 3601 0x00, 0x00, 0x00, 0x01, |
| 3602 0x10, 0x00, 0x00, 0x00, // 1st Setting |
| 3603 0x00, 0x00, 0x00, 0x02, |
| 3604 }; |
| 3605 const unsigned char kV3FrameData[] = { |
| 3606 0x80, spdy_version_ch_, 0x00, 0x04, |
| 3607 0x00, 0x00, 0x00, 0x1C, |
| 3608 0x00, 0x00, 0x00, 0x01, |
| 3609 0x00, 0x00, 0x00, 0x10, // 1st Setting |
| 3610 0x00, 0x00, 0x00, 0x02, |
| 3611 }; |
| 3612 const unsigned char kV4FrameData[] = { |
| 3613 0x00, 0x00, 0x06, 0x04, |
| 3614 0x00, 0x00, 0x00, 0x00, |
| 3615 0x00, 0x00, 0x10, // 1st Setting |
| 3616 0x00, 0x00, 0x00, 0x02, |
| 3617 }; |
| 3618 |
| 3619 TestSpdyVisitor visitor(spdy_version_); |
| 3620 visitor.use_compression_ = false; |
| 3621 if (IsSpdy2()) { |
| 3622 visitor.SimulateInFramer(kV2FrameData, sizeof(kV2FrameData)); |
| 3623 } else if (IsSpdy3()) { |
| 3624 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); |
| 3625 } else { |
| 3626 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); |
| 3627 } |
| 3628 |
| 3629 if (!IsSpdy4()) { |
| 3630 EXPECT_EQ(0, visitor.setting_count_); |
| 3631 EXPECT_EQ(1, visitor.error_count_); |
| 3632 } else { |
| 3633 // In SPDY 4+, we ignore unknown settings because of extensions. |
| 3634 EXPECT_EQ(0, visitor.setting_count_); |
| 3635 EXPECT_EQ(0, visitor.error_count_); |
| 3636 } |
| 3637 } |
| 3638 |
3529 // Tests handling of SETTINGS frame with entries out of order. | 3639 // Tests handling of SETTINGS frame with entries out of order. |
3530 TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) { | 3640 TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) { |
3531 SpdyFramer framer(spdy_version_); | 3641 SpdyFramer framer(spdy_version_); |
3532 | 3642 |
3533 const unsigned char kV2FrameData[] = { | 3643 const unsigned char kV2FrameData[] = { |
3534 0x80, spdy_version_ch_, 0x00, 0x04, | 3644 0x80, spdy_version_ch_, 0x00, 0x04, |
3535 0x00, 0x00, 0x00, 0x1C, | 3645 0x00, 0x00, 0x00, 0x1C, |
3536 0x00, 0x00, 0x00, 0x03, | 3646 0x00, 0x00, 0x00, 0x03, |
3537 0x02, 0x00, 0x00, 0x00, // 1st Setting | 3647 0x02, 0x00, 0x00, 0x00, // 1st Setting |
3538 0x00, 0x00, 0x00, 0x02, | 3648 0x00, 0x00, 0x00, 0x02, |
3539 0x01, 0x00, 0x00, 0x00, // 2nd (out of order) Setting | 3649 0x01, 0x00, 0x00, 0x00, // 2nd (out of order) Setting |
3540 0x00, 0x00, 0x00, 0x03, | 3650 0x00, 0x00, 0x00, 0x03, |
3541 0x03, 0x00, 0x00, 0x00, // 3rd (unprocessed) Setting | 3651 0x03, 0x00, 0x00, 0x00, // 3rd (unprocessed) Setting |
3542 0x00, 0x00, 0x00, 0x03, | 3652 0x00, 0x00, 0x00, 0x03, |
3543 }; | 3653 }; |
3544 const unsigned char kV3FrameData[] = { | 3654 const unsigned char kV3FrameData[] = { |
3545 0x80, spdy_version_ch_, 0x00, 0x04, | 3655 0x80, spdy_version_ch_, 0x00, 0x04, |
3546 0x00, 0x00, 0x00, 0x1C, | 3656 0x00, 0x00, 0x00, 0x1C, |
3547 0x00, 0x00, 0x00, 0x03, | 3657 0x00, 0x00, 0x00, 0x03, |
3548 0x00, 0x00, 0x00, 0x02, // 1st Setting | 3658 0x00, 0x00, 0x00, 0x02, // 1st Setting |
3549 0x00, 0x00, 0x00, 0x02, | 3659 0x00, 0x00, 0x00, 0x02, |
3550 0x00, 0x00, 0x00, 0x01, // 2nd (out of order) Setting | 3660 0x00, 0x00, 0x00, 0x01, // 2nd (out of order) Setting |
3551 0x00, 0x00, 0x00, 0x03, | 3661 0x00, 0x00, 0x00, 0x03, |
3552 0x00, 0x00, 0x01, 0x03, // 3rd (unprocessed) Setting | 3662 0x00, 0x00, 0x01, 0x03, // 3rd (unprocessed) Setting |
3553 0x00, 0x00, 0x00, 0x03, | 3663 0x00, 0x00, 0x00, 0x03, |
3554 }; | 3664 }; |
3555 const unsigned char kV4FrameData[] = { | 3665 const unsigned char kV4FrameData[] = { |
3556 0x00, 0x12, 0x04, 0x00, | 3666 0x00, 0x00, 0x12, 0x04, |
3557 0x00, 0x00, 0x00, 0x00, | 3667 0x00, 0x00, 0x00, 0x00, |
3558 0x00, 0x02, // 1st Setting | 3668 0x00, 0x00, 0x02, // 1st Setting |
3559 0x00, 0x00, 0x00, 0x02, | 3669 0x00, 0x00, 0x00, 0x02, |
3560 0x00, 0x01, // 2nd (out of order) Setting | 3670 0x00, 0x01, // 2nd (out of order) Setting |
3561 0x00, 0x00, 0x00, 0x03, | 3671 0x00, 0x00, 0x00, 0x03, |
3562 0x00, 0x03, // 3rd (unprocessed) Setting | 3672 0x00, 0x03, // 3rd (unprocessed) Setting |
3563 0x00, 0x00, 0x00, 0x03, | 3673 0x00, 0x00, 0x00, 0x03, |
3564 }; | 3674 }; |
3565 | 3675 |
3566 TestSpdyVisitor visitor(spdy_version_); | 3676 TestSpdyVisitor visitor(spdy_version_); |
3567 visitor.use_compression_ = false; | 3677 visitor.use_compression_ = false; |
3568 if (IsSpdy2()) { | 3678 if (IsSpdy2()) { |
3569 visitor.SimulateInFramer(kV2FrameData, sizeof(kV2FrameData)); | 3679 visitor.SimulateInFramer(kV2FrameData, sizeof(kV2FrameData)); |
3570 } else if (IsSpdy3()) { | 3680 } else if (IsSpdy3()) { |
3571 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); | 3681 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); |
3572 } else { | 3682 } else { |
3573 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); | 3683 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); |
3574 } | 3684 } |
3575 | 3685 |
3576 if (!IsSpdy4()) { | 3686 if (!IsSpdy4()) { |
3577 EXPECT_EQ(1, visitor.setting_count_); | 3687 EXPECT_EQ(1, visitor.setting_count_); |
3578 EXPECT_EQ(1, visitor.error_count_); | 3688 EXPECT_EQ(1, visitor.error_count_); |
3579 } else { | 3689 } else { |
3580 // In SPDY 4+, settings are allowed in any order. | 3690 // In SPDY 4+, settings are allowed in any order. |
3581 EXPECT_EQ(3, visitor.setting_count_); | 3691 EXPECT_EQ(3, visitor.setting_count_); |
3582 EXPECT_EQ(0, visitor.error_count_); | 3692 EXPECT_EQ(0, visitor.error_count_); |
3583 // EXPECT_EQ(1, visitor.settings_ack_count_); | |
3584 } | 3693 } |
3585 } | 3694 } |
3586 | 3695 |
3587 TEST_P(SpdyFramerTest, ProcessSettingsAckFrame) { | 3696 TEST_P(SpdyFramerTest, ProcessSettingsAckFrame) { |
3588 if (spdy_version_ <= SPDY3) { | 3697 if (spdy_version_ <= SPDY3) { |
3589 return; | 3698 return; |
3590 } | 3699 } |
3591 SpdyFramer framer(spdy_version_); | 3700 SpdyFramer framer(spdy_version_); |
3592 | 3701 |
3593 const unsigned char kFrameData[] = { | 3702 const unsigned char kFrameData[] = { |
3594 0x00, 0x00, 0x04, 0x01, | 3703 0x00, 0x00, 0x00, 0x04, 0x01, |
3595 0x00, 0x00, 0x00, 0x00, | 3704 0x00, 0x00, 0x00, 0x00, |
3596 }; | 3705 }; |
3597 | 3706 |
3598 TestSpdyVisitor visitor(spdy_version_); | 3707 TestSpdyVisitor visitor(spdy_version_); |
3599 visitor.use_compression_ = false; | 3708 visitor.use_compression_ = false; |
3600 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); | 3709 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); |
3601 | 3710 |
3602 EXPECT_EQ(0, visitor.error_count_); | 3711 EXPECT_EQ(0, visitor.error_count_); |
3603 EXPECT_EQ(0, visitor.setting_count_); | 3712 EXPECT_EQ(0, visitor.setting_count_); |
3604 EXPECT_EQ(1, visitor.settings_ack_received_); | 3713 EXPECT_EQ(1, visitor.settings_ack_received_); |
(...skipping 15 matching lines...) Expand all Loading... |
3620 data_ir.set_padding_len(kPaddingLen); | 3729 data_ir.set_padding_len(kPaddingLen); |
3621 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 3730 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
3622 ASSERT_TRUE(frame.get() != NULL); | 3731 ASSERT_TRUE(frame.get() != NULL); |
3623 | 3732 |
3624 int bytes_consumed = 0; | 3733 int bytes_consumed = 0; |
3625 | 3734 |
3626 // Send the frame header. | 3735 // Send the frame header. |
3627 EXPECT_CALL(visitor, OnDataFrameHeader(1, | 3736 EXPECT_CALL(visitor, OnDataFrameHeader(1, |
3628 kPaddingLen + strlen(data_payload), | 3737 kPaddingLen + strlen(data_payload), |
3629 false)); | 3738 false)); |
3630 CHECK_EQ(8u, framer.ProcessInput(frame->data(), 8)); | 3739 CHECK_EQ(framer.GetDataFrameMinimumSize(), |
| 3740 framer.ProcessInput(frame->data(), |
| 3741 framer.GetDataFrameMinimumSize())); |
3631 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_PADDING_LENGTH); | 3742 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_PADDING_LENGTH); |
3632 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); | 3743 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
3633 bytes_consumed += 8; | 3744 bytes_consumed += framer.GetDataFrameMinimumSize(); |
3634 | 3745 |
3635 // Send the padding length field. | 3746 // Send the padding length field. |
3636 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1)); | 3747 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1)); |
3637 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); | 3748 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME); |
3638 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); | 3749 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR); |
3639 bytes_consumed += 1; | 3750 bytes_consumed += 1; |
3640 | 3751 |
3641 // Send the first two bytes of the data payload, i.e., "he". | 3752 // Send the first two bytes of the data payload, i.e., "he". |
3642 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2, false)); | 3753 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2, false)); |
3643 CHECK_EQ(2u, framer.ProcessInput(frame->data() + bytes_consumed, 2)); | 3754 CHECK_EQ(2u, framer.ProcessInput(frame->data() + bytes_consumed, 2)); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3737 multiple_frame_data.append(string(control_frame->data(), | 3848 multiple_frame_data.append(string(control_frame->data(), |
3738 control_frame->size())); | 3849 control_frame->size())); |
3739 visitor.SimulateInFramer( | 3850 visitor.SimulateInFramer( |
3740 reinterpret_cast<unsigned const char*>(multiple_frame_data.data()), | 3851 reinterpret_cast<unsigned const char*>(multiple_frame_data.data()), |
3741 multiple_frame_data.length()); | 3852 multiple_frame_data.length()); |
3742 EXPECT_EQ(0, visitor.error_count_); | 3853 EXPECT_EQ(0, visitor.error_count_); |
3743 EXPECT_EQ(1u, visitor.last_window_update_stream_); | 3854 EXPECT_EQ(1u, visitor.last_window_update_stream_); |
3744 EXPECT_EQ(2u, visitor.last_window_update_delta_); | 3855 EXPECT_EQ(2u, visitor.last_window_update_delta_); |
3745 } | 3856 } |
3746 | 3857 |
3747 TEST_P(SpdyFramerTest, CreateContinuationUncompressed) { | |
3748 if (spdy_version_ <= SPDY3) { | |
3749 return; | |
3750 } | |
3751 | |
3752 SpdyFramer framer(spdy_version_); | |
3753 framer.set_enable_compression(false); | |
3754 const char kDescription[] = "CONTINUATION frame"; | |
3755 | |
3756 const unsigned char kFrameData[] = { | |
3757 0x00, 0x12, 0x09, 0x00, // CONTINUATION | |
3758 0x00, 0x00, 0x00, 0x2a, // Stream 42 | |
3759 0x00, 0x03, 0x62, 0x61, // @.ba | |
3760 0x72, 0x03, 0x66, 0x6f, // r.fo | |
3761 0x6f, 0x00, 0x03, 0x66, // o@.f | |
3762 0x6f, 0x6f, 0x03, 0x62, // oo.b | |
3763 0x61, 0x72, // ar | |
3764 }; | |
3765 | |
3766 SpdyContinuationIR continuation(42); | |
3767 continuation.SetHeader("bar", "foo"); | |
3768 continuation.SetHeader("foo", "bar"); | |
3769 scoped_ptr<SpdySerializedFrame> frame( | |
3770 framer.SerializeContinuation(continuation)); | |
3771 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); | |
3772 } | |
3773 | |
3774 TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { | 3858 TEST_P(SpdyFramerTest, ReadCompressedPushPromise) { |
3775 if (spdy_version_ <= SPDY3) { | 3859 if (spdy_version_ <= SPDY3) { |
3776 return; | 3860 return; |
3777 } | 3861 } |
3778 | 3862 |
3779 SpdyFramer framer(spdy_version_); | 3863 SpdyFramer framer(spdy_version_); |
3780 SpdyPushPromiseIR push_promise(42, 57); | 3864 SpdyPushPromiseIR push_promise(42, 57); |
3781 push_promise.SetHeader("foo", "bar"); | 3865 push_promise.SetHeader("foo", "bar"); |
3782 push_promise.SetHeader("bar", "foofoo"); | 3866 push_promise.SetHeader("bar", "foofoo"); |
3783 SpdyHeaderBlock headers = push_promise.name_value_block(); | 3867 SpdyHeaderBlock headers = push_promise.name_value_block(); |
3784 scoped_ptr<SpdySerializedFrame> frame( | 3868 scoped_ptr<SpdySerializedFrame> frame( |
3785 framer.SerializePushPromise(push_promise)); | 3869 framer.SerializePushPromise(push_promise)); |
3786 EXPECT_TRUE(frame.get() != NULL); | 3870 EXPECT_TRUE(frame.get() != NULL); |
3787 TestSpdyVisitor visitor(spdy_version_); | 3871 TestSpdyVisitor visitor(spdy_version_); |
3788 visitor.use_compression_ = true; | 3872 visitor.use_compression_ = true; |
3789 visitor.SimulateInFramer( | 3873 visitor.SimulateInFramer( |
3790 reinterpret_cast<unsigned char*>(frame->data()), | 3874 reinterpret_cast<unsigned char*>(frame->data()), |
3791 frame->size()); | 3875 frame->size()); |
3792 EXPECT_EQ(42u, visitor.last_push_promise_stream_); | 3876 EXPECT_EQ(42u, visitor.last_push_promise_stream_); |
3793 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_); | 3877 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_); |
3794 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); | 3878 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
3795 } | 3879 } |
3796 | 3880 |
3797 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { | 3881 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { |
3798 if (spdy_version_ <= SPDY3) { | 3882 if (spdy_version_ <= SPDY3) { |
3799 return; | 3883 return; |
3800 } | 3884 } |
3801 | 3885 |
3802 const unsigned char kInput[] = { | 3886 const unsigned char kInput[] = { |
3803 0x00, 0x14, 0x01, 0x08, // HEADERS: PADDED | 3887 0x00, 0x00, 0x14, 0x01, 0x08, // HEADERS: PADDED |
3804 0x00, 0x00, 0x00, 0x01, // Stream 1 | 3888 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3805 0x03, // Padding of 3. | 3889 0x03, // Padding of 3. |
3806 0x00, 0x06, 0x63, 0x6f, | 3890 0x00, 0x06, 0x63, 0x6f, |
3807 0x6f, 0x6b, 0x69, 0x65, | 3891 0x6f, 0x6b, 0x69, 0x65, |
3808 0x07, 0x66, 0x6f, 0x6f, | 3892 0x07, 0x66, 0x6f, 0x6f, |
3809 0x3d, 0x62, 0x61, 0x72, | 3893 0x3d, 0x62, 0x61, 0x72, |
3810 0x00, 0x00, 0x00, | 3894 0x00, 0x00, 0x00, |
3811 | 3895 |
3812 0x00, 0x14, 0x09, 0x00, // CONTINUATION | 3896 0x00, 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
3813 0x00, 0x00, 0x00, 0x01, // Stream 1 | 3897 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3814 0x00, 0x06, 0x63, 0x6f, | 3898 0x00, 0x06, 0x63, 0x6f, |
3815 0x6f, 0x6b, 0x69, 0x65, | 3899 0x6f, 0x6b, 0x69, 0x65, |
3816 0x08, 0x62, 0x61, 0x7a, | 3900 0x08, 0x62, 0x61, 0x7a, |
3817 0x3d, 0x62, 0x69, 0x6e, | 3901 0x3d, 0x62, 0x69, 0x6e, |
3818 0x67, 0x00, 0x06, 0x63, | 3902 0x67, 0x00, 0x06, 0x63, |
3819 | 3903 |
3820 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS | 3904 0x00, 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
3821 0x00, 0x00, 0x00, 0x01, // Stream 1 | 3905 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3822 0x6f, 0x6f, 0x6b, 0x69, | 3906 0x6f, 0x6f, 0x6b, 0x69, |
3823 0x65, 0x00, 0x00, 0x04, | 3907 0x65, 0x00, 0x00, 0x04, |
3824 0x6e, 0x61, 0x6d, 0x65, | 3908 0x6e, 0x61, 0x6d, 0x65, |
3825 0x05, 0x76, 0x61, 0x6c, | 3909 0x05, 0x76, 0x61, 0x6c, |
3826 0x75, 0x65, | 3910 0x75, 0x65, |
3827 }; | 3911 }; |
3828 | 3912 |
3829 TestSpdyVisitor visitor(spdy_version_); | 3913 TestSpdyVisitor visitor(spdy_version_); |
3830 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 3914 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
3831 | 3915 |
3832 EXPECT_EQ(0, visitor.error_count_); | 3916 EXPECT_EQ(0, visitor.error_count_); |
3833 EXPECT_EQ(1, visitor.headers_frame_count_); | 3917 EXPECT_EQ(1, visitor.headers_frame_count_); |
3834 EXPECT_EQ(2, visitor.continuation_count_); | 3918 EXPECT_EQ(2, visitor.continuation_count_); |
3835 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); | 3919 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
3836 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); | 3920 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); |
3837 | 3921 |
3838 EXPECT_THAT(visitor.headers_, ElementsAre( | 3922 EXPECT_THAT(visitor.headers_, ElementsAre( |
3839 Pair("cookie", "foo=bar; baz=bing; "), | 3923 Pair("cookie", "foo=bar; baz=bing; "), |
3840 Pair("name", "value"))); | 3924 Pair("name", "value"))); |
3841 } | 3925 } |
3842 | 3926 |
3843 TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndFin) { | 3927 TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndFin) { |
3844 if (spdy_version_ <= SPDY3) { | 3928 if (spdy_version_ <= SPDY3) { |
3845 return; | 3929 return; |
3846 } | 3930 } |
3847 | 3931 |
3848 const unsigned char kInput[] = { | 3932 const unsigned char kInput[] = { |
3849 0x00, 0x10, 0x01, 0x01, // HEADERS: FIN | 3933 0x00, 0x00, 0x10, 0x01, 0x01, // HEADERS: FIN |
3850 0x00, 0x00, 0x00, 0x01, // Stream 1 | 3934 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3851 0x00, 0x06, 0x63, 0x6f, | 3935 0x00, 0x06, 0x63, 0x6f, |
3852 0x6f, 0x6b, 0x69, 0x65, | 3936 0x6f, 0x6b, 0x69, 0x65, |
3853 0x07, 0x66, 0x6f, 0x6f, | 3937 0x07, 0x66, 0x6f, 0x6f, |
3854 0x3d, 0x62, 0x61, 0x72, | 3938 0x3d, 0x62, 0x61, 0x72, |
3855 | 3939 |
3856 0x00, 0x14, 0x09, 0x00, // CONTINUATION | 3940 0x00, 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
3857 0x00, 0x00, 0x00, 0x01, // Stream 1 | 3941 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3858 0x00, 0x06, 0x63, 0x6f, | 3942 0x00, 0x06, 0x63, 0x6f, |
3859 0x6f, 0x6b, 0x69, 0x65, | 3943 0x6f, 0x6b, 0x69, 0x65, |
3860 0x08, 0x62, 0x61, 0x7a, | 3944 0x08, 0x62, 0x61, 0x7a, |
3861 0x3d, 0x62, 0x69, 0x6e, | 3945 0x3d, 0x62, 0x69, 0x6e, |
3862 0x67, 0x00, 0x06, 0x63, | 3946 0x67, 0x00, 0x06, 0x63, |
3863 | 3947 |
3864 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS | 3948 0x00, 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
3865 0x00, 0x00, 0x00, 0x01, // Stream 1 | 3949 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3866 0x6f, 0x6f, 0x6b, 0x69, | 3950 0x6f, 0x6f, 0x6b, 0x69, |
3867 0x65, 0x00, 0x00, 0x04, | 3951 0x65, 0x00, 0x00, 0x04, |
3868 0x6e, 0x61, 0x6d, 0x65, | 3952 0x6e, 0x61, 0x6d, 0x65, |
3869 0x05, 0x76, 0x61, 0x6c, | 3953 0x05, 0x76, 0x61, 0x6c, |
3870 0x75, 0x65, | 3954 0x75, 0x65, |
3871 }; | 3955 }; |
3872 | 3956 |
3873 SpdyFramer framer(spdy_version_); | 3957 SpdyFramer framer(spdy_version_); |
3874 TestSpdyVisitor visitor(spdy_version_); | 3958 TestSpdyVisitor visitor(spdy_version_); |
(...skipping 10 matching lines...) Expand all Loading... |
3885 Pair("cookie", "foo=bar; baz=bing; "), | 3969 Pair("cookie", "foo=bar; baz=bing; "), |
3886 Pair("name", "value"))); | 3970 Pair("name", "value"))); |
3887 } | 3971 } |
3888 | 3972 |
3889 TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { | 3973 TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { |
3890 if (spdy_version_ <= SPDY3) { | 3974 if (spdy_version_ <= SPDY3) { |
3891 return; | 3975 return; |
3892 } | 3976 } |
3893 | 3977 |
3894 const unsigned char kInput[] = { | 3978 const unsigned char kInput[] = { |
3895 0x00, 0x17, 0x05, 0x08, // PUSH_PROMISE: PADDED | 3979 0x00, 0x00, 0x17, 0x05, 0x08, // PUSH_PROMISE: PADDED |
3896 0x00, 0x00, 0x00, 0x01, // Stream 1 | 3980 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3897 0x00, 0x00, 0x00, 0x2A, // Promised stream 42 | 3981 0x00, 0x00, 0x00, 0x2A, // Promised stream 42 |
3898 0x02, // Padding of 2. | 3982 0x02, // Padding of 2. |
3899 0x00, 0x06, 0x63, 0x6f, | 3983 0x00, 0x06, 0x63, 0x6f, |
3900 0x6f, 0x6b, 0x69, 0x65, | 3984 0x6f, 0x6b, 0x69, 0x65, |
3901 0x07, 0x66, 0x6f, 0x6f, | 3985 0x07, 0x66, 0x6f, 0x6f, |
3902 0x3d, 0x62, 0x61, 0x72, | 3986 0x3d, 0x62, 0x61, 0x72, |
3903 0x00, 0x00, | 3987 0x00, 0x00, |
3904 | 3988 |
3905 0x00, 0x14, 0x09, 0x00, // CONTINUATION | 3989 0x00, 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
3906 0x00, 0x00, 0x00, 0x01, // Stream 1 | 3990 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3907 0x00, 0x06, 0x63, 0x6f, | 3991 0x00, 0x06, 0x63, 0x6f, |
3908 0x6f, 0x6b, 0x69, 0x65, | 3992 0x6f, 0x6b, 0x69, 0x65, |
3909 0x08, 0x62, 0x61, 0x7a, | 3993 0x08, 0x62, 0x61, 0x7a, |
3910 0x3d, 0x62, 0x69, 0x6e, | 3994 0x3d, 0x62, 0x69, 0x6e, |
3911 0x67, 0x00, 0x06, 0x63, | 3995 0x67, 0x00, 0x06, 0x63, |
3912 | 3996 |
3913 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS | 3997 0x00, 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS |
3914 0x00, 0x00, 0x00, 0x01, // Stream 1 | 3998 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3915 0x6f, 0x6f, 0x6b, 0x69, | 3999 0x6f, 0x6f, 0x6b, 0x69, |
3916 0x65, 0x00, 0x00, 0x04, | 4000 0x65, 0x00, 0x00, 0x04, |
3917 0x6e, 0x61, 0x6d, 0x65, | 4001 0x6e, 0x61, 0x6d, 0x65, |
3918 0x05, 0x76, 0x61, 0x6c, | 4002 0x05, 0x76, 0x61, 0x6c, |
3919 0x75, 0x65, | 4003 0x75, 0x65, |
3920 }; | 4004 }; |
3921 | 4005 |
3922 SpdyFramer framer(spdy_version_); | 4006 SpdyFramer framer(spdy_version_); |
3923 TestSpdyVisitor visitor(spdy_version_); | 4007 TestSpdyVisitor visitor(spdy_version_); |
(...skipping 10 matching lines...) Expand all Loading... |
3934 Pair("cookie", "foo=bar; baz=bing; "), | 4018 Pair("cookie", "foo=bar; baz=bing; "), |
3935 Pair("name", "value"))); | 4019 Pair("name", "value"))); |
3936 } | 4020 } |
3937 | 4021 |
3938 TEST_P(SpdyFramerTest, ReadContinuationWithWrongStreamId) { | 4022 TEST_P(SpdyFramerTest, ReadContinuationWithWrongStreamId) { |
3939 if (spdy_version_ <= SPDY3) { | 4023 if (spdy_version_ <= SPDY3) { |
3940 return; | 4024 return; |
3941 } | 4025 } |
3942 | 4026 |
3943 const unsigned char kInput[] = { | 4027 const unsigned char kInput[] = { |
3944 0x00, 0x10, 0x01, 0x00, // HEADERS | 4028 0x00, 0x00, 0x10, 0x01, 0x00, // HEADERS |
3945 0x00, 0x00, 0x00, 0x01, // Stream 1 | 4029 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3946 0x00, 0x06, 0x63, 0x6f, | 4030 0x00, 0x06, 0x63, 0x6f, |
3947 0x6f, 0x6b, 0x69, 0x65, | 4031 0x6f, 0x6b, 0x69, 0x65, |
3948 0x07, 0x66, 0x6f, 0x6f, | 4032 0x07, 0x66, 0x6f, 0x6f, |
3949 0x3d, 0x62, 0x61, 0x72, | 4033 0x3d, 0x62, 0x61, 0x72, |
3950 | 4034 |
3951 0x00, 0x14, 0x09, 0x00, // CONTINUATION | 4035 0x00, 0x00, 0x14, 0x09, 0x00, // CONTINUATION |
3952 0x00, 0x00, 0x00, 0x02, // Stream 2 | 4036 0x00, 0x00, 0x00, 0x02, // Stream 2 |
3953 0x00, 0x06, 0x63, 0x6f, | 4037 0x00, 0x06, 0x63, 0x6f, |
3954 0x6f, 0x6b, 0x69, 0x65, | 4038 0x6f, 0x6b, 0x69, 0x65, |
3955 0x08, 0x62, 0x61, 0x7a, | 4039 0x08, 0x62, 0x61, 0x7a, |
3956 0x3d, 0x62, 0x69, 0x6e, | 4040 0x3d, 0x62, 0x69, 0x6e, |
3957 0x67, 0x00, 0x06, 0x63, | 4041 0x67, 0x00, 0x06, 0x63, |
3958 }; | 4042 }; |
3959 | 4043 |
3960 SpdyFramer framer(spdy_version_); | 4044 SpdyFramer framer(spdy_version_); |
3961 TestSpdyVisitor visitor(spdy_version_); | 4045 TestSpdyVisitor visitor(spdy_version_); |
3962 framer.set_visitor(&visitor); | 4046 framer.set_visitor(&visitor); |
3963 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 4047 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
3964 | 4048 |
3965 EXPECT_EQ(1, visitor.error_count_); | 4049 EXPECT_EQ(1, visitor.error_count_); |
3966 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | 4050 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
3967 visitor.framer_.error_code()) | 4051 visitor.framer_.error_code()) |
3968 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4052 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
3969 EXPECT_EQ(1, visitor.headers_frame_count_); | 4053 EXPECT_EQ(1, visitor.headers_frame_count_); |
3970 EXPECT_EQ(0, visitor.continuation_count_); | 4054 EXPECT_EQ(0, visitor.continuation_count_); |
3971 EXPECT_EQ(0u, visitor.header_buffer_length_); | 4055 EXPECT_EQ(0u, visitor.header_buffer_length_); |
3972 } | 4056 } |
3973 | 4057 |
3974 TEST_P(SpdyFramerTest, ReadContinuationOutOfOrder) { | 4058 TEST_P(SpdyFramerTest, ReadContinuationOutOfOrder) { |
3975 if (spdy_version_ <= SPDY3) { | 4059 if (spdy_version_ <= SPDY3) { |
3976 return; | 4060 return; |
3977 } | 4061 } |
3978 | 4062 |
3979 const unsigned char kInput[] = { | 4063 const unsigned char kInput[] = { |
3980 0x00, 0x10, 0x09, 0x00, // CONTINUATION | 4064 0x00, 0x00, 0x18, 0x09, 0x00, // CONTINUATION |
3981 0x00, 0x00, 0x00, 0x01, // Stream 1 | 4065 0x00, 0x00, 0x00, 0x01, // Stream 1 |
3982 0x00, 0x06, 0x63, 0x6f, | 4066 0x00, 0x06, 0x63, 0x6f, |
3983 0x6f, 0x6b, 0x69, 0x65, | 4067 0x6f, 0x6b, 0x69, 0x65, |
3984 0x07, 0x66, 0x6f, 0x6f, | 4068 0x07, 0x66, 0x6f, 0x6f, |
3985 0x3d, 0x62, 0x61, 0x72, | 4069 0x3d, 0x62, 0x61, 0x72, |
3986 }; | 4070 }; |
3987 | 4071 |
3988 SpdyFramer framer(spdy_version_); | 4072 SpdyFramer framer(spdy_version_); |
3989 TestSpdyVisitor visitor(spdy_version_); | 4073 TestSpdyVisitor visitor(spdy_version_); |
3990 framer.set_visitor(&visitor); | 4074 framer.set_visitor(&visitor); |
3991 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 4075 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
3992 | 4076 |
3993 EXPECT_EQ(1, visitor.error_count_); | 4077 EXPECT_EQ(1, visitor.error_count_); |
3994 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, | 4078 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, |
3995 visitor.framer_.error_code()) | 4079 visitor.framer_.error_code()) |
3996 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4080 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
3997 EXPECT_EQ(0, visitor.continuation_count_); | 4081 EXPECT_EQ(0, visitor.continuation_count_); |
3998 EXPECT_EQ(0u, visitor.header_buffer_length_); | 4082 EXPECT_EQ(0u, visitor.header_buffer_length_); |
3999 } | 4083 } |
4000 | 4084 |
4001 TEST_P(SpdyFramerTest, ExpectContinuationReceiveData) { | 4085 TEST_P(SpdyFramerTest, ExpectContinuationReceiveData) { |
4002 if (spdy_version_ <= SPDY3) { | 4086 if (spdy_version_ <= SPDY3) { |
4003 return; | 4087 return; |
4004 } | 4088 } |
4005 | 4089 |
4006 const unsigned char kInput[] = { | 4090 const unsigned char kInput[] = { |
4007 0x00, 0x10, 0x01, 0x00, // HEADERS | 4091 0x00, 0x00, 0x10, 0x01, 0x00, // HEADERS |
4008 0x00, 0x00, 0x00, 0x01, // Stream 1 | 4092 0x00, 0x00, 0x00, 0x01, // Stream 1 |
4009 0x00, 0x06, 0x63, 0x6f, | 4093 0x00, 0x06, 0x63, 0x6f, |
4010 0x6f, 0x6b, 0x69, 0x65, | 4094 0x6f, 0x6b, 0x69, 0x65, |
4011 0x07, 0x66, 0x6f, 0x6f, | 4095 0x07, 0x66, 0x6f, 0x6f, |
4012 0x3d, 0x62, 0x61, 0x72, | 4096 0x3d, 0x62, 0x61, 0x72, |
4013 | 4097 |
4014 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 | 4098 0x00, 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 |
4015 0x00, 0x00, 0x00, 0x04, | 4099 0x00, 0x00, 0x00, 0x04, |
4016 0xde, 0xad, 0xbe, 0xef, | 4100 0xde, 0xad, 0xbe, 0xef, |
4017 }; | 4101 }; |
4018 | 4102 |
4019 SpdyFramer framer(spdy_version_); | 4103 SpdyFramer framer(spdy_version_); |
4020 TestSpdyVisitor visitor(spdy_version_); | 4104 TestSpdyVisitor visitor(spdy_version_); |
4021 framer.set_visitor(&visitor); | 4105 framer.set_visitor(&visitor); |
4022 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 4106 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
4023 | 4107 |
4024 EXPECT_EQ(1, visitor.error_count_); | 4108 EXPECT_EQ(1, visitor.error_count_); |
4025 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, | 4109 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, |
4026 visitor.framer_.error_code()) | 4110 visitor.framer_.error_code()) |
4027 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4111 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4028 EXPECT_EQ(1, visitor.headers_frame_count_); | 4112 EXPECT_EQ(1, visitor.headers_frame_count_); |
4029 EXPECT_EQ(0, visitor.continuation_count_); | 4113 EXPECT_EQ(0, visitor.continuation_count_); |
4030 EXPECT_EQ(0u, visitor.header_buffer_length_); | 4114 EXPECT_EQ(0u, visitor.header_buffer_length_); |
4031 EXPECT_EQ(0, visitor.data_frame_count_); | 4115 EXPECT_EQ(0, visitor.data_frame_count_); |
4032 } | 4116 } |
4033 | 4117 |
4034 TEST_P(SpdyFramerTest, ExpectContinuationReceiveControlFrame) { | 4118 TEST_P(SpdyFramerTest, ExpectContinuationReceiveControlFrame) { |
4035 if (spdy_version_ <= SPDY3) { | 4119 if (spdy_version_ <= SPDY3) { |
4036 return; | 4120 return; |
4037 } | 4121 } |
4038 | 4122 |
4039 const unsigned char kInput[] = { | 4123 const unsigned char kInput[] = { |
4040 0x00, 0x10, 0x01, 0x00, // HEADERS | 4124 0x00, 0x00, 0x18, 0x01, 0x00, // HEADERS |
4041 0x00, 0x00, 0x00, 0x01, // Stream 1 | 4125 0x00, 0x00, 0x00, 0x01, // Stream 1 |
4042 0x00, 0x06, 0x63, 0x6f, | 4126 0x00, 0x06, 0x63, 0x6f, |
4043 0x6f, 0x6b, 0x69, 0x65, | 4127 0x6f, 0x6b, 0x69, 0x65, |
4044 0x07, 0x66, 0x6f, 0x6f, | 4128 0x07, 0x66, 0x6f, 0x6f, |
4045 0x3d, 0x62, 0x61, 0x72, | 4129 0x3d, 0x62, 0x61, 0x72, |
4046 | 4130 |
4047 0x00, 0x14, 0x08, 0x00, // HEADERS | 4131 0x00, 0x00, 0x1c, 0x08, 0x00, // HEADERS |
4048 0x00, 0x00, 0x00, 0x01, // Stream 1 | 4132 0x00, 0x00, 0x00, 0x01, // Stream 1 |
4049 0x00, 0x06, 0x63, 0x6f, // (Note this is a valid continued encoding). | 4133 0x00, 0x06, 0x63, 0x6f, // (Note this is a valid continued encoding). |
4050 0x6f, 0x6b, 0x69, 0x65, | 4134 0x6f, 0x6b, 0x69, 0x65, |
4051 0x08, 0x62, 0x61, 0x7a, | 4135 0x08, 0x62, 0x61, 0x7a, |
4052 0x3d, 0x62, 0x69, 0x6e, | 4136 0x3d, 0x62, 0x69, 0x6e, |
4053 0x67, 0x00, 0x06, 0x63, | 4137 0x67, 0x00, 0x06, 0x63, |
4054 }; | 4138 }; |
4055 | 4139 |
4056 SpdyFramer framer(spdy_version_); | 4140 SpdyFramer framer(spdy_version_); |
4057 TestSpdyVisitor visitor(spdy_version_); | 4141 TestSpdyVisitor visitor(spdy_version_); |
4058 framer.set_visitor(&visitor); | 4142 framer.set_visitor(&visitor); |
4059 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 4143 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
4060 | 4144 |
4061 EXPECT_EQ(1, visitor.error_count_); | 4145 EXPECT_EQ(1, visitor.error_count_); |
4062 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, | 4146 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, |
4063 visitor.framer_.error_code()) | 4147 visitor.framer_.error_code()) |
4064 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4148 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
4065 EXPECT_EQ(1, visitor.headers_frame_count_); | 4149 EXPECT_EQ(1, visitor.headers_frame_count_); |
4066 EXPECT_EQ(0, visitor.continuation_count_); | 4150 EXPECT_EQ(0, visitor.continuation_count_); |
4067 EXPECT_EQ(0u, visitor.header_buffer_length_); | 4151 EXPECT_EQ(0u, visitor.header_buffer_length_); |
4068 EXPECT_EQ(0, visitor.data_frame_count_); | 4152 EXPECT_EQ(0, visitor.data_frame_count_); |
4069 } | 4153 } |
4070 | 4154 |
4071 TEST_P(SpdyFramerTest, EndSegmentOnDataFrame) { | 4155 TEST_P(SpdyFramerTest, EndSegmentOnDataFrame) { |
4072 if (spdy_version_ <= SPDY3) { | 4156 if (spdy_version_ <= SPDY3) { |
4073 return; | 4157 return; |
4074 } | 4158 } |
4075 const unsigned char kInput[] = { | 4159 const unsigned char kInput[] = { |
4076 0x00, 0x0c, 0x00, 0x02, // DATA: END_SEGMENT | 4160 0x00, 0x00, 0x0c, 0x00, 0x02, // DATA: END_SEGMENT |
4077 0x00, 0x00, 0x00, 0x01, // Stream 1 | 4161 0x00, 0x00, 0x00, 0x01, // Stream 1 |
4078 0xde, 0xad, 0xbe, 0xef, | 4162 0xde, 0xad, 0xbe, 0xef, |
4079 0xde, 0xad, 0xbe, 0xef, | 4163 0xde, 0xad, 0xbe, 0xef, |
4080 0xde, 0xad, 0xbe, 0xef, | 4164 0xde, 0xad, 0xbe, 0xef, |
4081 }; | 4165 }; |
4082 | 4166 |
4083 TestSpdyVisitor visitor(spdy_version_); | 4167 TestSpdyVisitor visitor(spdy_version_); |
4084 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 4168 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
4085 | 4169 |
4086 // TODO(jgraettinger): Verify END_SEGMENT when support is added. | 4170 // TODO(jgraettinger): Verify END_SEGMENT when support is added. |
4087 EXPECT_EQ(0, visitor.error_count_); | 4171 EXPECT_EQ(0, visitor.error_count_); |
4088 EXPECT_EQ(12, visitor.data_bytes_); | 4172 EXPECT_EQ(12, visitor.data_bytes_); |
4089 EXPECT_EQ(0, visitor.fin_frame_count_); | 4173 EXPECT_EQ(0, visitor.fin_frame_count_); |
4090 EXPECT_EQ(0, visitor.fin_flag_count_); | 4174 EXPECT_EQ(0, visitor.fin_flag_count_); |
4091 } | 4175 } |
4092 | 4176 |
4093 TEST_P(SpdyFramerTest, EndSegmentOnHeadersFrame) { | 4177 TEST_P(SpdyFramerTest, EndSegmentOnHeadersFrame) { |
4094 if (spdy_version_ <= SPDY3) { | 4178 if (spdy_version_ <= SPDY3) { |
4095 return; | 4179 return; |
4096 } | 4180 } |
4097 const unsigned char kInput[] = { | 4181 const unsigned char kInput[] = { |
4098 0x00, 0x10, 0x01, 0x06, // HEADERS: END_SEGMENT | END_HEADERS | 4182 0x00, 0x00, 0x10, 0x01, 0x06, // HEADERS: END_SEGMENT | END_HEADERS |
4099 0x00, 0x00, 0x00, 0x01, // Stream 1 | 4183 0x00, 0x00, 0x00, 0x01, // Stream 1 |
4100 0x00, 0x06, 0x63, 0x6f, | 4184 0x00, 0x06, 0x63, 0x6f, |
4101 0x6f, 0x6b, 0x69, 0x65, | 4185 0x6f, 0x6b, 0x69, 0x65, |
4102 0x07, 0x66, 0x6f, 0x6f, | 4186 0x07, 0x66, 0x6f, 0x6f, |
4103 0x3d, 0x62, 0x61, 0x72, | 4187 0x3d, 0x62, 0x61, 0x72, |
4104 }; | 4188 }; |
4105 | 4189 |
4106 TestSpdyVisitor visitor(spdy_version_); | 4190 TestSpdyVisitor visitor(spdy_version_); |
4107 visitor.SimulateInFramer(kInput, sizeof(kInput)); | 4191 visitor.SimulateInFramer(kInput, sizeof(kInput)); |
4108 | 4192 |
4109 // TODO(jgraettinger): Verify END_SEGMENT when support is added. | 4193 // TODO(jgraettinger): Verify END_SEGMENT when support is added. |
4110 EXPECT_EQ(0, visitor.error_count_); | 4194 EXPECT_EQ(0, visitor.error_count_); |
4111 EXPECT_EQ(1, visitor.headers_frame_count_); | 4195 EXPECT_EQ(1, visitor.headers_frame_count_); |
4112 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); | 4196 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); |
4113 | 4197 |
4114 EXPECT_THAT(visitor.headers_, ElementsAre( | 4198 EXPECT_THAT(visitor.headers_, ElementsAre( |
4115 Pair("cookie", "foo=bar"))); | 4199 Pair("cookie", "foo=bar"))); |
4116 } | 4200 } |
4117 | 4201 |
4118 TEST_P(SpdyFramerTest, ReadGarbage) { | 4202 TEST_P(SpdyFramerTest, ReadGarbage) { |
4119 SpdyFramer framer(spdy_version_); | 4203 SpdyFramer framer(spdy_version_); |
4120 unsigned char garbage_frame[256]; | 4204 unsigned char garbage_frame[256]; |
4121 memset(garbage_frame, ~0, sizeof(garbage_frame)); | 4205 memset(garbage_frame, ~0, sizeof(garbage_frame)); |
4122 TestSpdyVisitor visitor(spdy_version_); | 4206 TestSpdyVisitor visitor(spdy_version_); |
4123 visitor.use_compression_ = false; | 4207 visitor.use_compression_ = false; |
4124 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame)); | 4208 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame)); |
4125 EXPECT_EQ(1, visitor.error_count_); | 4209 EXPECT_EQ(1, visitor.error_count_); |
4126 } | 4210 } |
4127 | 4211 |
| 4212 TEST_P(SpdyFramerTest, ReadUnknownExtensionFrame) { |
| 4213 if (spdy_version_ <= SPDY3) { |
| 4214 return; |
| 4215 } |
| 4216 SpdyFramer framer(spdy_version_); |
| 4217 |
| 4218 // The unrecognized frame type should still have a valid length. |
| 4219 const unsigned char unknown_frame[] = { |
| 4220 0x00, 0x00, 0x08, 0xff, 0xff, |
| 4221 0xff, 0xff, 0xff, 0xff, |
| 4222 0xff, 0xff, 0xff, 0xff, |
| 4223 0xff, 0xff, 0xff, 0xff, |
| 4224 }; |
| 4225 TestSpdyVisitor visitor(spdy_version_); |
| 4226 |
| 4227 // Simulate the case where the stream id validation checks out. |
| 4228 visitor.on_unknown_frame_result_ = true; |
| 4229 visitor.use_compression_ = false; |
| 4230 visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame)); |
| 4231 EXPECT_EQ(0, visitor.error_count_); |
| 4232 |
| 4233 // Follow it up with a valid control frame to make sure we handle |
| 4234 // subsequent frames correctly. |
| 4235 SpdySettingsIR settings_ir; |
| 4236 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1), |
| 4237 false, // persist |
| 4238 false, // persisted |
| 4239 10); |
| 4240 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); |
| 4241 visitor.SimulateInFramer( |
| 4242 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 4243 control_frame->size()); |
| 4244 EXPECT_EQ(0, visitor.error_count_); |
| 4245 EXPECT_EQ(1u, static_cast<unsigned>(visitor.setting_count_)); |
| 4246 EXPECT_EQ(1u, static_cast<unsigned>(visitor.settings_ack_sent_)); |
| 4247 } |
| 4248 |
4128 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) { | 4249 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) { |
4129 if (!IsSpdy4()) { | 4250 if (!IsSpdy4()) { |
4130 return; | 4251 return; |
4131 } | 4252 } |
4132 SpdyFramer framer(spdy_version_); | 4253 SpdyFramer framer(spdy_version_); |
4133 const unsigned char kFrameData[] = { | 4254 const unsigned char kFrameData[] = { |
4134 0x00, 0x10, 0xff, 0xff, | 4255 0x00, 0x00, 0x08, 0xff, 0xff, |
4135 0xff, 0xff, 0xff, 0xff, | 4256 0xff, 0xff, 0xff, 0xff, |
4136 0xff, 0xff, 0xff, 0xff, | 4257 0xff, 0xff, 0xff, 0xff, |
4137 0xff, 0xff, 0xff, 0xff, | 4258 0xff, 0xff, 0xff, 0xff, |
4138 }; | 4259 }; |
4139 TestSpdyVisitor visitor(spdy_version_); | 4260 TestSpdyVisitor visitor(spdy_version_); |
4140 visitor.use_compression_ = false; | 4261 visitor.use_compression_ = false; |
4141 visitor.SimulateInFramer(kFrameData, arraysize(kFrameData)); | 4262 visitor.SimulateInFramer(kFrameData, arraysize(kFrameData)); |
4142 EXPECT_EQ(1, visitor.error_count_); | 4263 EXPECT_EQ(1, visitor.error_count_); |
4143 } | 4264 } |
4144 | 4265 |
(...skipping 27 matching lines...) Expand all Loading... |
4172 0xff, 0xff, | 4293 0xff, 0xff, |
4173 }; | 4294 }; |
4174 | 4295 |
4175 TestSpdyVisitor visitor(spdy_version_); | 4296 TestSpdyVisitor visitor(spdy_version_); |
4176 visitor.SimulateInFramer(kInput, arraysize(kInput)); | 4297 visitor.SimulateInFramer(kInput, arraysize(kInput)); |
4177 EXPECT_EQ(1, visitor.error_count_); | 4298 EXPECT_EQ(1, visitor.error_count_); |
4178 } | 4299 } |
4179 | 4300 |
4180 TEST_P(SpdyFramerTest, SizesTest) { | 4301 TEST_P(SpdyFramerTest, SizesTest) { |
4181 SpdyFramer framer(spdy_version_); | 4302 SpdyFramer framer(spdy_version_); |
4182 EXPECT_EQ(8u, framer.GetDataFrameMinimumSize()); | |
4183 if (IsSpdy4() || IsSpdy5()) { | 4303 if (IsSpdy4() || IsSpdy5()) { |
4184 EXPECT_EQ(8u, framer.GetSynReplyMinimumSize()); | 4304 EXPECT_EQ(9u, framer.GetDataFrameMinimumSize()); |
4185 EXPECT_EQ(12u, framer.GetRstStreamMinimumSize()); | 4305 EXPECT_EQ(9u, framer.GetControlFrameHeaderSize()); |
4186 EXPECT_EQ(8u, framer.GetSettingsMinimumSize()); | 4306 EXPECT_EQ(14u, framer.GetSynStreamMinimumSize()); |
4187 EXPECT_EQ(16u, framer.GetPingSize()); | 4307 EXPECT_EQ(9u, framer.GetSynReplyMinimumSize()); |
4188 EXPECT_EQ(16u, framer.GetGoAwayMinimumSize()); | 4308 EXPECT_EQ(13u, framer.GetRstStreamMinimumSize()); |
4189 EXPECT_EQ(8u, framer.GetHeadersMinimumSize()); | 4309 EXPECT_EQ(9u, framer.GetSettingsMinimumSize()); |
4190 EXPECT_EQ(12u, framer.GetWindowUpdateSize()); | 4310 EXPECT_EQ(17u, framer.GetPingSize()); |
4191 EXPECT_EQ(8u, framer.GetBlockedSize()); | 4311 EXPECT_EQ(17u, framer.GetGoAwayMinimumSize()); |
4192 EXPECT_EQ(12u, framer.GetPushPromiseMinimumSize()); | 4312 EXPECT_EQ(9u, framer.GetHeadersMinimumSize()); |
4193 EXPECT_EQ(17u, framer.GetAltSvcMinimumSize()); | 4313 EXPECT_EQ(13u, framer.GetWindowUpdateSize()); |
4194 EXPECT_EQ(8u, framer.GetFrameMinimumSize()); | 4314 EXPECT_EQ(9u, framer.GetBlockedSize()); |
4195 EXPECT_EQ(16383u, framer.GetFrameMaximumSize()); | 4315 EXPECT_EQ(13u, framer.GetPushPromiseMinimumSize()); |
4196 EXPECT_EQ(16375u, framer.GetDataFrameMaximumPayload()); | 4316 EXPECT_EQ(18u, framer.GetAltSvcMinimumSize()); |
| 4317 EXPECT_EQ(9u, framer.GetFrameMinimumSize()); |
| 4318 EXPECT_EQ(16393u, framer.GetFrameMaximumSize()); |
| 4319 EXPECT_EQ(16384u, framer.GetDataFrameMaximumPayload()); |
4197 } else { | 4320 } else { |
| 4321 EXPECT_EQ(8u, framer.GetDataFrameMinimumSize()); |
4198 EXPECT_EQ(8u, framer.GetControlFrameHeaderSize()); | 4322 EXPECT_EQ(8u, framer.GetControlFrameHeaderSize()); |
4199 EXPECT_EQ(18u, framer.GetSynStreamMinimumSize()); | 4323 EXPECT_EQ(18u, framer.GetSynStreamMinimumSize()); |
4200 EXPECT_EQ(IsSpdy2() ? 14u : 12u, framer.GetSynReplyMinimumSize()); | 4324 EXPECT_EQ(IsSpdy2() ? 14u : 12u, framer.GetSynReplyMinimumSize()); |
4201 EXPECT_EQ(16u, framer.GetRstStreamMinimumSize()); | 4325 EXPECT_EQ(16u, framer.GetRstStreamMinimumSize()); |
4202 EXPECT_EQ(12u, framer.GetSettingsMinimumSize()); | 4326 EXPECT_EQ(12u, framer.GetSettingsMinimumSize()); |
4203 EXPECT_EQ(12u, framer.GetPingSize()); | 4327 EXPECT_EQ(12u, framer.GetPingSize()); |
4204 EXPECT_EQ(IsSpdy2() ? 12u : 16u, framer.GetGoAwayMinimumSize()); | 4328 EXPECT_EQ(IsSpdy2() ? 12u : 16u, framer.GetGoAwayMinimumSize()); |
4205 EXPECT_EQ(IsSpdy2() ? 14u : 12u, framer.GetHeadersMinimumSize()); | 4329 EXPECT_EQ(IsSpdy2() ? 14u : 12u, framer.GetHeadersMinimumSize()); |
4206 EXPECT_EQ(16u, framer.GetWindowUpdateSize()); | 4330 EXPECT_EQ(16u, framer.GetWindowUpdateSize()); |
4207 EXPECT_EQ(8u, framer.GetFrameMinimumSize()); | 4331 EXPECT_EQ(8u, framer.GetFrameMinimumSize()); |
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4993 TEST_P(SpdyFramerTest, RstStreamStatusBounds) { | 5117 TEST_P(SpdyFramerTest, RstStreamStatusBounds) { |
4994 const unsigned char kRstStreamStatusTooLow = 0x00; | 5118 const unsigned char kRstStreamStatusTooLow = 0x00; |
4995 const unsigned char kRstStreamStatusTooHigh = 0xff; | 5119 const unsigned char kRstStreamStatusTooHigh = 0xff; |
4996 const unsigned char kV3RstStreamInvalid[] = { | 5120 const unsigned char kV3RstStreamInvalid[] = { |
4997 0x80, spdy_version_ch_, 0x00, 0x03, | 5121 0x80, spdy_version_ch_, 0x00, 0x03, |
4998 0x00, 0x00, 0x00, 0x08, | 5122 0x00, 0x00, 0x00, 0x08, |
4999 0x00, 0x00, 0x00, 0x01, | 5123 0x00, 0x00, 0x00, 0x01, |
5000 0x00, 0x00, 0x00, kRstStreamStatusTooLow | 5124 0x00, 0x00, 0x00, kRstStreamStatusTooLow |
5001 }; | 5125 }; |
5002 const unsigned char kV4RstStreamInvalid[] = { | 5126 const unsigned char kV4RstStreamInvalid[] = { |
5003 0x00, 0x04, 0x03, 0x00, | 5127 0x00, 0x00, 0x04, 0x03, |
5004 0x00, 0x00, 0x00, 0x01, | 5128 0x00, 0x00, 0x00, 0x00, |
5005 0x00, 0x00, 0x00, kRstStreamStatusTooLow | 5129 0x01, 0x00, 0x00, 0x00, |
| 5130 kRstStreamStatusTooLow |
5006 }; | 5131 }; |
5007 | 5132 |
5008 const unsigned char kV3RstStreamNumStatusCodes[] = { | 5133 const unsigned char kV3RstStreamNumStatusCodes[] = { |
5009 0x80, spdy_version_ch_, 0x00, 0x03, | 5134 0x80, spdy_version_ch_, 0x00, 0x03, |
5010 0x00, 0x00, 0x00, 0x08, | 5135 0x00, 0x00, 0x00, 0x08, |
5011 0x00, 0x00, 0x00, 0x01, | 5136 0x00, 0x00, 0x00, 0x01, |
5012 0x00, 0x00, 0x00, kRstStreamStatusTooHigh | 5137 0x00, 0x00, 0x00, kRstStreamStatusTooHigh |
5013 }; | 5138 }; |
5014 const unsigned char kV4RstStreamNumStatusCodes[] = { | 5139 const unsigned char kV4RstStreamNumStatusCodes[] = { |
5015 0x00, 0x04, 0x03, 0x00, | 5140 0x00, 0x00, 0x04, 0x03, |
5016 0x00, 0x00, 0x00, 0x01, | 5141 0x00, 0x00, 0x00, 0x00, |
5017 0x00, 0x00, 0x00, kRstStreamStatusTooHigh | 5142 0x01, 0x00, 0x00, 0x00, |
| 5143 kRstStreamStatusTooHigh |
5018 }; | 5144 }; |
5019 | 5145 |
5020 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5146 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5021 SpdyFramer framer(spdy_version_); | 5147 SpdyFramer framer(spdy_version_); |
5022 framer.set_visitor(&visitor); | 5148 framer.set_visitor(&visitor); |
5023 | 5149 |
5024 if (IsSpdy4()) { | 5150 if (IsSpdy4()) { |
5025 EXPECT_CALL(visitor, OnError(_)); | 5151 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INTERNAL_ERROR)); |
5026 framer.ProcessInput(reinterpret_cast<const char*>(kV4RstStreamInvalid), | 5152 framer.ProcessInput(reinterpret_cast<const char*>(kV4RstStreamInvalid), |
5027 arraysize(kV4RstStreamInvalid)); | 5153 arraysize(kV4RstStreamInvalid)); |
5028 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | |
5029 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) | |
5030 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
5031 } else { | 5154 } else { |
5032 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INVALID)); | 5155 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INVALID)); |
5033 framer.ProcessInput(reinterpret_cast<const char*>(kV3RstStreamInvalid), | 5156 framer.ProcessInput(reinterpret_cast<const char*>(kV3RstStreamInvalid), |
5034 arraysize(kV3RstStreamInvalid)); | 5157 arraysize(kV3RstStreamInvalid)); |
5035 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5158 } |
5036 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5159 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 5160 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5037 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5161 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5038 } | |
5039 | 5162 |
5040 | 5163 |
5041 framer.Reset(); | 5164 framer.Reset(); |
5042 | 5165 |
5043 if (IsSpdy4()) { | 5166 if (IsSpdy4()) { |
5044 EXPECT_CALL(visitor, OnError(_)); | 5167 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INTERNAL_ERROR)); |
5045 framer.ProcessInput( | 5168 framer.ProcessInput( |
5046 reinterpret_cast<const char*>(kV4RstStreamNumStatusCodes), | 5169 reinterpret_cast<const char*>(kV4RstStreamNumStatusCodes), |
5047 arraysize(kV4RstStreamNumStatusCodes)); | 5170 arraysize(kV4RstStreamNumStatusCodes)); |
5048 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); | |
5049 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, framer.error_code()) | |
5050 << SpdyFramer::ErrorCodeToString(framer.error_code()); | |
5051 } else { | 5171 } else { |
5052 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INVALID)); | 5172 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INVALID)); |
5053 framer.ProcessInput( | 5173 framer.ProcessInput( |
5054 reinterpret_cast<const char*>(kV3RstStreamNumStatusCodes), | 5174 reinterpret_cast<const char*>(kV3RstStreamNumStatusCodes), |
5055 arraysize(kV3RstStreamNumStatusCodes)); | 5175 arraysize(kV3RstStreamNumStatusCodes)); |
5056 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5176 } |
5057 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5177 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 5178 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5058 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5179 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 5180 } |
| 5181 |
| 5182 // Test handling of GOAWAY frames with out-of-bounds status code. |
| 5183 TEST_P(SpdyFramerTest, GoAwayStatusBounds) { |
| 5184 if (spdy_version_ <= SPDY2) { |
| 5185 return; |
5059 } | 5186 } |
| 5187 SpdyFramer framer(spdy_version_); |
| 5188 |
| 5189 const unsigned char kV3FrameData[] = { |
| 5190 0x80, spdy_version_ch_, 0x00, 0x07, |
| 5191 0x00, 0x00, 0x00, 0x08, |
| 5192 0x00, 0x00, 0x00, 0x01, // Stream Id |
| 5193 0xff, 0xff, 0xff, 0xff, // Status |
| 5194 }; |
| 5195 const unsigned char kV4FrameData[] = { |
| 5196 0x00, 0x00, 0x0a, 0x07, |
| 5197 0x00, 0x00, 0x00, 0x00, |
| 5198 0x00, 0x00, 0x00, 0x00, // Stream id |
| 5199 0x01, 0xff, 0xff, 0xff, // Status |
| 5200 0xff, 0x47, 0x41, // Opaque Description |
| 5201 }; |
| 5202 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 5203 framer.set_visitor(&visitor); |
| 5204 |
| 5205 if (IsSpdy3()) { |
| 5206 EXPECT_CALL(visitor, OnGoAway(1, GOAWAY_OK)); |
| 5207 framer.ProcessInput(reinterpret_cast<const char*>(kV3FrameData), |
| 5208 arraysize(kV3FrameData)); |
| 5209 } else { |
| 5210 EXPECT_CALL(visitor, OnGoAway(1, GOAWAY_INTERNAL_ERROR)); |
| 5211 framer.ProcessInput(reinterpret_cast<const char*>(kV4FrameData), |
| 5212 arraysize(kV4FrameData)); |
| 5213 } |
| 5214 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 5215 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 5216 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5060 } | 5217 } |
5061 | 5218 |
5062 // Tests handling of a GOAWAY frame with out-of-bounds stream ID. | 5219 // Tests handling of a GOAWAY frame with out-of-bounds stream ID. |
5063 TEST_P(SpdyFramerTest, GoAwayStreamIdBounds) { | 5220 TEST_P(SpdyFramerTest, GoAwayStreamIdBounds) { |
5064 const unsigned char kV2FrameData[] = { | 5221 const unsigned char kV2FrameData[] = { |
5065 0x80, spdy_version_ch_, 0x00, 0x07, | 5222 0x80, spdy_version_ch_, 0x00, 0x07, |
5066 0x00, 0x00, 0x00, 0x04, | 5223 0x00, 0x00, 0x00, 0x04, |
5067 0xff, 0xff, 0xff, 0xff, | 5224 0xff, 0xff, 0xff, 0xff, |
5068 }; | 5225 }; |
5069 const unsigned char kV3FrameData[] = { | 5226 const unsigned char kV3FrameData[] = { |
5070 0x80, spdy_version_ch_, 0x00, 0x07, | 5227 0x80, spdy_version_ch_, 0x00, 0x07, |
5071 0x00, 0x00, 0x00, 0x08, | 5228 0x00, 0x00, 0x00, 0x08, |
5072 0xff, 0xff, 0xff, 0xff, | 5229 0xff, 0xff, 0xff, 0xff, |
5073 0x00, 0x00, 0x00, 0x00, | 5230 0x00, 0x00, 0x00, 0x00, |
5074 }; | 5231 }; |
5075 const unsigned char kV4FrameData[] = { | 5232 const unsigned char kV4FrameData[] = { |
5076 0x00, 0x08, 0x07, 0x00, | 5233 0x00, 0x00, 0x08, 0x07, |
5077 0x00, 0x00, 0x00, 0x00, | 5234 0x00, 0x00, 0x00, 0x00, |
5078 0xff, 0xff, 0xff, 0xff, | 5235 0x00, 0xff, 0xff, 0xff, |
5079 0x00, 0x00, 0x00, 0x00, | 5236 0xff, 0x00, 0x00, 0x00, |
| 5237 0x00, |
5080 }; | 5238 }; |
5081 | 5239 |
5082 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5240 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
5083 SpdyFramer framer(spdy_version_); | 5241 SpdyFramer framer(spdy_version_); |
5084 framer.set_visitor(&visitor); | 5242 framer.set_visitor(&visitor); |
5085 | 5243 |
5086 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, GOAWAY_OK)); | 5244 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, GOAWAY_OK)); |
5087 if (IsSpdy2()) { | 5245 if (IsSpdy2()) { |
5088 framer.ProcessInput(reinterpret_cast<const char*>(kV2FrameData), | 5246 framer.ProcessInput(reinterpret_cast<const char*>(kV2FrameData), |
5089 arraysize(kV2FrameData)); | 5247 arraysize(kV2FrameData)); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5195 } | 5353 } |
5196 | 5354 |
5197 const unsigned char kType = static_cast<unsigned char>( | 5355 const unsigned char kType = static_cast<unsigned char>( |
5198 SpdyConstants::SerializeFrameType(spdy_version_, ALTSVC)); | 5356 SpdyConstants::SerializeFrameType(spdy_version_, ALTSVC)); |
5199 { | 5357 { |
5200 TestSpdyVisitor visitor(spdy_version_); | 5358 TestSpdyVisitor visitor(spdy_version_); |
5201 SpdyFramer framer(spdy_version_); | 5359 SpdyFramer framer(spdy_version_); |
5202 framer.set_visitor(&visitor); | 5360 framer.set_visitor(&visitor); |
5203 | 5361 |
5204 const unsigned char kFrameDataLargePIDLen[] = { | 5362 const unsigned char kFrameDataLargePIDLen[] = { |
5205 0x00, 0x17, kType, 0x00, | 5363 0x00, 0x00, 0x17, kType, 0x00, |
5206 0x00, 0x00, 0x00, 0x03, | 5364 0x00, 0x00, 0x00, 0x03, |
5207 0x00, 0x00, 0x00, 0x05, | 5365 0x00, 0x00, 0x00, 0x05, |
5208 0x01, 0xbb, 0x00, 0x05, // Port = 443 | 5366 0x01, 0xbb, 0x00, 0x05, // Port = 443 |
5209 'p', 'i', 'd', '1', // Protocol-ID | 5367 'p', 'i', 'd', '1', // Protocol-ID |
5210 0x04, 'h', 'o', 's', | 5368 0x04, 'h', 'o', 's', |
5211 't', 'o', 'r', 'i', | 5369 't', 'o', 'r', 'i', |
5212 'g', 'i', 'n', | 5370 'g', 'i', 'n', |
5213 }; | 5371 }; |
5214 | 5372 |
5215 visitor.SimulateInFramer(kFrameDataLargePIDLen, | 5373 visitor.SimulateInFramer(kFrameDataLargePIDLen, |
5216 sizeof(kFrameDataLargePIDLen)); | 5374 sizeof(kFrameDataLargePIDLen)); |
5217 EXPECT_EQ(1, visitor.error_count_); | 5375 EXPECT_EQ(1, visitor.error_count_); |
5218 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | 5376 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
5219 visitor.framer_.error_code()); | 5377 visitor.framer_.error_code()); |
5220 } | 5378 } |
5221 | 5379 |
5222 { | 5380 { |
5223 TestSpdyVisitor visitor(spdy_version_); | 5381 TestSpdyVisitor visitor(spdy_version_); |
5224 SpdyFramer framer(spdy_version_); | 5382 SpdyFramer framer(spdy_version_); |
5225 framer.set_visitor(&visitor); | 5383 framer.set_visitor(&visitor); |
5226 const unsigned char kFrameDataPIDLenLargerThanFrame[] = { | 5384 const unsigned char kFrameDataPIDLenLargerThanFrame[] = { |
5227 0x00, 0x17, kType, 0x00, | 5385 0x00, 0x00, 0x17, kType, 0x00, |
5228 0x00, 0x00, 0x00, 0x03, | 5386 0x00, 0x00, 0x00, 0x03, |
5229 0x00, 0x00, 0x00, 0x05, | 5387 0x00, 0x00, 0x00, 0x05, |
5230 0x01, 0xbb, 0x00, 0x99, // Port = 443 | 5388 0x01, 0xbb, 0x00, 0x99, // Port = 443 |
5231 'p', 'i', 'd', '1', // Protocol-ID | 5389 'p', 'i', 'd', '1', // Protocol-ID |
5232 0x04, 'h', 'o', 's', | 5390 0x04, 'h', 'o', 's', |
5233 't', 'o', 'r', 'i', | 5391 't', 'o', 'r', 'i', |
5234 'g', 'i', 'n', | 5392 'g', 'i', 'n', |
5235 }; | 5393 }; |
5236 | 5394 |
5237 visitor.SimulateInFramer(kFrameDataPIDLenLargerThanFrame, | 5395 visitor.SimulateInFramer(kFrameDataPIDLenLargerThanFrame, |
5238 sizeof(kFrameDataPIDLenLargerThanFrame)); | 5396 sizeof(kFrameDataPIDLenLargerThanFrame)); |
5239 EXPECT_EQ(1, visitor.error_count_); | 5397 EXPECT_EQ(1, visitor.error_count_); |
5240 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | 5398 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
5241 visitor.framer_.error_code()); | 5399 visitor.framer_.error_code()); |
5242 } | 5400 } |
5243 | 5401 |
5244 { | 5402 { |
5245 TestSpdyVisitor visitor(spdy_version_); | 5403 TestSpdyVisitor visitor(spdy_version_); |
5246 SpdyFramer framer(spdy_version_); | 5404 SpdyFramer framer(spdy_version_); |
5247 framer.set_visitor(&visitor); | 5405 framer.set_visitor(&visitor); |
5248 | 5406 |
5249 const unsigned char kFrameDataLargeHostLen[] = { | 5407 const unsigned char kFrameDataLargeHostLen[] = { |
5250 0x00, 0x17, kType, 0x00, | 5408 0x00, 0x00, 0x17, kType, 0x00, |
5251 0x00, 0x00, 0x00, 0x03, | 5409 0x00, 0x00, 0x00, 0x03, |
5252 0x00, 0x00, 0x00, 0x05, | 5410 0x00, 0x00, 0x00, 0x05, |
5253 0x01, 0xbb, 0x00, 0x04, // Port = 443 | 5411 0x01, 0xbb, 0x00, 0x04, // Port = 443 |
5254 'p', 'i', 'd', '1', // Protocol-ID | 5412 'p', 'i', 'd', '1', // Protocol-ID |
5255 0x0f, 'h', 'o', 's', | 5413 0x0f, 'h', 'o', 's', |
5256 't', 'o', 'r', 'i', | 5414 't', 'o', 'r', 'i', |
5257 'g', 'i', 'n', | 5415 'g', 'i', 'n', |
5258 }; | 5416 }; |
5259 | 5417 |
5260 visitor.SimulateInFramer(kFrameDataLargeHostLen, | 5418 visitor.SimulateInFramer(kFrameDataLargeHostLen, |
5261 sizeof(kFrameDataLargeHostLen)); | 5419 sizeof(kFrameDataLargeHostLen)); |
5262 EXPECT_EQ(1, visitor.error_count_); | 5420 EXPECT_EQ(1, visitor.error_count_); |
5263 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | 5421 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
5264 visitor.framer_.error_code()); | 5422 visitor.framer_.error_code()); |
5265 } | 5423 } |
5266 | 5424 |
5267 { | 5425 { |
5268 TestSpdyVisitor visitor(spdy_version_); | 5426 TestSpdyVisitor visitor(spdy_version_); |
5269 SpdyFramer framer(spdy_version_); | 5427 SpdyFramer framer(spdy_version_); |
5270 framer.set_visitor(&visitor); | 5428 framer.set_visitor(&visitor); |
5271 const unsigned char kFrameDataSmallPIDLen[] = { | 5429 const unsigned char kFrameDataSmallPIDLen[] = { |
5272 0x00, 0x17, kType, 0x00, | 5430 0x00, 0x00, 0x17, kType, 0x00, |
5273 0x00, 0x00, 0x00, 0x03, | 5431 0x00, 0x00, 0x00, 0x03, |
5274 0x00, 0x00, 0x00, 0x05, | 5432 0x00, 0x00, 0x00, 0x05, |
5275 0x01, 0xbb, 0x00, 0x01, // Port = 443 | 5433 0x01, 0xbb, 0x00, 0x01, // Port = 443 |
5276 'p', 'i', 'd', '1', // Protocol-ID | 5434 'p', 'i', 'd', '1', // Protocol-ID |
5277 0x04, 'h', 'o', 's', | 5435 0x04, 'h', 'o', 's', |
5278 't', 'o', 'r', 'i', | 5436 't', 'o', 'r', 'i', |
5279 'g', 'i', 'n', | 5437 'g', 'i', 'n', |
5280 }; | 5438 }; |
5281 | 5439 |
5282 visitor.SimulateInFramer(kFrameDataSmallPIDLen, | 5440 visitor.SimulateInFramer(kFrameDataSmallPIDLen, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5336 EXPECT_CALL(visitor, OnPriority(3, 1, 255, false)); | 5494 EXPECT_CALL(visitor, OnPriority(3, 1, 255, false)); |
5337 framer.ProcessInput(frame->data(), frame->size()); | 5495 framer.ProcessInput(frame->data(), frame->size()); |
5338 | 5496 |
5339 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5497 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
5340 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5498 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
5341 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5499 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
5342 // TODO(mlavan): once we actually maintain a priority tree, | 5500 // TODO(mlavan): once we actually maintain a priority tree, |
5343 // check that state is adjusted correctly. | 5501 // check that state is adjusted correctly. |
5344 } | 5502 } |
5345 | 5503 |
5346 // Tests handling of PRIORITY frame with incorrect size. | |
5347 TEST_P(SpdyFramerTest, ReadIncorrectlySizedPriority) { | |
5348 if (spdy_version_ <= SPDY3) { | |
5349 return; | |
5350 } | |
5351 | |
5352 // PRIORITY frame of size 4, which isn't correct. | |
5353 const unsigned char kFrameData[] = { | |
5354 0x00, 0x04, 0x02, 0x00, | |
5355 0x00, 0x00, 0x00, 0x03, | |
5356 0x00, 0x00, 0x00, 0x01, | |
5357 }; | |
5358 | |
5359 TestSpdyVisitor visitor(spdy_version_); | |
5360 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); | |
5361 | |
5362 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); | |
5363 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | |
5364 visitor.framer_.error_code()) | |
5365 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); | |
5366 } | |
5367 | |
5368 TEST_P(SpdyFramerTest, PriorityWeightMapping) { | 5504 TEST_P(SpdyFramerTest, PriorityWeightMapping) { |
5369 if (spdy_version_ <= SPDY3) { | 5505 if (spdy_version_ <= SPDY3) { |
5370 return; | 5506 return; |
5371 } | 5507 } |
5372 SpdyFramer framer(spdy_version_); | 5508 SpdyFramer framer(spdy_version_); |
5373 | 5509 |
5374 EXPECT_EQ(255u, framer.MapPriorityToWeight(0)); | 5510 EXPECT_EQ(255u, framer.MapPriorityToWeight(0)); |
5375 EXPECT_EQ(219u, framer.MapPriorityToWeight(1)); | 5511 EXPECT_EQ(219u, framer.MapPriorityToWeight(1)); |
5376 EXPECT_EQ(182u, framer.MapPriorityToWeight(2)); | 5512 EXPECT_EQ(182u, framer.MapPriorityToWeight(2)); |
5377 EXPECT_EQ(146u, framer.MapPriorityToWeight(3)); | 5513 EXPECT_EQ(146u, framer.MapPriorityToWeight(3)); |
(...skipping 12 matching lines...) Expand all Loading... |
5390 EXPECT_EQ(3u, framer.MapWeightToPriority(110)); | 5526 EXPECT_EQ(3u, framer.MapWeightToPriority(110)); |
5391 EXPECT_EQ(4u, framer.MapWeightToPriority(109)); | 5527 EXPECT_EQ(4u, framer.MapWeightToPriority(109)); |
5392 EXPECT_EQ(4u, framer.MapWeightToPriority(74)); | 5528 EXPECT_EQ(4u, framer.MapWeightToPriority(74)); |
5393 EXPECT_EQ(5u, framer.MapWeightToPriority(73)); | 5529 EXPECT_EQ(5u, framer.MapWeightToPriority(73)); |
5394 EXPECT_EQ(5u, framer.MapWeightToPriority(37)); | 5530 EXPECT_EQ(5u, framer.MapWeightToPriority(37)); |
5395 EXPECT_EQ(6u, framer.MapWeightToPriority(36)); | 5531 EXPECT_EQ(6u, framer.MapWeightToPriority(36)); |
5396 EXPECT_EQ(6u, framer.MapWeightToPriority(1)); | 5532 EXPECT_EQ(6u, framer.MapWeightToPriority(1)); |
5397 EXPECT_EQ(7u, framer.MapWeightToPriority(0)); | 5533 EXPECT_EQ(7u, framer.MapWeightToPriority(0)); |
5398 } | 5534 } |
5399 | 5535 |
| 5536 // Tests handling of PRIORITY frame with incorrect size. |
| 5537 TEST_P(SpdyFramerTest, ReadIncorrectlySizedPriority) { |
| 5538 if (spdy_version_ <= SPDY3) { |
| 5539 return; |
| 5540 } |
| 5541 |
| 5542 // PRIORITY frame of size 4, which isn't correct. |
| 5543 const unsigned char kFrameData[] = { |
| 5544 0x00, 0x00, 0x04, 0x02, 0x00, |
| 5545 0x00, 0x00, 0x00, 0x03, |
| 5546 0x00, 0x00, 0x00, 0x01, |
| 5547 }; |
| 5548 |
| 5549 TestSpdyVisitor visitor(spdy_version_); |
| 5550 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); |
| 5551 |
| 5552 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); |
| 5553 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
| 5554 visitor.framer_.error_code()) |
| 5555 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); |
| 5556 } |
| 5557 |
5400 } // namespace net | 5558 } // namespace net |
OLD | NEW |