| 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 "net/spdy/buffered_spdy_framer.h" | 5 #include "net/spdy/buffered_spdy_framer.h" |
| 6 | 6 |
| 7 #include "net/spdy/spdy_test_util_spdy2.h" | 7 #include "net/spdy/spdy_test_util_spdy2.h" |
| 8 #include "testing/platform_test.h" | 8 #include "testing/platform_test.h" |
| 9 | 9 |
| 10 using namespace net::test_spdy2; | 10 using namespace net::test_spdy2; |
| 11 | 11 |
| 12 namespace spdy { | 12 namespace spdy { |
| 13 | 13 |
| 14 namespace { | 14 namespace { |
| 15 | 15 |
| 16 class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { | 16 class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { |
| 17 public: | 17 public: |
| 18 TestBufferedSpdyVisitor() | 18 TestBufferedSpdyVisitor() |
| 19 : buffered_spdy_framer_(2), | 19 : buffered_spdy_framer_(2), |
| 20 error_count_(0), | 20 error_count_(0), |
| 21 setting_count_(0), |
| 21 syn_frame_count_(0), | 22 syn_frame_count_(0), |
| 22 syn_reply_frame_count_(0), | 23 syn_reply_frame_count_(0), |
| 23 headers_frame_count_(0), | 24 headers_frame_count_(0), |
| 24 header_stream_id_(-1) { | 25 header_stream_id_(-1) { |
| 25 } | 26 } |
| 26 | 27 |
| 27 void OnError(int error_code) { | 28 void OnError(int error_code) { |
| 28 LOG(INFO) << "SpdyFramer Error: " << error_code; | 29 LOG(INFO) << "SpdyFramer Error: " << error_code; |
| 29 error_count_++; | 30 error_count_++; |
| 30 } | 31 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 59 headers_frame_count_++; | 60 headers_frame_count_++; |
| 60 headers_ = *headers; | 61 headers_ = *headers; |
| 61 } | 62 } |
| 62 | 63 |
| 63 void OnStreamFrameData(SpdyStreamId stream_id, | 64 void OnStreamFrameData(SpdyStreamId stream_id, |
| 64 const char* data, | 65 const char* data, |
| 65 size_t len) { | 66 size_t len) { |
| 66 LOG(FATAL) << "Unexpected OnStreamFrameData call."; | 67 LOG(FATAL) << "Unexpected OnStreamFrameData call."; |
| 67 } | 68 } |
| 68 | 69 |
| 70 void OnSetting(SpdySettingsIds id, uint8 flags, uint32 value) { |
| 71 setting_count_++; |
| 72 } |
| 73 |
| 69 bool OnCredentialFrameData(const char*, size_t) { | 74 bool OnCredentialFrameData(const char*, size_t) { |
| 70 LOG(FATAL) << "Unexpected OnCredentialFrameData call."; | 75 LOG(FATAL) << "Unexpected OnCredentialFrameData call."; |
| 71 return false; | 76 return false; |
| 72 } | 77 } |
| 73 | 78 |
| 74 void OnDataFrameHeader(const SpdyDataFrame* frame) { | 79 void OnDataFrameHeader(const SpdyDataFrame* frame) { |
| 75 LOG(FATAL) << "Unexpected OnDataFrameHeader call."; | 80 LOG(FATAL) << "Unexpected OnDataFrameHeader call."; |
| 76 } | 81 } |
| 77 | 82 |
| 78 void OnControl(const SpdyControlFrame* frame) { | 83 void OnControl(const SpdyControlFrame* frame) { |
| 79 uint32 type = frame->type(); | 84 uint32 type = frame->type(); |
| 80 switch (type) { | 85 switch (type) { |
| 81 case SYN_STREAM: | 86 case SYN_STREAM: |
| 82 case SYN_REPLY: | 87 case SYN_REPLY: |
| 83 case HEADERS: | 88 case HEADERS: |
| 84 header_stream_id_ = SpdyFramer::GetControlFrameStreamId(frame); | 89 header_stream_id_ = SpdyFramer::GetControlFrameStreamId(frame); |
| 85 EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); | 90 EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); |
| 86 buffered_spdy_framer_.OnControl(frame); | 91 buffered_spdy_framer_.OnControl(frame); |
| 87 break; | 92 break; |
| 88 default: | 93 default: |
| 89 LOG(FATAL) << "Unexpected frame type." << type; | 94 LOG(FATAL) << "Unexpected frame type." << type; |
| 90 } | 95 } |
| 91 } | 96 } |
| 92 | 97 |
| 93 void OnRstStream(const spdy::SpdyRstStreamControlFrame& frame) {} | 98 void OnRstStream(const spdy::SpdyRstStreamControlFrame& frame) {} |
| 94 void OnGoAway(const spdy::SpdyGoAwayControlFrame& frame) {} | 99 void OnGoAway(const spdy::SpdyGoAwayControlFrame& frame) {} |
| 95 void OnPing(const spdy::SpdyPingControlFrame& frame) {} | 100 void OnPing(const spdy::SpdyPingControlFrame& frame) {} |
| 96 void OnSettings(const spdy::SpdySettingsControlFrame& frame) {} | |
| 97 void OnWindowUpdate(const spdy::SpdyWindowUpdateControlFrame& frame) {} | 101 void OnWindowUpdate(const spdy::SpdyWindowUpdateControlFrame& frame) {} |
| 98 void OnCredential(const spdy::SpdyCredentialControlFrame& frame) {} | 102 void OnCredential(const spdy::SpdyCredentialControlFrame& frame) {} |
| 99 | 103 |
| 100 // Convenience function which runs a framer simulation with particular input. | 104 // Convenience function which runs a framer simulation with particular input. |
| 101 void SimulateInFramer(const unsigned char* input, size_t size) { | 105 void SimulateInFramer(const unsigned char* input, size_t size) { |
| 102 buffered_spdy_framer_.set_visitor(this); | 106 buffered_spdy_framer_.set_visitor(this); |
| 103 size_t input_remaining = size; | 107 size_t input_remaining = size; |
| 104 const char* input_ptr = reinterpret_cast<const char*>(input); | 108 const char* input_ptr = reinterpret_cast<const char*>(input); |
| 105 while (input_remaining > 0 && | 109 while (input_remaining > 0 && |
| 106 buffered_spdy_framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { | 110 buffered_spdy_framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { |
| 107 // To make the tests more interesting, we feed random (amd small) chunks | 111 // To make the tests more interesting, we feed random (amd small) chunks |
| 108 // into the framer. This simulates getting strange-sized reads from | 112 // into the framer. This simulates getting strange-sized reads from |
| 109 // the socket. | 113 // the socket. |
| 110 const size_t kMaxReadSize = 32; | 114 const size_t kMaxReadSize = 32; |
| 111 size_t bytes_read = | 115 size_t bytes_read = |
| 112 (rand() % std::min(input_remaining, kMaxReadSize)) + 1; | 116 (rand() % std::min(input_remaining, kMaxReadSize)) + 1; |
| 113 size_t bytes_processed = | 117 size_t bytes_processed = |
| 114 buffered_spdy_framer_.ProcessInput(input_ptr, bytes_read); | 118 buffered_spdy_framer_.ProcessInput(input_ptr, bytes_read); |
| 115 input_remaining -= bytes_processed; | 119 input_remaining -= bytes_processed; |
| 116 input_ptr += bytes_processed; | 120 input_ptr += bytes_processed; |
| 117 if (buffered_spdy_framer_.state() == SpdyFramer::SPDY_DONE) | 121 if (buffered_spdy_framer_.state() == SpdyFramer::SPDY_DONE) |
| 118 buffered_spdy_framer_.Reset(); | 122 buffered_spdy_framer_.Reset(); |
| 119 } | 123 } |
| 120 } | 124 } |
| 121 | 125 |
| 122 BufferedSpdyFramer buffered_spdy_framer_; | 126 BufferedSpdyFramer buffered_spdy_framer_; |
| 123 | 127 |
| 124 // Counters from the visitor callbacks. | 128 // Counters from the visitor callbacks. |
| 125 int error_count_; | 129 int error_count_; |
| 130 int setting_count_; |
| 126 int syn_frame_count_; | 131 int syn_frame_count_; |
| 127 int syn_reply_frame_count_; | 132 int syn_reply_frame_count_; |
| 128 int headers_frame_count_; | 133 int headers_frame_count_; |
| 129 | 134 |
| 130 // Header block streaming state: | 135 // Header block streaming state: |
| 131 SpdyStreamId header_stream_id_; | 136 SpdyStreamId header_stream_id_; |
| 132 | 137 |
| 133 // Headers from OnSyn, OnSynReply and OnHeaders for verification. | 138 // Headers from OnSyn, OnSynReply and OnHeaders for verification. |
| 134 SpdyHeaderBlock headers_; | 139 SpdyHeaderBlock headers_; |
| 135 }; | 140 }; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 163 << "' to have a value of '" << it->second | 168 << "' to have a value of '" << it->second |
| 164 << "'. The actual value received was '" << it2->second | 169 << "'. The actual value received was '" << it2->second |
| 165 << "'."; | 170 << "'."; |
| 166 return false; | 171 return false; |
| 167 } | 172 } |
| 168 } | 173 } |
| 169 return true; | 174 return true; |
| 170 } | 175 } |
| 171 }; | 176 }; |
| 172 | 177 |
| 178 TEST_F(BufferedSpdyFramerSpdy2Test, OnSetting) { |
| 179 EnableCompression(false); |
| 180 |
| 181 SpdyFramer framer(2); |
| 182 SpdySettings settings; |
| 183 settings.push_back(SpdySetting(SettingsFlagsAndId(0, 1), 0x00000002)); |
| 184 settings.push_back(SpdySetting(SettingsFlagsAndId(0, 1), 0x00000003)); |
| 185 |
| 186 scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); |
| 187 TestBufferedSpdyVisitor visitor; |
| 188 |
| 189 visitor.SimulateInFramer( |
| 190 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 191 control_frame->length() + SpdyControlFrame::kHeaderSize); |
| 192 EXPECT_EQ(1, visitor.error_count_); |
| 193 EXPECT_EQ(1, visitor.setting_count_); |
| 194 } |
| 195 |
| 173 TEST_F(BufferedSpdyFramerSpdy2Test, ReadSynStreamHeaderBlock) { | 196 TEST_F(BufferedSpdyFramerSpdy2Test, ReadSynStreamHeaderBlock) { |
| 174 EnableCompression(false); | 197 EnableCompression(false); |
| 175 | 198 |
| 176 SpdyHeaderBlock headers; | 199 SpdyHeaderBlock headers; |
| 177 headers["aa"] = "vv"; | 200 headers["aa"] = "vv"; |
| 178 headers["bb"] = "ww"; | 201 headers["bb"] = "ww"; |
| 179 BufferedSpdyFramer framer(2); | 202 BufferedSpdyFramer framer(2); |
| 180 scoped_ptr<SpdySynStreamControlFrame> control_frame( | 203 scoped_ptr<SpdySynStreamControlFrame> control_frame( |
| 181 framer.CreateSynStream(1, // stream_id | 204 framer.CreateSynStream(1, // stream_id |
| 182 0, // associated_stream_id | 205 0, // associated_stream_id |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 visitor.SimulateInFramer( | 263 visitor.SimulateInFramer( |
| 241 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | 264 reinterpret_cast<unsigned char*>(control_frame.get()->data()), |
| 242 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); | 265 control_frame.get()->length() + SpdyControlFrame::kHeaderSize); |
| 243 EXPECT_EQ(0, visitor.error_count_); | 266 EXPECT_EQ(0, visitor.error_count_); |
| 244 EXPECT_EQ(0, visitor.syn_frame_count_); | 267 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 245 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 268 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 246 EXPECT_EQ(1, visitor.headers_frame_count_); | 269 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 247 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); | 270 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); |
| 248 } | 271 } |
| 249 } // namespace spdy | 272 } // namespace spdy |
| OLD | NEW |