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

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

Issue 288373004: Add handling + parsing for HTTP/2 ALTSVC frame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Non-static initializer fixes. Created 6 years, 7 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 | Annotate | Revision Log
« 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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
232 error_count_(0), 232 error_count_(0),
233 syn_frame_count_(0), 233 syn_frame_count_(0),
234 syn_reply_frame_count_(0), 234 syn_reply_frame_count_(0),
235 headers_frame_count_(0), 235 headers_frame_count_(0),
236 push_promise_frame_count_(0), 236 push_promise_frame_count_(0),
237 goaway_count_(0), 237 goaway_count_(0),
238 setting_count_(0), 238 setting_count_(0),
239 settings_ack_sent_(0), 239 settings_ack_sent_(0),
240 settings_ack_received_(0), 240 settings_ack_received_(0),
241 continuation_count_(0), 241 continuation_count_(0),
242 altsvc_count_(0),
243 test_altsvc_ir_(0),
242 last_window_update_stream_(0), 244 last_window_update_stream_(0),
243 last_window_update_delta_(0), 245 last_window_update_delta_(0),
244 last_push_promise_stream_(0), 246 last_push_promise_stream_(0),
245 last_push_promise_promised_stream_(0), 247 last_push_promise_promised_stream_(0),
246 data_bytes_(0), 248 data_bytes_(0),
247 fin_frame_count_(0), 249 fin_frame_count_(0),
248 fin_opaque_data_(), 250 fin_opaque_data_(),
249 fin_flag_count_(0), 251 fin_flag_count_(0),
250 zero_length_data_frame_count_(0), 252 zero_length_data_frame_count_(0),
251 control_frame_header_data_count_(0), 253 control_frame_header_data_count_(0),
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 ++push_promise_frame_count_; 399 ++push_promise_frame_count_;
398 InitHeaderStreaming(PUSH_PROMISE, stream_id); 400 InitHeaderStreaming(PUSH_PROMISE, stream_id);
399 last_push_promise_stream_ = stream_id; 401 last_push_promise_stream_ = stream_id;
400 last_push_promise_promised_stream_ = promised_stream_id; 402 last_push_promise_promised_stream_ = promised_stream_id;
401 } 403 }
402 404
403 virtual void OnContinuation(SpdyStreamId stream_id, bool end) OVERRIDE { 405 virtual void OnContinuation(SpdyStreamId stream_id, bool end) OVERRIDE {
404 ++continuation_count_; 406 ++continuation_count_;
405 } 407 }
406 408
409 virtual void OnAltSvc(SpdyStreamId stream_id,
410 uint32 max_age,
411 uint16 port,
412 StringPiece protocol_id,
413 StringPiece host,
414 StringPiece origin) OVERRIDE {
415 test_altsvc_ir_.set_stream_id(stream_id);
416 test_altsvc_ir_.set_max_age(max_age);
417 test_altsvc_ir_.set_port(port);
418 test_altsvc_ir_.set_protocol_id(protocol_id.as_string());
419 test_altsvc_ir_.set_host(host.as_string());
420 if (origin.length() > 0) {
421 test_altsvc_ir_.set_origin(origin.as_string());
422 }
423 ++altsvc_count_;
424 }
425
407 virtual void OnSendCompressedFrame(SpdyStreamId stream_id, 426 virtual void OnSendCompressedFrame(SpdyStreamId stream_id,
408 SpdyFrameType type, 427 SpdyFrameType type,
409 size_t payload_len, 428 size_t payload_len,
410 size_t frame_len) OVERRIDE { 429 size_t frame_len) OVERRIDE {
411 last_payload_len_ = payload_len; 430 last_payload_len_ = payload_len;
412 last_frame_len_ = frame_len; 431 last_frame_len_ = frame_len;
413 } 432 }
414 433
415 virtual void OnReceiveCompressedFrame(SpdyStreamId stream_id, 434 virtual void OnReceiveCompressedFrame(SpdyStreamId stream_id,
416 SpdyFrameType type, 435 SpdyFrameType type,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 int error_count_; 486 int error_count_;
468 int syn_frame_count_; 487 int syn_frame_count_;
469 int syn_reply_frame_count_; 488 int syn_reply_frame_count_;
470 int headers_frame_count_; 489 int headers_frame_count_;
471 int push_promise_frame_count_; 490 int push_promise_frame_count_;
472 int goaway_count_; 491 int goaway_count_;
473 int setting_count_; 492 int setting_count_;
474 int settings_ack_sent_; 493 int settings_ack_sent_;
475 int settings_ack_received_; 494 int settings_ack_received_;
476 int continuation_count_; 495 int continuation_count_;
496 int altsvc_count_;
497 SpdyAltSvcIR test_altsvc_ir_;
477 SpdyStreamId last_window_update_stream_; 498 SpdyStreamId last_window_update_stream_;
478 uint32 last_window_update_delta_; 499 uint32 last_window_update_delta_;
479 SpdyStreamId last_push_promise_stream_; 500 SpdyStreamId last_push_promise_stream_;
480 SpdyStreamId last_push_promise_promised_stream_; 501 SpdyStreamId last_push_promise_promised_stream_;
481 int data_bytes_; 502 int data_bytes_;
482 int fin_frame_count_; // The count of RST_STREAM type frames received. 503 int fin_frame_count_; // The count of RST_STREAM type frames received.
483 std::string fin_opaque_data_; 504 std::string fin_opaque_data_;
484 int fin_flag_count_; // The count of frames with the FIN flag set. 505 int fin_flag_count_; // The count of frames with the FIN flag set.
485 int zero_length_data_frame_count_; // The count of zero-length data frames. 506 int zero_length_data_frame_count_; // The count of zero-length data frames.
486 int control_frame_header_data_count_; // The count of chunks received. 507 int control_frame_header_data_count_; // The count of chunks received.
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
600 << "'."; 621 << "'.";
601 return false; 622 return false;
602 } 623 }
603 } 624 }
604 return true; 625 return true;
605 } 626 }
606 627
607 bool IsSpdy2() { return spdy_version_ == SPDY2; } 628 bool IsSpdy2() { return spdy_version_ == SPDY2; }
608 bool IsSpdy3() { return spdy_version_ == SPDY3; } 629 bool IsSpdy3() { return spdy_version_ == SPDY3; }
609 bool IsSpdy4() { return spdy_version_ == SPDY4; } 630 bool IsSpdy4() { return spdy_version_ == SPDY4; }
631 bool IsSpdy5() { return spdy_version_ == SPDY5; }
610 632
611 // Version of SPDY protocol to be used. 633 // Version of SPDY protocol to be used.
612 SpdyMajorVersion spdy_version_; 634 SpdyMajorVersion spdy_version_;
613 unsigned char spdy_version_ch_; 635 unsigned char spdy_version_ch_;
614 }; 636 };
615 637
616 // All tests are run with 3 different SPDY versions: SPDY/2, SPDY/3, SPDY/4. 638 // All tests are run with 3 different SPDY versions: SPDY/2, SPDY/3, SPDY/4.
617 INSTANTIATE_TEST_CASE_P(SpdyFramerTests, 639 INSTANTIATE_TEST_CASE_P(SpdyFramerTests,
618 SpdyFramerTest, 640 SpdyFramerTest,
619 ::testing::Values(SPDY2, SPDY3, SPDY4)); 641 ::testing::Values(SPDY2, SPDY3, SPDY4));
(...skipping 2263 matching lines...) Expand 10 before | Expand all | Expand 10 after
2883 } 2905 }
2884 2906
2885 TEST_P(SpdyFramerTest, SerializeBlocked) { 2907 TEST_P(SpdyFramerTest, SerializeBlocked) {
2886 if (spdy_version_ < SPDY4) { 2908 if (spdy_version_ < SPDY4) {
2887 return; 2909 return;
2888 } 2910 }
2889 2911
2890 SpdyFramer framer(spdy_version_); 2912 SpdyFramer framer(spdy_version_);
2891 2913
2892 const char kDescription[] = "BLOCKED frame"; 2914 const char kDescription[] = "BLOCKED frame";
2915 const char kType = static_cast<unsigned char>(
2916 SpdyConstants::SerializeFrameType(spdy_version_, BLOCKED));
2893 const unsigned char kFrameData[] = { 2917 const unsigned char kFrameData[] = {
2894 0x00, 0x00, 0x0a, 0x00, 2918 0x00, 0x00, kType, 0x00,
2895 0x00, 0x00, 0x00, 0x00, 2919 0x00, 0x00, 0x00, 0x00,
2896 }; 2920 };
2897 SpdyBlockedIR blocked_ir(0); 2921 SpdyBlockedIR blocked_ir(0);
2898 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); 2922 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir));
2899 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); 2923 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData));
2900 } 2924 }
2901 2925
2902 TEST_P(SpdyFramerTest, CreateBlocked) { 2926 TEST_P(SpdyFramerTest, CreateBlocked) {
2903 if (spdy_version_ < SPDY4) { 2927 if (spdy_version_ < SPDY4) {
2904 return; 2928 return;
2905 } 2929 }
2906 2930
2907 SpdyFramer framer(spdy_version_); 2931 SpdyFramer framer(spdy_version_);
2908 2932
2909 const char kDescription[] = "BLOCKED frame"; 2933 const char kDescription[] = "BLOCKED frame";
2910 const SpdyStreamId kStreamId = 3; 2934 const SpdyStreamId kStreamId = 3;
2911 2935
2912 scoped_ptr<SpdySerializedFrame> frame_serialized( 2936 scoped_ptr<SpdySerializedFrame> frame_serialized(
2913 framer.SerializeBlocked(SpdyBlockedIR(kStreamId))); 2937 framer.SerializeBlocked(SpdyBlockedIR(kStreamId)));
2914 SpdyBlockedIR blocked_ir(kStreamId); 2938 SpdyBlockedIR blocked_ir(kStreamId);
2915 scoped_ptr<SpdySerializedFrame> frame_created( 2939 scoped_ptr<SpdySerializedFrame> frame_created(
2916 framer.SerializeFrame(blocked_ir)); 2940 framer.SerializeFrame(blocked_ir));
2917 2941
2918 CompareFrames(kDescription, *frame_serialized, *frame_created); 2942 CompareFrames(kDescription, *frame_serialized, *frame_created);
2919 } 2943 }
2920 2944
2921 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { 2945 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) {
2922 if (spdy_version_ < SPDY4) { 2946 if (spdy_version_ < SPDY4) {
2923 return; 2947 return;
2924 } 2948 }
2925 2949
2926 SpdyFramer framer(spdy_version_); 2950 SpdyFramer framer(spdy_version_);
(...skipping 12 matching lines...) Expand all
2939 }; 2963 };
2940 2964
2941 SpdyPushPromiseIR push_promise(42, 57); 2965 SpdyPushPromiseIR push_promise(42, 57);
2942 push_promise.SetHeader("bar", "foo"); 2966 push_promise.SetHeader("bar", "foo");
2943 push_promise.SetHeader("foo", "bar"); 2967 push_promise.SetHeader("foo", "bar");
2944 scoped_ptr<SpdySerializedFrame> frame( 2968 scoped_ptr<SpdySerializedFrame> frame(
2945 framer.SerializePushPromise(push_promise)); 2969 framer.SerializePushPromise(push_promise));
2946 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); 2970 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData));
2947 } 2971 }
2948 2972
2973 TEST_P(SpdyFramerTest, CreateAltSvc) {
2974 if (spdy_version_ < SPDY4) {
2975 return;
2976 }
2977
2978 SpdyFramer framer(spdy_version_);
2979
2980 const char kDescription[] = "ALTSVC frame";
2981 const char kType = static_cast<unsigned char>(
2982 SpdyConstants::SerializeFrameType(spdy_version_, ALTSVC));
2983 const unsigned char kFrameData[] = {
2984 0x00, 0x17, kType, 0x00,
2985 0x00, 0x00, 0x00, 0x03,
2986 0x00, 0x00, 0x00, 0x05,
2987 0x01, 0xbb, 0x00, 0x04, // Port = 443
2988 'p', 'i', 'd', '1', // Protocol-ID
2989 0x04, 'h', 'o', 's',
2990 't', 'o', 'r', 'i',
2991 'g', 'i', 'n',
2992 };
2993 SpdyAltSvcIR altsvc_ir(3);
2994 altsvc_ir.set_max_age(5);
2995 altsvc_ir.set_port(443);
2996 altsvc_ir.set_protocol_id("pid1");
2997 altsvc_ir.set_host("host");
2998 altsvc_ir.set_origin("origin");
2999 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(altsvc_ir));
3000 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData));
3001 }
3002
2949 TEST_P(SpdyFramerTest, ReadCompressedSynStreamHeaderBlock) { 3003 TEST_P(SpdyFramerTest, ReadCompressedSynStreamHeaderBlock) {
2950 SpdyFramer framer(spdy_version_); 3004 SpdyFramer framer(spdy_version_);
2951 SpdySynStreamIR syn_stream(1); 3005 SpdySynStreamIR syn_stream(1);
2952 syn_stream.set_priority(1); 3006 syn_stream.set_priority(1);
2953 syn_stream.SetHeader("aa", "vv"); 3007 syn_stream.SetHeader("aa", "vv");
2954 syn_stream.SetHeader("bb", "ww"); 3008 syn_stream.SetHeader("bb", "ww");
2955 SpdyHeaderBlock headers = syn_stream.name_value_block(); 3009 SpdyHeaderBlock headers = syn_stream.name_value_block();
2956 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSynStream(syn_stream)); 3010 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSynStream(syn_stream));
2957 EXPECT_TRUE(control_frame.get() != NULL); 3011 EXPECT_TRUE(control_frame.get() != NULL);
2958 TestSpdyVisitor visitor(spdy_version_); 3012 TestSpdyVisitor visitor(spdy_version_);
(...skipping 1062 matching lines...) Expand 10 before | Expand all | Expand 10 after
4021 }; 4075 };
4022 TestSpdyVisitor visitor(spdy_version_); 4076 TestSpdyVisitor visitor(spdy_version_);
4023 visitor.use_compression_ = false; 4077 visitor.use_compression_ = false;
4024 visitor.SimulateInFramer(kFrameData, arraysize(kFrameData)); 4078 visitor.SimulateInFramer(kFrameData, arraysize(kFrameData));
4025 EXPECT_EQ(1, visitor.error_count_); 4079 EXPECT_EQ(1, visitor.error_count_);
4026 } 4080 }
4027 4081
4028 TEST_P(SpdyFramerTest, SizesTest) { 4082 TEST_P(SpdyFramerTest, SizesTest) {
4029 SpdyFramer framer(spdy_version_); 4083 SpdyFramer framer(spdy_version_);
4030 EXPECT_EQ(8u, framer.GetDataFrameMinimumSize()); 4084 EXPECT_EQ(8u, framer.GetDataFrameMinimumSize());
4031 if (IsSpdy4()) { 4085 if (IsSpdy4() || IsSpdy5()) {
4032 EXPECT_EQ(8u, framer.GetSynReplyMinimumSize()); 4086 EXPECT_EQ(8u, framer.GetSynReplyMinimumSize());
4033 EXPECT_EQ(12u, framer.GetRstStreamMinimumSize()); 4087 EXPECT_EQ(12u, framer.GetRstStreamMinimumSize());
4034 EXPECT_EQ(8u, framer.GetSettingsMinimumSize()); 4088 EXPECT_EQ(8u, framer.GetSettingsMinimumSize());
4035 EXPECT_EQ(16u, framer.GetPingSize()); 4089 EXPECT_EQ(16u, framer.GetPingSize());
4036 EXPECT_EQ(16u, framer.GetGoAwayMinimumSize()); 4090 EXPECT_EQ(16u, framer.GetGoAwayMinimumSize());
4037 EXPECT_EQ(8u, framer.GetHeadersMinimumSize()); 4091 EXPECT_EQ(8u, framer.GetHeadersMinimumSize());
4038 EXPECT_EQ(12u, framer.GetWindowUpdateSize()); 4092 EXPECT_EQ(12u, framer.GetWindowUpdateSize());
4039 EXPECT_EQ(8u, framer.GetBlockedSize()); 4093 EXPECT_EQ(8u, framer.GetBlockedSize());
4040 EXPECT_EQ(12u, framer.GetPushPromiseMinimumSize()); 4094 EXPECT_EQ(12u, framer.GetPushPromiseMinimumSize());
4095 EXPECT_EQ(17u, framer.GetAltSvcMinimumSize());
4041 EXPECT_EQ(8u, framer.GetFrameMinimumSize()); 4096 EXPECT_EQ(8u, framer.GetFrameMinimumSize());
4042 EXPECT_EQ(16383u, framer.GetFrameMaximumSize()); 4097 EXPECT_EQ(16383u, framer.GetFrameMaximumSize());
4043 EXPECT_EQ(16375u, framer.GetDataFrameMaximumPayload()); 4098 EXPECT_EQ(16375u, framer.GetDataFrameMaximumPayload());
4044 } else { 4099 } else {
4045 EXPECT_EQ(8u, framer.GetControlFrameHeaderSize()); 4100 EXPECT_EQ(8u, framer.GetControlFrameHeaderSize());
4046 EXPECT_EQ(18u, framer.GetSynStreamMinimumSize()); 4101 EXPECT_EQ(18u, framer.GetSynStreamMinimumSize());
4047 EXPECT_EQ(IsSpdy2() ? 14u : 12u, framer.GetSynReplyMinimumSize()); 4102 EXPECT_EQ(IsSpdy2() ? 14u : 12u, framer.GetSynReplyMinimumSize());
4048 EXPECT_EQ(16u, framer.GetRstStreamMinimumSize()); 4103 EXPECT_EQ(16u, framer.GetRstStreamMinimumSize());
4049 EXPECT_EQ(12u, framer.GetSettingsMinimumSize()); 4104 EXPECT_EQ(12u, framer.GetSettingsMinimumSize());
4050 EXPECT_EQ(12u, framer.GetPingSize()); 4105 EXPECT_EQ(12u, framer.GetPingSize());
(...skipping 27 matching lines...) Expand all
4078 SpdyFramer::SPDY_FORWARD_STREAM_FRAME)); 4133 SpdyFramer::SPDY_FORWARD_STREAM_FRAME));
4079 EXPECT_STREQ("SPDY_CONTROL_FRAME_BEFORE_HEADER_BLOCK", 4134 EXPECT_STREQ("SPDY_CONTROL_FRAME_BEFORE_HEADER_BLOCK",
4080 SpdyFramer::StateToString( 4135 SpdyFramer::StateToString(
4081 SpdyFramer::SPDY_CONTROL_FRAME_BEFORE_HEADER_BLOCK)); 4136 SpdyFramer::SPDY_CONTROL_FRAME_BEFORE_HEADER_BLOCK));
4082 EXPECT_STREQ("SPDY_CONTROL_FRAME_HEADER_BLOCK", 4137 EXPECT_STREQ("SPDY_CONTROL_FRAME_HEADER_BLOCK",
4083 SpdyFramer::StateToString( 4138 SpdyFramer::StateToString(
4084 SpdyFramer::SPDY_CONTROL_FRAME_HEADER_BLOCK)); 4139 SpdyFramer::SPDY_CONTROL_FRAME_HEADER_BLOCK));
4085 EXPECT_STREQ("SPDY_SETTINGS_FRAME_PAYLOAD", 4140 EXPECT_STREQ("SPDY_SETTINGS_FRAME_PAYLOAD",
4086 SpdyFramer::StateToString( 4141 SpdyFramer::StateToString(
4087 SpdyFramer::SPDY_SETTINGS_FRAME_PAYLOAD)); 4142 SpdyFramer::SPDY_SETTINGS_FRAME_PAYLOAD));
4143 EXPECT_STREQ("SPDY_ALTSVC_FRAME_PAYLOAD",
4144 SpdyFramer::StateToString(
4145 SpdyFramer::SPDY_ALTSVC_FRAME_PAYLOAD));
4088 EXPECT_STREQ("UNKNOWN_STATE", 4146 EXPECT_STREQ("UNKNOWN_STATE",
4089 SpdyFramer::StateToString( 4147 SpdyFramer::StateToString(
4090 SpdyFramer::SPDY_SETTINGS_FRAME_PAYLOAD + 1)); 4148 SpdyFramer::SPDY_ALTSVC_FRAME_PAYLOAD + 1));
4091 } 4149 }
4092 4150
4093 TEST_P(SpdyFramerTest, ErrorCodeToStringTest) { 4151 TEST_P(SpdyFramerTest, ErrorCodeToStringTest) {
4094 EXPECT_STREQ("NO_ERROR", 4152 EXPECT_STREQ("NO_ERROR",
4095 SpdyFramer::ErrorCodeToString(SpdyFramer::SPDY_NO_ERROR)); 4153 SpdyFramer::ErrorCodeToString(SpdyFramer::SPDY_NO_ERROR));
4096 EXPECT_STREQ("INVALID_CONTROL_FRAME", 4154 EXPECT_STREQ("INVALID_CONTROL_FRAME",
4097 SpdyFramer::ErrorCodeToString( 4155 SpdyFramer::ErrorCodeToString(
4098 SpdyFramer::SPDY_INVALID_CONTROL_FRAME)); 4156 SpdyFramer::SPDY_INVALID_CONTROL_FRAME));
4099 EXPECT_STREQ("CONTROL_PAYLOAD_TOO_LARGE", 4157 EXPECT_STREQ("CONTROL_PAYLOAD_TOO_LARGE",
4100 SpdyFramer::ErrorCodeToString( 4158 SpdyFramer::ErrorCodeToString(
(...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after
4952 5010
4953 SpdyBlockedIR blocked_ir(0); 5011 SpdyBlockedIR blocked_ir(0);
4954 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); 5012 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir));
4955 framer.ProcessInput(frame->data(), framer.GetBlockedSize()); 5013 framer.ProcessInput(frame->data(), framer.GetBlockedSize());
4956 5014
4957 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); 5015 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
4958 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 5016 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4959 << SpdyFramer::ErrorCodeToString(framer.error_code()); 5017 << SpdyFramer::ErrorCodeToString(framer.error_code());
4960 } 5018 }
4961 5019
5020 TEST_P(SpdyFramerTest, OnAltSvc) {
5021 if (spdy_version_ < SPDY4) {
5022 return;
5023 }
5024
5025 const SpdyStreamId kStreamId = 1;
5026
5027 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
5028 SpdyFramer framer(spdy_version_);
5029 framer.set_visitor(&visitor);
5030
5031 EXPECT_CALL(visitor, OnAltSvc(kStreamId,
5032 10,
5033 443,
5034 StringPiece("pid"),
5035 StringPiece("h1"),
5036 StringPiece("o1")));
5037
5038 SpdyAltSvcIR altsvc_ir(1);
5039 altsvc_ir.set_max_age(10);
5040 altsvc_ir.set_port(443);
5041 altsvc_ir.set_protocol_id("pid");
5042 altsvc_ir.set_host("h1");
5043 altsvc_ir.set_origin("o1");
5044 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(altsvc_ir));
5045 framer.ProcessInput(frame->data(), framer.GetAltSvcMinimumSize() +
5046 altsvc_ir.protocol_id().length() +
5047 altsvc_ir.host().length() +
5048 altsvc_ir.origin().length());
5049
5050 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
5051 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5052 << SpdyFramer::ErrorCodeToString(framer.error_code());
5053 }
5054
5055 TEST_P(SpdyFramerTest, OnAltSvcNoOrigin) {
5056 if (spdy_version_ < SPDY4) {
5057 return;
5058 }
5059
5060 const SpdyStreamId kStreamId = 1;
5061
5062 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
5063 SpdyFramer framer(spdy_version_);
5064 framer.set_visitor(&visitor);
5065
5066 EXPECT_CALL(visitor, OnAltSvc(kStreamId,
5067 10,
5068 443,
5069 StringPiece("pid"),
5070 StringPiece("h1"),
5071 StringPiece("")));
5072
5073 SpdyAltSvcIR altsvc_ir(1);
5074 altsvc_ir.set_max_age(10);
5075 altsvc_ir.set_port(443);
5076 altsvc_ir.set_protocol_id("pid");
5077 altsvc_ir.set_host("h1");
5078 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(altsvc_ir));
5079 framer.ProcessInput(frame->data(), framer.GetAltSvcMinimumSize() +
5080 altsvc_ir.protocol_id().length() +
5081 altsvc_ir.host().length());
5082
5083 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
5084 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
5085 << SpdyFramer::ErrorCodeToString(framer.error_code());
5086 }
5087
5088 TEST_P(SpdyFramerTest, OnAltSvcBadLengths) {
5089 if (spdy_version_ < SPDY4) {
5090 return;
5091 }
5092
5093 const char kType = static_cast<unsigned char>(
5094 SpdyConstants::SerializeFrameType(spdy_version_, ALTSVC));
5095 {
5096 TestSpdyVisitor visitor(spdy_version_);
5097 SpdyFramer framer(spdy_version_);
5098 framer.set_visitor(&visitor);
5099
5100 const unsigned char kFrameDataLargePIDLen[] = {
5101 0x00, 0x17, kType, 0x00,
5102 0x00, 0x00, 0x00, 0x03,
5103 0x00, 0x00, 0x00, 0x05,
5104 0x01, 0xbb, 0x00, 0x05, // Port = 443
5105 'p', 'i', 'd', '1', // Protocol-ID
5106 0x04, 'h', 'o', 's',
5107 't', 'o', 'r', 'i',
5108 'g', 'i', 'n',
5109 };
5110
5111 visitor.SimulateInFramer(kFrameDataLargePIDLen,
5112 sizeof(kFrameDataLargePIDLen));
5113 EXPECT_EQ(1, visitor.error_count_);
5114 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME,
5115 visitor.framer_.error_code());
5116 }
5117
5118 {
5119 TestSpdyVisitor visitor(spdy_version_);
5120 SpdyFramer framer(spdy_version_);
5121 framer.set_visitor(&visitor);
5122 const unsigned char kFrameDataPIDLenLargerThanFrame[] = {
5123 0x00, 0x17, kType, 0x00,
5124 0x00, 0x00, 0x00, 0x03,
5125 0x00, 0x00, 0x00, 0x05,
5126 0x01, 0xbb, 0x00, 0x99, // Port = 443
5127 'p', 'i', 'd', '1', // Protocol-ID
5128 0x04, 'h', 'o', 's',
5129 't', 'o', 'r', 'i',
5130 'g', 'i', 'n',
5131 };
5132
5133 visitor.SimulateInFramer(kFrameDataPIDLenLargerThanFrame,
5134 sizeof(kFrameDataPIDLenLargerThanFrame));
5135 EXPECT_EQ(1, visitor.error_count_);
5136 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME,
5137 visitor.framer_.error_code());
5138 }
5139
5140 {
5141 TestSpdyVisitor visitor(spdy_version_);
5142 SpdyFramer framer(spdy_version_);
5143 framer.set_visitor(&visitor);
5144
5145 const unsigned char kFrameDataLargeHostLen[] = {
5146 0x00, 0x17, kType, 0x00,
5147 0x00, 0x00, 0x00, 0x03,
5148 0x00, 0x00, 0x00, 0x05,
5149 0x01, 0xbb, 0x00, 0x04, // Port = 443
5150 'p', 'i', 'd', '1', // Protocol-ID
5151 0x0f, 'h', 'o', 's',
5152 't', 'o', 'r', 'i',
5153 'g', 'i', 'n',
5154 };
5155
5156 visitor.SimulateInFramer(kFrameDataLargeHostLen,
5157 sizeof(kFrameDataLargeHostLen));
5158 EXPECT_EQ(1, visitor.error_count_);
5159 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME,
5160 visitor.framer_.error_code());
5161 }
5162
5163 {
5164 TestSpdyVisitor visitor(spdy_version_);
5165 SpdyFramer framer(spdy_version_);
5166 framer.set_visitor(&visitor);
5167 const unsigned char kFrameDataSmallPIDLen[] = {
5168 0x00, 0x17, kType, 0x00,
5169 0x00, 0x00, 0x00, 0x03,
5170 0x00, 0x00, 0x00, 0x05,
5171 0x01, 0xbb, 0x00, 0x01, // Port = 443
5172 'p', 'i', 'd', '1', // Protocol-ID
5173 0x04, 'h', 'o', 's',
5174 't', 'o', 'r', 'i',
5175 'g', 'i', 'n',
5176 };
5177
5178 visitor.SimulateInFramer(kFrameDataSmallPIDLen,
5179 sizeof(kFrameDataSmallPIDLen));
5180 EXPECT_EQ(1, visitor.error_count_);
5181 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME,
5182 visitor.framer_.error_code());
5183 }
5184 }
5185
5186 // Tests handling of ALTSVC frames delivered in small chunks.
5187 TEST_P(SpdyFramerTest, ReadChunkedAltSvcFrame) {
5188 if (spdy_version_ < SPDY4) {
5189 return;
5190 }
5191 SpdyFramer framer(spdy_version_);
5192 SpdyAltSvcIR altsvc_ir(1);
5193 altsvc_ir.set_max_age(20);
5194 altsvc_ir.set_port(443);
5195 altsvc_ir.set_protocol_id("protocolid");
5196 altsvc_ir.set_host("hostname");
5197
5198 scoped_ptr<SpdyFrame> control_frame(framer.SerializeAltSvc(altsvc_ir));
5199 TestSpdyVisitor visitor(spdy_version_);
5200 visitor.use_compression_ = false;
5201
5202 // Read data in small chunks.
5203 size_t framed_data = 0;
5204 size_t unframed_data = control_frame->size();
5205 size_t kReadChunkSize = 5; // Read five bytes at a time.
5206 while (unframed_data > 0) {
5207 size_t to_read = min(kReadChunkSize, unframed_data);
5208 visitor.SimulateInFramer(
5209 reinterpret_cast<unsigned char*>(control_frame->data() + framed_data),
5210 to_read);
5211 unframed_data -= to_read;
5212 framed_data += to_read;
5213 }
5214 EXPECT_EQ(0, visitor.error_count_);
5215 EXPECT_EQ(1, visitor.altsvc_count_);
5216 EXPECT_EQ(20u, visitor.test_altsvc_ir_.max_age());
5217 EXPECT_EQ(443u, visitor.test_altsvc_ir_.port());
5218 EXPECT_EQ("protocolid", visitor.test_altsvc_ir_.protocol_id());
5219 EXPECT_EQ("hostname", visitor.test_altsvc_ir_.host());
5220 }
5221
4962 } // namespace net 5222 } // 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