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

Side by Side Diff: net/spdy/spdy_framer_test.cc

Issue 483843004: HTTP2 draft 13: support unknown frame types and settings types as extensions. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@merge_1
Patch Set: Add mock OnUnknownFrame to SpdyFramerVisitor in spdy_interface_test. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_protocol.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <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
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
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
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
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 2983 matching lines...) Expand 10 before | Expand all | Expand 10 after
3519 EXPECT_EQ(1, visitor.error_count_); 3532 EXPECT_EQ(1, visitor.error_count_);
3520 } else { 3533 } else {
3521 // In SPDY 4+, duplicate settings are allowed; 3534 // In SPDY 4+, duplicate settings are allowed;
3522 // each setting replaces the previous value for that setting. 3535 // each setting replaces the previous value for that setting.
3523 EXPECT_EQ(3, visitor.setting_count_); 3536 EXPECT_EQ(3, visitor.setting_count_);
3524 EXPECT_EQ(0, visitor.error_count_); 3537 EXPECT_EQ(0, visitor.error_count_);
3525 EXPECT_EQ(1, visitor.settings_ack_sent_); 3538 EXPECT_EQ(1, visitor.settings_ack_sent_);
3526 } 3539 }
3527 } 3540 }
3528 3541
3542 // Tests handling of SETTINGS frame with a setting we don't recognize.
3543 TEST_P(SpdyFramerTest, ReadUnknownSettingsId) {
3544 SpdyFramer framer(spdy_version_);
3545
3546 const unsigned char kV2FrameData[] = {
3547 0x80, spdy_version_ch_, 0x00, 0x04,
3548 0x00, 0x00, 0x00, 0x1C,
3549 0x00, 0x00, 0x00, 0x01,
3550 0x10, 0x00, 0x00, 0x00, // 1st Setting
3551 0x00, 0x00, 0x00, 0x02,
3552 };
3553 const unsigned char kV3FrameData[] = {
3554 0x80, spdy_version_ch_, 0x00, 0x04,
3555 0x00, 0x00, 0x00, 0x1C,
3556 0x00, 0x00, 0x00, 0x01,
3557 0x00, 0x00, 0x00, 0x10, // 1st Setting
3558 0x00, 0x00, 0x00, 0x02,
3559 };
3560 const unsigned char kV4FrameData[] = {
3561 0x00, 0x06, 0x04, 0x00,
3562 0x00, 0x00, 0x00, 0x00,
3563 0x00, 0x10, // 1st Setting
3564 0x00, 0x00, 0x00, 0x02,
3565 };
3566
3567 TestSpdyVisitor visitor(spdy_version_);
3568 visitor.use_compression_ = false;
3569 if (IsSpdy2()) {
3570 visitor.SimulateInFramer(kV2FrameData, sizeof(kV2FrameData));
3571 } else if (IsSpdy3()) {
3572 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData));
3573 } else {
3574 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData));
3575 }
3576
3577 if (!IsSpdy4()) {
3578 EXPECT_EQ(0, visitor.setting_count_);
3579 EXPECT_EQ(1, visitor.error_count_);
3580 } else {
3581 // In SPDY 4+, we ignore unknown settings because of extensions.
3582 EXPECT_EQ(0, visitor.setting_count_);
3583 EXPECT_EQ(0, visitor.error_count_);
3584 }
3585 }
3586
3529 // Tests handling of SETTINGS frame with entries out of order. 3587 // Tests handling of SETTINGS frame with entries out of order.
3530 TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) { 3588 TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) {
3531 SpdyFramer framer(spdy_version_); 3589 SpdyFramer framer(spdy_version_);
3532 3590
3533 const unsigned char kV2FrameData[] = { 3591 const unsigned char kV2FrameData[] = {
3534 0x80, spdy_version_ch_, 0x00, 0x04, 3592 0x80, spdy_version_ch_, 0x00, 0x04,
3535 0x00, 0x00, 0x00, 0x1C, 3593 0x00, 0x00, 0x00, 0x1C,
3536 0x00, 0x00, 0x00, 0x03, 3594 0x00, 0x00, 0x00, 0x03,
3537 0x02, 0x00, 0x00, 0x00, // 1st Setting 3595 0x02, 0x00, 0x00, 0x00, // 1st Setting
3538 0x00, 0x00, 0x00, 0x02, 3596 0x00, 0x00, 0x00, 0x02,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
3573 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); 3631 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData));
3574 } 3632 }
3575 3633
3576 if (!IsSpdy4()) { 3634 if (!IsSpdy4()) {
3577 EXPECT_EQ(1, visitor.setting_count_); 3635 EXPECT_EQ(1, visitor.setting_count_);
3578 EXPECT_EQ(1, visitor.error_count_); 3636 EXPECT_EQ(1, visitor.error_count_);
3579 } else { 3637 } else {
3580 // In SPDY 4+, settings are allowed in any order. 3638 // In SPDY 4+, settings are allowed in any order.
3581 EXPECT_EQ(3, visitor.setting_count_); 3639 EXPECT_EQ(3, visitor.setting_count_);
3582 EXPECT_EQ(0, visitor.error_count_); 3640 EXPECT_EQ(0, visitor.error_count_);
3583 // EXPECT_EQ(1, visitor.settings_ack_count_);
3584 } 3641 }
3585 } 3642 }
3586 3643
3587 TEST_P(SpdyFramerTest, ProcessSettingsAckFrame) { 3644 TEST_P(SpdyFramerTest, ProcessSettingsAckFrame) {
3588 if (spdy_version_ <= SPDY3) { 3645 if (spdy_version_ <= SPDY3) {
3589 return; 3646 return;
3590 } 3647 }
3591 SpdyFramer framer(spdy_version_); 3648 SpdyFramer framer(spdy_version_);
3592 3649
3593 const unsigned char kFrameData[] = { 3650 const unsigned char kFrameData[] = {
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
4118 TEST_P(SpdyFramerTest, ReadGarbage) { 4175 TEST_P(SpdyFramerTest, ReadGarbage) {
4119 SpdyFramer framer(spdy_version_); 4176 SpdyFramer framer(spdy_version_);
4120 unsigned char garbage_frame[256]; 4177 unsigned char garbage_frame[256];
4121 memset(garbage_frame, ~0, sizeof(garbage_frame)); 4178 memset(garbage_frame, ~0, sizeof(garbage_frame));
4122 TestSpdyVisitor visitor(spdy_version_); 4179 TestSpdyVisitor visitor(spdy_version_);
4123 visitor.use_compression_ = false; 4180 visitor.use_compression_ = false;
4124 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame)); 4181 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame));
4125 EXPECT_EQ(1, visitor.error_count_); 4182 EXPECT_EQ(1, visitor.error_count_);
4126 } 4183 }
4127 4184
4185 TEST_P(SpdyFramerTest, ReadUnknownExtensionFrame) {
4186 if (spdy_version_ <= SPDY3) {
4187 return;
4188 }
4189 SpdyFramer framer(spdy_version_);
4190
4191 // The unrecognized frame type should still have a valid length.
4192 const unsigned char unknown_frame[] = {
4193 0x00, 0x08, 0xff, 0xff,
4194 0xff, 0xff, 0xff, 0xff,
4195 0xff, 0xff, 0xff, 0xff,
4196 0xff, 0xff, 0xff, 0xff,
4197 };
4198 TestSpdyVisitor visitor(spdy_version_);
4199
4200 // Simulate the case where the stream id validation checks out.
4201 visitor.on_unknown_frame_result_ = true;
4202 visitor.use_compression_ = false;
4203 visitor.SimulateInFramer(unknown_frame, arraysize(unknown_frame));
4204 EXPECT_EQ(0, visitor.error_count_);
4205
4206 // Follow it up with a valid control frame to make sure we handle
4207 // subsequent frames correctly.
4208 SpdySettingsIR settings_ir;
4209 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1),
4210 false, // persist
4211 false, // persisted
4212 10);
4213 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir));
4214 visitor.SimulateInFramer(
4215 reinterpret_cast<unsigned char*>(control_frame->data()),
4216 control_frame->size());
4217 EXPECT_EQ(0, visitor.error_count_);
4218 EXPECT_EQ(1u, static_cast<unsigned>(visitor.setting_count_));
4219 EXPECT_EQ(1u, static_cast<unsigned>(visitor.settings_ack_sent_));
4220 }
4221
4128 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) { 4222 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) {
4129 if (!IsSpdy4()) { 4223 if (!IsSpdy4()) {
4130 return; 4224 return;
4131 } 4225 }
4132 SpdyFramer framer(spdy_version_); 4226 SpdyFramer framer(spdy_version_);
4133 const unsigned char kFrameData[] = { 4227 const unsigned char kFrameData[] = {
4134 0x00, 0x10, 0xff, 0xff, 4228 0x00, 0x08, 0xff, 0xff,
4135 0xff, 0xff, 0xff, 0xff, 4229 0xff, 0xff, 0xff, 0xff,
4136 0xff, 0xff, 0xff, 0xff, 4230 0xff, 0xff, 0xff, 0xff,
4137 0xff, 0xff, 0xff, 0xff, 4231 0xff, 0xff, 0xff, 0xff,
4138 }; 4232 };
4139 TestSpdyVisitor visitor(spdy_version_); 4233 TestSpdyVisitor visitor(spdy_version_);
4140 visitor.use_compression_ = false; 4234 visitor.use_compression_ = false;
4141 visitor.SimulateInFramer(kFrameData, arraysize(kFrameData)); 4235 visitor.SimulateInFramer(kFrameData, arraysize(kFrameData));
4142 EXPECT_EQ(1, visitor.error_count_); 4236 EXPECT_EQ(1, visitor.error_count_);
4143 } 4237 }
4144 4238
(...skipping 1277 matching lines...) Expand 10 before | Expand all | Expand 10 after
5422 EXPECT_EQ(4u, framer.MapWeightToPriority(109)); 5516 EXPECT_EQ(4u, framer.MapWeightToPriority(109));
5423 EXPECT_EQ(4u, framer.MapWeightToPriority(74)); 5517 EXPECT_EQ(4u, framer.MapWeightToPriority(74));
5424 EXPECT_EQ(5u, framer.MapWeightToPriority(73)); 5518 EXPECT_EQ(5u, framer.MapWeightToPriority(73));
5425 EXPECT_EQ(5u, framer.MapWeightToPriority(37)); 5519 EXPECT_EQ(5u, framer.MapWeightToPriority(37));
5426 EXPECT_EQ(6u, framer.MapWeightToPriority(36)); 5520 EXPECT_EQ(6u, framer.MapWeightToPriority(36));
5427 EXPECT_EQ(6u, framer.MapWeightToPriority(1)); 5521 EXPECT_EQ(6u, framer.MapWeightToPriority(1));
5428 EXPECT_EQ(7u, framer.MapWeightToPriority(0)); 5522 EXPECT_EQ(7u, framer.MapWeightToPriority(0));
5429 } 5523 }
5430 5524
5431 } // namespace net 5525 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698