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 |