Chromium Code Reviews| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 120 altsvc_stream_id_ = stream_id; | 120 altsvc_stream_id_ = stream_id; |
| 121 origin.CopyToString(&altsvc_origin_); | 121 origin.CopyToString(&altsvc_origin_); |
| 122 altsvc_vector_ = altsvc_vector; | 122 altsvc_vector_ = altsvc_vector; |
| 123 } | 123 } |
| 124 | 124 |
| 125 bool OnUnknownFrame(SpdyStreamId stream_id, uint8_t frame_type) override { | 125 bool OnUnknownFrame(SpdyStreamId stream_id, uint8_t frame_type) override { |
| 126 return true; | 126 return true; |
| 127 } | 127 } |
| 128 | 128 |
| 129 // Convenience function which runs a framer simulation with particular input. | 129 // Convenience function which runs a framer simulation with particular input. |
| 130 void SimulateInFramer(const unsigned char* input, size_t size) { | 130 void SimulateInFramer(const SpdySerializedFrame& frame) { |
|
Maks Orlovich
2017/02/07 18:59:48
This could/should arguably be a separate cleanup C
Bence
2017/02/07 20:01:17
I really do not mind doing multiple things in the
| |
| 131 const char* input_ptr = frame.data(); | |
| 132 size_t size = frame.size(); | |
|
Bence
2017/02/07 20:01:17
No need for named variable |size| which is only us
Maks Orlovich
2017/02/07 20:40:38
Done.
| |
| 131 buffered_spdy_framer_.set_visitor(this); | 133 buffered_spdy_framer_.set_visitor(this); |
| 132 size_t input_remaining = size; | 134 size_t input_remaining = size; |
| 133 const char* input_ptr = reinterpret_cast<const char*>(input); | |
| 134 while (input_remaining > 0 && | 135 while (input_remaining > 0 && |
| 135 buffered_spdy_framer_.spdy_framer_error() == | 136 buffered_spdy_framer_.spdy_framer_error() == |
| 136 SpdyFramer::SPDY_NO_ERROR) { | 137 SpdyFramer::SPDY_NO_ERROR) { |
| 137 // To make the tests more interesting, we feed random (amd small) chunks | 138 // To make the tests more interesting, we feed random (amd small) chunks |
| 138 // into the framer. This simulates getting strange-sized reads from | 139 // into the framer. This simulates getting strange-sized reads from |
| 139 // the socket. | 140 // the socket. |
| 140 const size_t kMaxReadSize = 32; | 141 const size_t kMaxReadSize = 32; |
| 141 size_t bytes_read = | 142 size_t bytes_read = |
| 142 (rand() % std::min(input_remaining, kMaxReadSize)) + 1; | 143 (rand() % std::min(input_remaining, kMaxReadSize)) + 1; |
| 143 size_t bytes_processed = | 144 size_t bytes_processed = |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 180 class BufferedSpdyFramerTest : public PlatformTest {}; | 181 class BufferedSpdyFramerTest : public PlatformTest {}; |
| 181 | 182 |
| 182 TEST_F(BufferedSpdyFramerTest, OnSetting) { | 183 TEST_F(BufferedSpdyFramerTest, OnSetting) { |
| 183 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); | 184 SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); |
| 184 SpdySettingsIR settings_ir; | 185 SpdySettingsIR settings_ir; |
| 185 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 2); | 186 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, 2); |
| 186 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 3); | 187 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, 3); |
| 187 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); | 188 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); |
| 188 TestBufferedSpdyVisitor visitor; | 189 TestBufferedSpdyVisitor visitor; |
| 189 | 190 |
| 190 visitor.SimulateInFramer( | 191 visitor.SimulateInFramer(control_frame); |
| 191 reinterpret_cast<unsigned char*>(control_frame.data()), | |
| 192 control_frame.size()); | |
| 193 EXPECT_EQ(0, visitor.error_count_); | 192 EXPECT_EQ(0, visitor.error_count_); |
| 194 EXPECT_EQ(2, visitor.setting_count_); | 193 EXPECT_EQ(2, visitor.setting_count_); |
| 195 } | 194 } |
| 196 | 195 |
| 197 TEST_F(BufferedSpdyFramerTest, HeaderListTooLarge) { | 196 TEST_F(BufferedSpdyFramerTest, HeaderListTooLarge) { |
| 198 SpdyHeaderBlock headers; | 197 SpdyHeaderBlock headers; |
| 199 std::string long_header_value(256 * 1024, 'x'); | 198 std::string long_header_value(256 * 1024, 'x'); |
| 200 headers["foo"] = long_header_value; | 199 headers["foo"] = long_header_value; |
| 201 BufferedSpdyFramer framer; | 200 BufferedSpdyFramer framer; |
| 202 std::unique_ptr<SpdySerializedFrame> control_frame( | 201 std::unique_ptr<SpdySerializedFrame> control_frame( |
| 203 framer.CreateHeaders(1, // stream_id | 202 framer.CreateHeaders(1, // stream_id |
| 204 CONTROL_FLAG_NONE, | 203 CONTROL_FLAG_NONE, |
| 205 255, // weight | 204 255, // weight |
| 206 std::move(headers))); | 205 std::move(headers))); |
| 207 EXPECT_TRUE(control_frame); | 206 EXPECT_TRUE(control_frame); |
| 208 | 207 |
| 209 TestBufferedSpdyVisitor visitor; | 208 TestBufferedSpdyVisitor visitor; |
| 210 visitor.SimulateInFramer( | 209 visitor.SimulateInFramer(*control_frame); |
| 211 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | |
| 212 control_frame.get()->size()); | |
| 213 | 210 |
| 214 EXPECT_EQ(1, visitor.error_count_); | 211 EXPECT_EQ(1, visitor.error_count_); |
| 215 EXPECT_EQ(0, visitor.headers_frame_count_); | 212 EXPECT_EQ(0, visitor.headers_frame_count_); |
| 216 EXPECT_EQ(0, visitor.push_promise_frame_count_); | 213 EXPECT_EQ(0, visitor.push_promise_frame_count_); |
| 217 EXPECT_EQ(SpdyHeaderBlock(), visitor.headers_); | 214 EXPECT_EQ(SpdyHeaderBlock(), visitor.headers_); |
| 218 } | 215 } |
| 219 | 216 |
| 217 TEST_F(BufferedSpdyFramerTest, ValidHeadersAfterInvalidHeaders) { | |
| 218 SpdyHeaderBlock headers; | |
| 219 headers["invalid"] = "\r\n\r\n"; | |
| 220 | |
| 221 SpdyHeaderBlock headers2; | |
| 222 headers["alpha"] = "beta"; | |
| 223 | |
| 224 SpdyTestUtil spdy_test_util; | |
| 225 SpdySerializedFrame headers_frame( | |
| 226 spdy_test_util.ConstructSpdyReply(1, std::move(headers))); | |
| 227 SpdySerializedFrame headers_frame2( | |
| 228 spdy_test_util.ConstructSpdyReply(2, std::move(headers2))); | |
| 229 | |
| 230 TestBufferedSpdyVisitor visitor; | |
| 231 visitor.SimulateInFramer(headers_frame); | |
| 232 EXPECT_EQ(1, visitor.error_count_); | |
| 233 EXPECT_EQ(0, visitor.headers_frame_count_); | |
| 234 | |
| 235 visitor.SimulateInFramer(headers_frame2); | |
| 236 EXPECT_EQ(1, visitor.error_count_); | |
| 237 EXPECT_EQ(1, visitor.headers_frame_count_); | |
| 238 } | |
| 239 | |
| 220 TEST_F(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { | 240 TEST_F(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { |
| 221 SpdyHeaderBlock headers; | 241 SpdyHeaderBlock headers; |
| 222 headers["alpha"] = "beta"; | 242 headers["alpha"] = "beta"; |
| 223 headers["gamma"] = "delta"; | 243 headers["gamma"] = "delta"; |
| 224 BufferedSpdyFramer framer; | 244 BufferedSpdyFramer framer; |
| 225 std::unique_ptr<SpdySerializedFrame> control_frame( | 245 std::unique_ptr<SpdySerializedFrame> control_frame( |
| 226 framer.CreateHeaders(1, // stream_id | 246 framer.CreateHeaders(1, // stream_id |
| 227 CONTROL_FLAG_NONE, | 247 CONTROL_FLAG_NONE, |
| 228 255, // weight | 248 255, // weight |
| 229 headers.Clone())); | 249 headers.Clone())); |
| 230 EXPECT_TRUE(control_frame.get() != NULL); | 250 EXPECT_TRUE(control_frame.get() != NULL); |
| 231 | 251 |
| 232 TestBufferedSpdyVisitor visitor; | 252 TestBufferedSpdyVisitor visitor; |
| 233 visitor.SimulateInFramer( | 253 visitor.SimulateInFramer(*control_frame); |
| 234 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | |
| 235 control_frame.get()->size()); | |
| 236 EXPECT_EQ(0, visitor.error_count_); | 254 EXPECT_EQ(0, visitor.error_count_); |
| 237 EXPECT_EQ(1, visitor.headers_frame_count_); | 255 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 238 EXPECT_EQ(0, visitor.push_promise_frame_count_); | 256 EXPECT_EQ(0, visitor.push_promise_frame_count_); |
| 239 EXPECT_EQ(headers, visitor.headers_); | 257 EXPECT_EQ(headers, visitor.headers_); |
| 240 } | 258 } |
| 241 | 259 |
| 242 TEST_F(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) { | 260 TEST_F(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) { |
| 243 SpdyHeaderBlock headers; | 261 SpdyHeaderBlock headers; |
| 244 headers["alpha"] = "beta"; | 262 headers["alpha"] = "beta"; |
| 245 headers["gamma"] = "delta"; | 263 headers["gamma"] = "delta"; |
| 246 BufferedSpdyFramer framer; | 264 BufferedSpdyFramer framer; |
| 247 std::unique_ptr<SpdySerializedFrame> control_frame( | 265 std::unique_ptr<SpdySerializedFrame> control_frame( |
| 248 framer.CreatePushPromise(1, 2, headers.Clone())); | 266 framer.CreatePushPromise(1, 2, headers.Clone())); |
| 249 EXPECT_TRUE(control_frame.get() != NULL); | 267 EXPECT_TRUE(control_frame.get() != NULL); |
| 250 | 268 |
| 251 TestBufferedSpdyVisitor visitor; | 269 TestBufferedSpdyVisitor visitor; |
| 252 visitor.SimulateInFramer( | 270 visitor.SimulateInFramer(*control_frame); |
| 253 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | |
| 254 control_frame.get()->size()); | |
| 255 EXPECT_EQ(0, visitor.error_count_); | 271 EXPECT_EQ(0, visitor.error_count_); |
| 256 EXPECT_EQ(0, visitor.headers_frame_count_); | 272 EXPECT_EQ(0, visitor.headers_frame_count_); |
| 257 EXPECT_EQ(1, visitor.push_promise_frame_count_); | 273 EXPECT_EQ(1, visitor.push_promise_frame_count_); |
| 258 EXPECT_EQ(headers, visitor.headers_); | 274 EXPECT_EQ(headers, visitor.headers_); |
| 259 EXPECT_EQ(1u, visitor.header_stream_id_); | 275 EXPECT_EQ(1u, visitor.header_stream_id_); |
| 260 EXPECT_EQ(2u, visitor.promised_stream_id_); | 276 EXPECT_EQ(2u, visitor.promised_stream_id_); |
| 261 } | 277 } |
| 262 | 278 |
| 263 TEST_F(BufferedSpdyFramerTest, GoAwayDebugData) { | 279 TEST_F(BufferedSpdyFramerTest, GoAwayDebugData) { |
| 264 BufferedSpdyFramer framer; | 280 BufferedSpdyFramer framer; |
| 265 std::unique_ptr<SpdySerializedFrame> goaway_frame( | 281 std::unique_ptr<SpdySerializedFrame> goaway_frame( |
| 266 framer.CreateGoAway(2u, ERROR_CODE_FRAME_SIZE_ERROR, "foo")); | 282 framer.CreateGoAway(2u, ERROR_CODE_FRAME_SIZE_ERROR, "foo")); |
| 267 | 283 |
| 268 TestBufferedSpdyVisitor visitor; | 284 TestBufferedSpdyVisitor visitor; |
| 269 visitor.SimulateInFramer( | 285 visitor.SimulateInFramer(*goaway_frame); |
| 270 reinterpret_cast<unsigned char*>(goaway_frame.get()->data()), | |
| 271 goaway_frame.get()->size()); | |
| 272 EXPECT_EQ(0, visitor.error_count_); | 286 EXPECT_EQ(0, visitor.error_count_); |
| 273 EXPECT_EQ(1, visitor.goaway_count_); | 287 EXPECT_EQ(1, visitor.goaway_count_); |
| 274 EXPECT_EQ(2u, visitor.goaway_last_accepted_stream_id_); | 288 EXPECT_EQ(2u, visitor.goaway_last_accepted_stream_id_); |
| 275 EXPECT_EQ(ERROR_CODE_FRAME_SIZE_ERROR, visitor.goaway_error_code_); | 289 EXPECT_EQ(ERROR_CODE_FRAME_SIZE_ERROR, visitor.goaway_error_code_); |
| 276 EXPECT_EQ("foo", visitor.goaway_debug_data_); | 290 EXPECT_EQ("foo", visitor.goaway_debug_data_); |
| 277 } | 291 } |
| 278 | 292 |
| 279 TEST_F(BufferedSpdyFramerTest, OnAltSvc) { | 293 TEST_F(BufferedSpdyFramerTest, OnAltSvc) { |
| 280 const SpdyStreamId altsvc_stream_id(1); | 294 const SpdyStreamId altsvc_stream_id(1); |
| 281 const char altsvc_origin[] = "https://www.example.org"; | 295 const char altsvc_origin[] = "https://www.example.org"; |
| 282 SpdyAltSvcIR altsvc_ir(altsvc_stream_id); | 296 SpdyAltSvcIR altsvc_ir(altsvc_stream_id); |
| 283 SpdyAltSvcWireFormat::AlternativeService alternative_service( | 297 SpdyAltSvcWireFormat::AlternativeService alternative_service( |
| 284 "quic", "alternative.example.org", 443, 86400, | 298 "quic", "alternative.example.org", 443, 86400, |
| 285 SpdyAltSvcWireFormat::VersionVector()); | 299 SpdyAltSvcWireFormat::VersionVector()); |
| 286 altsvc_ir.add_altsvc(alternative_service); | 300 altsvc_ir.add_altsvc(alternative_service); |
| 287 altsvc_ir.set_origin(altsvc_origin); | 301 altsvc_ir.set_origin(altsvc_origin); |
| 288 BufferedSpdyFramer framer; | 302 BufferedSpdyFramer framer; |
| 289 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir)); | 303 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir)); |
| 290 | 304 |
| 291 TestBufferedSpdyVisitor visitor; | 305 TestBufferedSpdyVisitor visitor; |
| 292 visitor.SimulateInFramer( | 306 visitor.SimulateInFramer(altsvc_frame); |
| 293 reinterpret_cast<unsigned char*>(altsvc_frame.data()), | |
| 294 altsvc_frame.size()); | |
| 295 EXPECT_EQ(0, visitor.error_count_); | 307 EXPECT_EQ(0, visitor.error_count_); |
| 296 EXPECT_EQ(1, visitor.altsvc_count_); | 308 EXPECT_EQ(1, visitor.altsvc_count_); |
| 297 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_); | 309 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_); |
| 298 EXPECT_EQ(altsvc_origin, visitor.altsvc_origin_); | 310 EXPECT_EQ(altsvc_origin, visitor.altsvc_origin_); |
| 299 ASSERT_EQ(1u, visitor.altsvc_vector_.size()); | 311 ASSERT_EQ(1u, visitor.altsvc_vector_.size()); |
| 300 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]); | 312 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]); |
| 301 } | 313 } |
| 302 | 314 |
| 303 } // namespace net | 315 } // namespace net |
| OLD | NEW |