| 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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |