| 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/chromium/buffered_spdy_framer.h" | 5 #include "net/spdy/chromium/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" |
| 11 #include "net/log/net_log_with_source.h" |
| 11 #include "net/spdy/chromium/spdy_test_util_common.h" | 12 #include "net/spdy/chromium/spdy_test_util_common.h" |
| 12 #include "testing/platform_test.h" | 13 #include "testing/platform_test.h" |
| 13 | 14 |
| 14 namespace net { | 15 namespace net { |
| 15 | 16 |
| 16 namespace { | 17 namespace { |
| 17 | 18 |
| 18 class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { | 19 class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { |
| 19 public: | 20 public: |
| 20 TestBufferedSpdyVisitor() | 21 TestBufferedSpdyVisitor() |
| 21 : buffered_spdy_framer_(), | 22 : buffered_spdy_framer_(NetLogWithSource()), |
| 22 error_count_(0), | 23 error_count_(0), |
| 23 setting_count_(0), | 24 setting_count_(0), |
| 24 headers_frame_count_(0), | 25 headers_frame_count_(0), |
| 25 push_promise_frame_count_(0), | 26 push_promise_frame_count_(0), |
| 26 goaway_count_(0), | 27 goaway_count_(0), |
| 27 altsvc_count_(0), | 28 altsvc_count_(0), |
| 28 header_stream_id_(static_cast<SpdyStreamId>(-1)), | 29 header_stream_id_(static_cast<SpdyStreamId>(-1)), |
| 29 promised_stream_id_(static_cast<SpdyStreamId>(-1)) {} | 30 promised_stream_id_(static_cast<SpdyStreamId>(-1)) {} |
| 30 | 31 |
| 31 void OnError(SpdyFramer::SpdyFramerError spdy_framer_error) override { | 32 void OnError(SpdyFramer::SpdyFramerError spdy_framer_error) override { |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 EXPECT_EQ(0, visitor.error_count_); | 192 EXPECT_EQ(0, visitor.error_count_); |
| 192 EXPECT_EQ(2, visitor.setting_count_); | 193 EXPECT_EQ(2, visitor.setting_count_); |
| 193 } | 194 } |
| 194 | 195 |
| 195 TEST_F(BufferedSpdyFramerTest, HeaderListTooLarge) { | 196 TEST_F(BufferedSpdyFramerTest, HeaderListTooLarge) { |
| 196 SpdyHeaderBlock headers; | 197 SpdyHeaderBlock headers; |
| 197 SpdyString long_header_value(256 * 1024, 'x'); | 198 SpdyString long_header_value(256 * 1024, 'x'); |
| 198 headers["foo"] = long_header_value; | 199 headers["foo"] = long_header_value; |
| 199 SpdyHeadersIR headers_ir(/*stream_id=*/1, std::move(headers)); | 200 SpdyHeadersIR headers_ir(/*stream_id=*/1, std::move(headers)); |
| 200 | 201 |
| 201 BufferedSpdyFramer framer; | 202 NetLogWithSource net_log; |
| 203 BufferedSpdyFramer framer(net_log); |
| 202 SpdySerializedFrame control_frame = framer.SerializeFrame(headers_ir); | 204 SpdySerializedFrame control_frame = framer.SerializeFrame(headers_ir); |
| 203 | 205 |
| 204 TestBufferedSpdyVisitor visitor; | 206 TestBufferedSpdyVisitor visitor; |
| 205 visitor.SimulateInFramer(control_frame); | 207 visitor.SimulateInFramer(control_frame); |
| 206 | 208 |
| 207 EXPECT_EQ(1, visitor.error_count_); | 209 EXPECT_EQ(1, visitor.error_count_); |
| 208 EXPECT_EQ(0, visitor.headers_frame_count_); | 210 EXPECT_EQ(0, visitor.headers_frame_count_); |
| 209 EXPECT_EQ(0, visitor.push_promise_frame_count_); | 211 EXPECT_EQ(0, visitor.push_promise_frame_count_); |
| 210 EXPECT_EQ(SpdyHeaderBlock(), visitor.headers_); | 212 EXPECT_EQ(SpdyHeaderBlock(), visitor.headers_); |
| 211 } | 213 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 232 EXPECT_EQ(1, visitor.error_count_); | 234 EXPECT_EQ(1, visitor.error_count_); |
| 233 EXPECT_EQ(1, visitor.headers_frame_count_); | 235 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 234 } | 236 } |
| 235 | 237 |
| 236 TEST_F(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { | 238 TEST_F(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { |
| 237 SpdyHeaderBlock headers; | 239 SpdyHeaderBlock headers; |
| 238 headers["alpha"] = "beta"; | 240 headers["alpha"] = "beta"; |
| 239 headers["gamma"] = "delta"; | 241 headers["gamma"] = "delta"; |
| 240 SpdyHeadersIR headers_ir(/*stream_id=*/1, headers.Clone()); | 242 SpdyHeadersIR headers_ir(/*stream_id=*/1, headers.Clone()); |
| 241 | 243 |
| 242 BufferedSpdyFramer framer; | 244 NetLogWithSource net_log; |
| 245 BufferedSpdyFramer framer(net_log); |
| 243 SpdySerializedFrame control_frame = framer.SerializeFrame(headers_ir); | 246 SpdySerializedFrame control_frame = framer.SerializeFrame(headers_ir); |
| 244 | 247 |
| 245 TestBufferedSpdyVisitor visitor; | 248 TestBufferedSpdyVisitor visitor; |
| 246 visitor.SimulateInFramer(control_frame); | 249 visitor.SimulateInFramer(control_frame); |
| 247 EXPECT_EQ(0, visitor.error_count_); | 250 EXPECT_EQ(0, visitor.error_count_); |
| 248 EXPECT_EQ(1, visitor.headers_frame_count_); | 251 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 249 EXPECT_EQ(0, visitor.push_promise_frame_count_); | 252 EXPECT_EQ(0, visitor.push_promise_frame_count_); |
| 250 EXPECT_EQ(headers, visitor.headers_); | 253 EXPECT_EQ(headers, visitor.headers_); |
| 251 } | 254 } |
| 252 | 255 |
| 253 TEST_F(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) { | 256 TEST_F(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) { |
| 254 SpdyHeaderBlock headers; | 257 SpdyHeaderBlock headers; |
| 255 headers["alpha"] = "beta"; | 258 headers["alpha"] = "beta"; |
| 256 headers["gamma"] = "delta"; | 259 headers["gamma"] = "delta"; |
| 257 BufferedSpdyFramer framer; | 260 NetLogWithSource net_log; |
| 261 BufferedSpdyFramer framer(net_log); |
| 258 SpdyPushPromiseIR push_promise_ir(/*stream_id=*/1, /*promised_stream_id=*/2, | 262 SpdyPushPromiseIR push_promise_ir(/*stream_id=*/1, /*promised_stream_id=*/2, |
| 259 headers.Clone()); | 263 headers.Clone()); |
| 260 SpdySerializedFrame control_frame = framer.SerializeFrame(push_promise_ir); | 264 SpdySerializedFrame control_frame = framer.SerializeFrame(push_promise_ir); |
| 261 | 265 |
| 262 TestBufferedSpdyVisitor visitor; | 266 TestBufferedSpdyVisitor visitor; |
| 263 visitor.SimulateInFramer(control_frame); | 267 visitor.SimulateInFramer(control_frame); |
| 264 EXPECT_EQ(0, visitor.error_count_); | 268 EXPECT_EQ(0, visitor.error_count_); |
| 265 EXPECT_EQ(0, visitor.headers_frame_count_); | 269 EXPECT_EQ(0, visitor.headers_frame_count_); |
| 266 EXPECT_EQ(1, visitor.push_promise_frame_count_); | 270 EXPECT_EQ(1, visitor.push_promise_frame_count_); |
| 267 EXPECT_EQ(headers, visitor.headers_); | 271 EXPECT_EQ(headers, visitor.headers_); |
| 268 EXPECT_EQ(1u, visitor.header_stream_id_); | 272 EXPECT_EQ(1u, visitor.header_stream_id_); |
| 269 EXPECT_EQ(2u, visitor.promised_stream_id_); | 273 EXPECT_EQ(2u, visitor.promised_stream_id_); |
| 270 } | 274 } |
| 271 | 275 |
| 272 TEST_F(BufferedSpdyFramerTest, GoAwayDebugData) { | 276 TEST_F(BufferedSpdyFramerTest, GoAwayDebugData) { |
| 273 SpdyGoAwayIR go_ir(/*last_accepted_stream_id=*/2, ERROR_CODE_FRAME_SIZE_ERROR, | 277 SpdyGoAwayIR go_ir(/*last_accepted_stream_id=*/2, ERROR_CODE_FRAME_SIZE_ERROR, |
| 274 "foo"); | 278 "foo"); |
| 275 BufferedSpdyFramer framer; | 279 NetLogWithSource net_log; |
| 280 BufferedSpdyFramer framer(net_log); |
| 276 SpdySerializedFrame goaway_frame = framer.SerializeFrame(go_ir); | 281 SpdySerializedFrame goaway_frame = framer.SerializeFrame(go_ir); |
| 277 | 282 |
| 278 TestBufferedSpdyVisitor visitor; | 283 TestBufferedSpdyVisitor visitor; |
| 279 visitor.SimulateInFramer(goaway_frame); | 284 visitor.SimulateInFramer(goaway_frame); |
| 280 EXPECT_EQ(0, visitor.error_count_); | 285 EXPECT_EQ(0, visitor.error_count_); |
| 281 EXPECT_EQ(1, visitor.goaway_count_); | 286 EXPECT_EQ(1, visitor.goaway_count_); |
| 282 EXPECT_EQ(2u, visitor.goaway_last_accepted_stream_id_); | 287 EXPECT_EQ(2u, visitor.goaway_last_accepted_stream_id_); |
| 283 EXPECT_EQ(ERROR_CODE_FRAME_SIZE_ERROR, visitor.goaway_error_code_); | 288 EXPECT_EQ(ERROR_CODE_FRAME_SIZE_ERROR, visitor.goaway_error_code_); |
| 284 EXPECT_EQ("foo", visitor.goaway_debug_data_); | 289 EXPECT_EQ("foo", visitor.goaway_debug_data_); |
| 285 } | 290 } |
| 286 | 291 |
| 287 // ALTSVC frame on stream 0 must have an origin. | 292 // ALTSVC frame on stream 0 must have an origin. |
| 288 TEST_F(BufferedSpdyFramerTest, OnAltSvcOnStreamZero) { | 293 TEST_F(BufferedSpdyFramerTest, OnAltSvcOnStreamZero) { |
| 289 const SpdyStreamId altsvc_stream_id(0); | 294 const SpdyStreamId altsvc_stream_id(0); |
| 290 SpdyAltSvcIR altsvc_ir(altsvc_stream_id); | 295 SpdyAltSvcIR altsvc_ir(altsvc_stream_id); |
| 291 SpdyAltSvcWireFormat::AlternativeService alternative_service( | 296 SpdyAltSvcWireFormat::AlternativeService alternative_service( |
| 292 "quic", "alternative.example.org", 443, 86400, | 297 "quic", "alternative.example.org", 443, 86400, |
| 293 SpdyAltSvcWireFormat::VersionVector()); | 298 SpdyAltSvcWireFormat::VersionVector()); |
| 294 altsvc_ir.add_altsvc(alternative_service); | 299 altsvc_ir.add_altsvc(alternative_service); |
| 295 const char altsvc_origin[] = "https://www.example.org"; | 300 const char altsvc_origin[] = "https://www.example.org"; |
| 296 altsvc_ir.set_origin(altsvc_origin); | 301 altsvc_ir.set_origin(altsvc_origin); |
| 297 BufferedSpdyFramer framer; | 302 NetLogWithSource net_log; |
| 303 BufferedSpdyFramer framer(net_log); |
| 298 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir)); | 304 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir)); |
| 299 | 305 |
| 300 TestBufferedSpdyVisitor visitor; | 306 TestBufferedSpdyVisitor visitor; |
| 301 visitor.SimulateInFramer(altsvc_frame); | 307 visitor.SimulateInFramer(altsvc_frame); |
| 302 EXPECT_EQ(0, visitor.error_count_); | 308 EXPECT_EQ(0, visitor.error_count_); |
| 303 EXPECT_EQ(1, visitor.altsvc_count_); | 309 EXPECT_EQ(1, visitor.altsvc_count_); |
| 304 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_); | 310 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_); |
| 305 EXPECT_EQ(altsvc_origin, visitor.altsvc_origin_); | 311 EXPECT_EQ(altsvc_origin, visitor.altsvc_origin_); |
| 306 ASSERT_EQ(1u, visitor.altsvc_vector_.size()); | 312 ASSERT_EQ(1u, visitor.altsvc_vector_.size()); |
| 307 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]); | 313 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]); |
| 308 } | 314 } |
| 309 | 315 |
| 310 // ALTSVC frame on a non-zero stream must not have an origin. | 316 // ALTSVC frame on a non-zero stream must not have an origin. |
| 311 TEST_F(BufferedSpdyFramerTest, OnAltSvcOnNonzeroStream) { | 317 TEST_F(BufferedSpdyFramerTest, OnAltSvcOnNonzeroStream) { |
| 312 const SpdyStreamId altsvc_stream_id(1); | 318 const SpdyStreamId altsvc_stream_id(1); |
| 313 SpdyAltSvcIR altsvc_ir(altsvc_stream_id); | 319 SpdyAltSvcIR altsvc_ir(altsvc_stream_id); |
| 314 SpdyAltSvcWireFormat::AlternativeService alternative_service( | 320 SpdyAltSvcWireFormat::AlternativeService alternative_service( |
| 315 "quic", "alternative.example.org", 443, 86400, | 321 "quic", "alternative.example.org", 443, 86400, |
| 316 SpdyAltSvcWireFormat::VersionVector()); | 322 SpdyAltSvcWireFormat::VersionVector()); |
| 317 altsvc_ir.add_altsvc(alternative_service); | 323 altsvc_ir.add_altsvc(alternative_service); |
| 318 BufferedSpdyFramer framer; | 324 NetLogWithSource net_log; |
| 325 BufferedSpdyFramer framer(net_log); |
| 319 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir)); | 326 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir)); |
| 320 | 327 |
| 321 TestBufferedSpdyVisitor visitor; | 328 TestBufferedSpdyVisitor visitor; |
| 322 visitor.SimulateInFramer(altsvc_frame); | 329 visitor.SimulateInFramer(altsvc_frame); |
| 323 EXPECT_EQ(0, visitor.error_count_); | 330 EXPECT_EQ(0, visitor.error_count_); |
| 324 EXPECT_EQ(1, visitor.altsvc_count_); | 331 EXPECT_EQ(1, visitor.altsvc_count_); |
| 325 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_); | 332 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_); |
| 326 EXPECT_TRUE(visitor.altsvc_origin_.empty()); | 333 EXPECT_TRUE(visitor.altsvc_origin_.empty()); |
| 327 ASSERT_EQ(1u, visitor.altsvc_vector_.size()); | 334 ASSERT_EQ(1u, visitor.altsvc_vector_.size()); |
| 328 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]); | 335 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]); |
| 329 } | 336 } |
| 330 | 337 |
| 331 } // namespace net | 338 } // namespace net |
| OLD | NEW |