| 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 <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "net/spdy/spdy_test_util_common.h" | 10 #include "net/spdy/spdy_test_util_common.h" |
| 11 #include "testing/platform_test.h" | 11 #include "testing/platform_test.h" |
| 12 | 12 |
| 13 namespace net { | 13 namespace net { |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { | 17 class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { |
| 18 public: | 18 public: |
| 19 explicit TestBufferedSpdyVisitor(SpdyMajorVersion spdy_version) | 19 explicit TestBufferedSpdyVisitor() |
| 20 : buffered_spdy_framer_(spdy_version), | 20 : buffered_spdy_framer_(HTTP2), |
| 21 error_count_(0), | 21 error_count_(0), |
| 22 setting_count_(0), | 22 setting_count_(0), |
| 23 syn_frame_count_(0), | 23 syn_frame_count_(0), |
| 24 syn_reply_frame_count_(0), | 24 syn_reply_frame_count_(0), |
| 25 headers_frame_count_(0), | 25 headers_frame_count_(0), |
| 26 push_promise_frame_count_(0), | 26 push_promise_frame_count_(0), |
| 27 goaway_count_(0), | 27 goaway_count_(0), |
| 28 altsvc_count_(0), | 28 altsvc_count_(0), |
| 29 header_stream_id_(static_cast<SpdyStreamId>(-1)), | 29 header_stream_id_(static_cast<SpdyStreamId>(-1)), |
| 30 promised_stream_id_(static_cast<SpdyStreamId>(-1)) {} | 30 promised_stream_id_(static_cast<SpdyStreamId>(-1)) {} |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 std::string goaway_debug_data_; | 195 std::string goaway_debug_data_; |
| 196 | 196 |
| 197 // OnAltSvc parameters. | 197 // OnAltSvc parameters. |
| 198 SpdyStreamId altsvc_stream_id_; | 198 SpdyStreamId altsvc_stream_id_; |
| 199 std::string altsvc_origin_; | 199 std::string altsvc_origin_; |
| 200 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector_; | 200 SpdyAltSvcWireFormat::AlternativeServiceVector altsvc_vector_; |
| 201 }; | 201 }; |
| 202 | 202 |
| 203 } // namespace | 203 } // namespace |
| 204 | 204 |
| 205 class BufferedSpdyFramerTest | 205 class BufferedSpdyFramerTest : public PlatformTest {}; |
| 206 : public PlatformTest, | |
| 207 public ::testing::WithParamInterface<NextProto> { | |
| 208 protected: | |
| 209 SpdyMajorVersion spdy_version() { | |
| 210 return NextProtoToSpdyMajorVersion(GetParam()); | |
| 211 } | |
| 212 }; | |
| 213 | 206 |
| 214 INSTANTIATE_TEST_CASE_P(NextProto, | 207 TEST_F(BufferedSpdyFramerTest, OnSetting) { |
| 215 BufferedSpdyFramerTest, | 208 SpdyFramer framer(HTTP2); |
| 216 testing::Values(kProtoSPDY31, | |
| 217 kProtoHTTP2)); | |
| 218 | |
| 219 TEST_P(BufferedSpdyFramerTest, OnSetting) { | |
| 220 SpdyFramer framer(spdy_version()); | |
| 221 SpdySettingsIR settings_ir; | 209 SpdySettingsIR settings_ir; |
| 222 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, false, false, 2); | 210 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, false, false, 2); |
| 223 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, false, false, 3); | 211 settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, false, false, 3); |
| 224 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); | 212 SpdySerializedFrame control_frame(framer.SerializeSettings(settings_ir)); |
| 225 TestBufferedSpdyVisitor visitor(spdy_version()); | 213 TestBufferedSpdyVisitor visitor; |
| 226 | 214 |
| 227 visitor.SimulateInFramer( | 215 visitor.SimulateInFramer( |
| 228 reinterpret_cast<unsigned char*>(control_frame.data()), | 216 reinterpret_cast<unsigned char*>(control_frame.data()), |
| 229 control_frame.size()); | 217 control_frame.size()); |
| 230 EXPECT_EQ(0, visitor.error_count_); | 218 EXPECT_EQ(0, visitor.error_count_); |
| 231 EXPECT_EQ(2, visitor.setting_count_); | 219 EXPECT_EQ(2, visitor.setting_count_); |
| 232 } | 220 } |
| 233 | 221 |
| 234 TEST_P(BufferedSpdyFramerTest, ReadSynStreamHeaderBlock) { | 222 TEST_F(BufferedSpdyFramerTest, HeaderListTooLarge) { |
| 235 if (spdy_version() > SPDY3) { | |
| 236 // SYN_STREAM not supported in SPDY>3. | |
| 237 return; | |
| 238 } | |
| 239 SpdyHeaderBlock headers; | |
| 240 headers["aa"] = "vv"; | |
| 241 headers["bb"] = "ww"; | |
| 242 BufferedSpdyFramer framer(spdy_version()); | |
| 243 std::unique_ptr<SpdySerializedFrame> control_frame( | |
| 244 framer.CreateSynStream(1, // stream_id | |
| 245 0, // associated_stream_id | |
| 246 1, // priority | |
| 247 CONTROL_FLAG_NONE, headers.Clone())); | |
| 248 EXPECT_TRUE(control_frame.get() != NULL); | |
| 249 | |
| 250 TestBufferedSpdyVisitor visitor(spdy_version()); | |
| 251 visitor.SimulateInFramer( | |
| 252 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | |
| 253 control_frame.get()->size()); | |
| 254 EXPECT_EQ(0, visitor.error_count_); | |
| 255 EXPECT_EQ(1, visitor.syn_frame_count_); | |
| 256 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | |
| 257 EXPECT_EQ(0, visitor.headers_frame_count_); | |
| 258 EXPECT_EQ(0, visitor.push_promise_frame_count_); | |
| 259 EXPECT_EQ(headers, visitor.headers_); | |
| 260 } | |
| 261 | |
| 262 TEST_P(BufferedSpdyFramerTest, HeaderListTooLarge) { | |
| 263 SpdyHeaderBlock headers; | 223 SpdyHeaderBlock headers; |
| 264 std::string long_header_value(256 * 1024, 'x'); | 224 std::string long_header_value(256 * 1024, 'x'); |
| 265 headers["foo"] = long_header_value; | 225 headers["foo"] = long_header_value; |
| 266 BufferedSpdyFramer framer(spdy_version()); | 226 BufferedSpdyFramer framer(HTTP2); |
| 267 std::unique_ptr<SpdySerializedFrame> control_frame( | 227 std::unique_ptr<SpdySerializedFrame> control_frame( |
| 268 framer.CreateHeaders(1, // stream_id | 228 framer.CreateHeaders(1, // stream_id |
| 269 CONTROL_FLAG_NONE, | 229 CONTROL_FLAG_NONE, |
| 270 255, // weight | 230 255, // weight |
| 271 std::move(headers))); | 231 std::move(headers))); |
| 272 EXPECT_TRUE(control_frame); | 232 EXPECT_TRUE(control_frame); |
| 273 | 233 |
| 274 TestBufferedSpdyVisitor visitor(spdy_version()); | 234 TestBufferedSpdyVisitor visitor; |
| 275 visitor.SimulateInFramer( | 235 visitor.SimulateInFramer( |
| 276 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | 236 reinterpret_cast<unsigned char*>(control_frame.get()->data()), |
| 277 control_frame.get()->size()); | 237 control_frame.get()->size()); |
| 278 | 238 |
| 279 EXPECT_EQ(1, visitor.error_count_); | 239 EXPECT_EQ(1, visitor.error_count_); |
| 280 EXPECT_EQ(0, visitor.syn_frame_count_); | 240 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 281 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 241 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 282 EXPECT_EQ(0, visitor.headers_frame_count_); | 242 EXPECT_EQ(0, visitor.headers_frame_count_); |
| 283 EXPECT_EQ(0, visitor.push_promise_frame_count_); | 243 EXPECT_EQ(0, visitor.push_promise_frame_count_); |
| 284 EXPECT_EQ(SpdyHeaderBlock(), visitor.headers_); | 244 EXPECT_EQ(SpdyHeaderBlock(), visitor.headers_); |
| 285 } | 245 } |
| 286 | 246 |
| 287 TEST_P(BufferedSpdyFramerTest, ReadSynReplyHeaderBlock) { | 247 TEST_F(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { |
| 288 if (spdy_version() > SPDY3) { | |
| 289 // SYN_REPLY not supported in SPDY>3. | |
| 290 return; | |
| 291 } | |
| 292 SpdyHeaderBlock headers; | 248 SpdyHeaderBlock headers; |
| 293 headers["alpha"] = "beta"; | 249 headers["alpha"] = "beta"; |
| 294 headers["gamma"] = "delta"; | 250 headers["gamma"] = "delta"; |
| 295 BufferedSpdyFramer framer(spdy_version()); | 251 BufferedSpdyFramer framer(HTTP2); |
| 296 std::unique_ptr<SpdySerializedFrame> control_frame( | |
| 297 framer.CreateSynReply(1, // stream_id | |
| 298 CONTROL_FLAG_NONE, headers.Clone())); | |
| 299 EXPECT_TRUE(control_frame.get() != NULL); | |
| 300 | |
| 301 TestBufferedSpdyVisitor visitor(spdy_version()); | |
| 302 visitor.SimulateInFramer( | |
| 303 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | |
| 304 control_frame.get()->size()); | |
| 305 EXPECT_EQ(0, visitor.error_count_); | |
| 306 EXPECT_EQ(0, visitor.syn_frame_count_); | |
| 307 EXPECT_EQ(0, visitor.push_promise_frame_count_); | |
| 308 if (spdy_version() < HTTP2) { | |
| 309 EXPECT_EQ(1, visitor.syn_reply_frame_count_); | |
| 310 EXPECT_EQ(0, visitor.headers_frame_count_); | |
| 311 } else { | |
| 312 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | |
| 313 EXPECT_EQ(1, visitor.headers_frame_count_); | |
| 314 } | |
| 315 EXPECT_EQ(headers, visitor.headers_); | |
| 316 } | |
| 317 | |
| 318 TEST_P(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { | |
| 319 SpdyHeaderBlock headers; | |
| 320 headers["alpha"] = "beta"; | |
| 321 headers["gamma"] = "delta"; | |
| 322 BufferedSpdyFramer framer(spdy_version()); | |
| 323 std::unique_ptr<SpdySerializedFrame> control_frame( | 252 std::unique_ptr<SpdySerializedFrame> control_frame( |
| 324 framer.CreateHeaders(1, // stream_id | 253 framer.CreateHeaders(1, // stream_id |
| 325 CONTROL_FLAG_NONE, | 254 CONTROL_FLAG_NONE, |
| 326 255, // weight | 255 255, // weight |
| 327 headers.Clone())); | 256 headers.Clone())); |
| 328 EXPECT_TRUE(control_frame.get() != NULL); | 257 EXPECT_TRUE(control_frame.get() != NULL); |
| 329 | 258 |
| 330 TestBufferedSpdyVisitor visitor(spdy_version()); | 259 TestBufferedSpdyVisitor visitor; |
| 331 visitor.SimulateInFramer( | 260 visitor.SimulateInFramer( |
| 332 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | 261 reinterpret_cast<unsigned char*>(control_frame.get()->data()), |
| 333 control_frame.get()->size()); | 262 control_frame.get()->size()); |
| 334 EXPECT_EQ(0, visitor.error_count_); | 263 EXPECT_EQ(0, visitor.error_count_); |
| 335 EXPECT_EQ(0, visitor.syn_frame_count_); | 264 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 336 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 265 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 337 EXPECT_EQ(1, visitor.headers_frame_count_); | 266 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 338 EXPECT_EQ(0, visitor.push_promise_frame_count_); | 267 EXPECT_EQ(0, visitor.push_promise_frame_count_); |
| 339 EXPECT_EQ(headers, visitor.headers_); | 268 EXPECT_EQ(headers, visitor.headers_); |
| 340 } | 269 } |
| 341 | 270 |
| 342 TEST_P(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) { | 271 TEST_F(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) { |
| 343 if (spdy_version() < HTTP2) | |
| 344 return; | |
| 345 SpdyHeaderBlock headers; | 272 SpdyHeaderBlock headers; |
| 346 headers["alpha"] = "beta"; | 273 headers["alpha"] = "beta"; |
| 347 headers["gamma"] = "delta"; | 274 headers["gamma"] = "delta"; |
| 348 BufferedSpdyFramer framer(spdy_version()); | 275 BufferedSpdyFramer framer(HTTP2); |
| 349 std::unique_ptr<SpdySerializedFrame> control_frame( | 276 std::unique_ptr<SpdySerializedFrame> control_frame( |
| 350 framer.CreatePushPromise(1, 2, headers.Clone())); | 277 framer.CreatePushPromise(1, 2, headers.Clone())); |
| 351 EXPECT_TRUE(control_frame.get() != NULL); | 278 EXPECT_TRUE(control_frame.get() != NULL); |
| 352 | 279 |
| 353 TestBufferedSpdyVisitor visitor(spdy_version()); | 280 TestBufferedSpdyVisitor visitor; |
| 354 visitor.SimulateInFramer( | 281 visitor.SimulateInFramer( |
| 355 reinterpret_cast<unsigned char*>(control_frame.get()->data()), | 282 reinterpret_cast<unsigned char*>(control_frame.get()->data()), |
| 356 control_frame.get()->size()); | 283 control_frame.get()->size()); |
| 357 EXPECT_EQ(0, visitor.error_count_); | 284 EXPECT_EQ(0, visitor.error_count_); |
| 358 EXPECT_EQ(0, visitor.syn_frame_count_); | 285 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 359 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 286 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 360 EXPECT_EQ(0, visitor.headers_frame_count_); | 287 EXPECT_EQ(0, visitor.headers_frame_count_); |
| 361 EXPECT_EQ(1, visitor.push_promise_frame_count_); | 288 EXPECT_EQ(1, visitor.push_promise_frame_count_); |
| 362 EXPECT_EQ(headers, visitor.headers_); | 289 EXPECT_EQ(headers, visitor.headers_); |
| 363 EXPECT_EQ(1u, visitor.header_stream_id_); | 290 EXPECT_EQ(1u, visitor.header_stream_id_); |
| 364 EXPECT_EQ(2u, visitor.promised_stream_id_); | 291 EXPECT_EQ(2u, visitor.promised_stream_id_); |
| 365 } | 292 } |
| 366 | 293 |
| 367 TEST_P(BufferedSpdyFramerTest, GoAwayDebugData) { | 294 TEST_F(BufferedSpdyFramerTest, GoAwayDebugData) { |
| 368 if (spdy_version() < HTTP2) | 295 BufferedSpdyFramer framer(HTTP2); |
| 369 return; | |
| 370 BufferedSpdyFramer framer(spdy_version()); | |
| 371 std::unique_ptr<SpdySerializedFrame> goaway_frame( | 296 std::unique_ptr<SpdySerializedFrame> goaway_frame( |
| 372 framer.CreateGoAway(2u, GOAWAY_FRAME_SIZE_ERROR, "foo")); | 297 framer.CreateGoAway(2u, GOAWAY_FRAME_SIZE_ERROR, "foo")); |
| 373 | 298 |
| 374 TestBufferedSpdyVisitor visitor(spdy_version()); | 299 TestBufferedSpdyVisitor visitor; |
| 375 visitor.SimulateInFramer( | 300 visitor.SimulateInFramer( |
| 376 reinterpret_cast<unsigned char*>(goaway_frame.get()->data()), | 301 reinterpret_cast<unsigned char*>(goaway_frame.get()->data()), |
| 377 goaway_frame.get()->size()); | 302 goaway_frame.get()->size()); |
| 378 EXPECT_EQ(0, visitor.error_count_); | 303 EXPECT_EQ(0, visitor.error_count_); |
| 379 EXPECT_EQ(1, visitor.goaway_count_); | 304 EXPECT_EQ(1, visitor.goaway_count_); |
| 380 EXPECT_EQ(2u, visitor.goaway_last_accepted_stream_id_); | 305 EXPECT_EQ(2u, visitor.goaway_last_accepted_stream_id_); |
| 381 EXPECT_EQ(GOAWAY_FRAME_SIZE_ERROR, visitor.goaway_status_); | 306 EXPECT_EQ(GOAWAY_FRAME_SIZE_ERROR, visitor.goaway_status_); |
| 382 EXPECT_EQ("foo", visitor.goaway_debug_data_); | 307 EXPECT_EQ("foo", visitor.goaway_debug_data_); |
| 383 } | 308 } |
| 384 | 309 |
| 385 TEST_P(BufferedSpdyFramerTest, OnAltSvc) { | 310 TEST_F(BufferedSpdyFramerTest, OnAltSvc) { |
| 386 if (spdy_version() < HTTP2) | |
| 387 return; | |
| 388 | |
| 389 const SpdyStreamId altsvc_stream_id(1); | 311 const SpdyStreamId altsvc_stream_id(1); |
| 390 const char altsvc_origin[] = "https://www.example.org"; | 312 const char altsvc_origin[] = "https://www.example.org"; |
| 391 SpdyAltSvcIR altsvc_ir(altsvc_stream_id); | 313 SpdyAltSvcIR altsvc_ir(altsvc_stream_id); |
| 392 SpdyAltSvcWireFormat::AlternativeService alternative_service( | 314 SpdyAltSvcWireFormat::AlternativeService alternative_service( |
| 393 "quic", "alternative.example.org", 443, 86400, | 315 "quic", "alternative.example.org", 443, 86400, |
| 394 SpdyAltSvcWireFormat::VersionVector()); | 316 SpdyAltSvcWireFormat::VersionVector()); |
| 395 altsvc_ir.add_altsvc(alternative_service); | 317 altsvc_ir.add_altsvc(alternative_service); |
| 396 altsvc_ir.set_origin(altsvc_origin); | 318 altsvc_ir.set_origin(altsvc_origin); |
| 397 BufferedSpdyFramer framer(spdy_version()); | 319 BufferedSpdyFramer framer(HTTP2); |
| 398 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir)); | 320 SpdySerializedFrame altsvc_frame(framer.SerializeFrame(altsvc_ir)); |
| 399 | 321 |
| 400 TestBufferedSpdyVisitor visitor(spdy_version()); | 322 TestBufferedSpdyVisitor visitor; |
| 401 visitor.SimulateInFramer( | 323 visitor.SimulateInFramer( |
| 402 reinterpret_cast<unsigned char*>(altsvc_frame.data()), | 324 reinterpret_cast<unsigned char*>(altsvc_frame.data()), |
| 403 altsvc_frame.size()); | 325 altsvc_frame.size()); |
| 404 EXPECT_EQ(0, visitor.error_count_); | 326 EXPECT_EQ(0, visitor.error_count_); |
| 405 EXPECT_EQ(1, visitor.altsvc_count_); | 327 EXPECT_EQ(1, visitor.altsvc_count_); |
| 406 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_); | 328 EXPECT_EQ(altsvc_stream_id, visitor.altsvc_stream_id_); |
| 407 EXPECT_EQ(altsvc_origin, visitor.altsvc_origin_); | 329 EXPECT_EQ(altsvc_origin, visitor.altsvc_origin_); |
| 408 ASSERT_EQ(1u, visitor.altsvc_vector_.size()); | 330 ASSERT_EQ(1u, visitor.altsvc_vector_.size()); |
| 409 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]); | 331 EXPECT_EQ(alternative_service, visitor.altsvc_vector_[0]); |
| 410 } | 332 } |
| 411 | 333 |
| 412 } // namespace net | 334 } // namespace net |
| OLD | NEW |