OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. Use |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // 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/spdy_network_transaction.h" | 5 #include "net/spdy/spdy_network_transaction.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/ref_counted.h" | 8 #include "base/ref_counted.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "net/base/completion_callback.h" | 10 #include "net/base/completion_callback.h" |
11 #include "net/base/mock_host_resolver.h" | 11 #include "net/base/mock_host_resolver.h" |
12 #include "net/base/net_log_unittest.h" | 12 #include "net/base/net_log_unittest.h" |
| 13 #include "net/base/request_priority.h" |
13 #include "net/base/ssl_config_service_defaults.h" | 14 #include "net/base/ssl_config_service_defaults.h" |
14 #include "net/base/test_completion_callback.h" | 15 #include "net/base/test_completion_callback.h" |
15 #include "net/base/upload_data.h" | 16 #include "net/base/upload_data.h" |
16 #include "net/http/http_auth_handler_factory.h" | 17 #include "net/http/http_auth_handler_factory.h" |
17 #include "net/http/http_network_session.h" | 18 #include "net/http/http_network_session.h" |
18 #include "net/http/http_transaction_unittest.h" | 19 #include "net/http/http_transaction_unittest.h" |
19 #include "net/proxy/proxy_config_service_fixed.h" | 20 #include "net/proxy/proxy_config_service_fixed.h" |
20 #include "net/socket/socket_test_util.h" | 21 #include "net/socket/socket_test_util.h" |
21 #include "net/spdy/spdy_framer.h" | 22 #include "net/spdy/spdy_framer.h" |
22 #include "net/spdy/spdy_http_stream.h" | 23 #include "net/spdy/spdy_http_stream.h" |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 // Verify HttpNetworkTransaction constructor. | 298 // Verify HttpNetworkTransaction constructor. |
298 TEST_F(SpdyNetworkTransactionTest, Constructor) { | 299 TEST_F(SpdyNetworkTransactionTest, Constructor) { |
299 SessionDependencies session_deps; | 300 SessionDependencies session_deps; |
300 scoped_refptr<HttpNetworkSession> session = | 301 scoped_refptr<HttpNetworkSession> session = |
301 CreateSession(&session_deps); | 302 CreateSession(&session_deps); |
302 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); | 303 scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session)); |
303 } | 304 } |
304 | 305 |
305 TEST_F(SpdyNetworkTransactionTest, Get) { | 306 TEST_F(SpdyNetworkTransactionTest, Get) { |
306 // Construct the request. | 307 // Construct the request. |
307 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 308 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
308 MockWrite writes[] = { CreateMockWrite(*req) }; | 309 MockWrite writes[] = { CreateMockWrite(*req) }; |
309 | 310 |
310 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 311 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
311 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 312 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
312 MockRead reads[] = { | 313 MockRead reads[] = { |
313 CreateMockRead(*resp), | 314 CreateMockRead(*resp), |
314 CreateMockRead(*body), | 315 CreateMockRead(*body), |
315 MockRead(true, 0, 0) // EOF | 316 MockRead(true, 0, 0) // EOF |
316 }; | 317 }; |
317 | 318 |
318 scoped_refptr<DelayedSocketData> data( | 319 scoped_refptr<DelayedSocketData> data( |
319 new DelayedSocketData(1, reads, arraysize(reads), | 320 new DelayedSocketData(1, reads, arraysize(reads), |
320 writes, arraysize(writes))); | 321 writes, arraysize(writes))); |
321 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 322 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
322 BoundNetLog()); | 323 BoundNetLog()); |
323 helper.RunToCompletion(data.get()); | 324 helper.RunToCompletion(data.get()); |
324 TransactionHelperResult out = helper.output(); | 325 TransactionHelperResult out = helper.output(); |
325 EXPECT_EQ(OK, out.rv); | 326 EXPECT_EQ(OK, out.rv); |
326 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 327 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
327 EXPECT_EQ("hello!", out.response_data); | 328 EXPECT_EQ("hello!", out.response_data); |
328 } | 329 } |
329 | 330 |
| 331 // Start three gets simultaniously; making sure that multiplexed |
| 332 // streams work properly. |
| 333 |
| 334 // This can't use the TransactionHelper method, since it only |
| 335 // handles a single transaction, and finishes them as soon |
| 336 // as it launches them. |
| 337 |
| 338 // TODO(gavinp): create a working generalized TransactionHelper that |
| 339 // can allow multiple streams in flight. |
| 340 |
| 341 TEST_F(SpdyNetworkTransactionTest, ThreeGets) { |
| 342 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 343 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 344 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, false)); |
| 345 scoped_ptr<spdy::SpdyFrame> fbody(ConstructSpdyBodyFrame(1, true)); |
| 346 |
| 347 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST)); |
| 348 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3)); |
| 349 scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(3, false)); |
| 350 scoped_ptr<spdy::SpdyFrame> fbody2(ConstructSpdyBodyFrame(3, true)); |
| 351 |
| 352 scoped_ptr<spdy::SpdyFrame> req3(ConstructSpdyGet(NULL, 0, false, 5, LOWEST)); |
| 353 scoped_ptr<spdy::SpdyFrame> resp3(ConstructSpdyGetSynReply(NULL, 0, 5)); |
| 354 scoped_ptr<spdy::SpdyFrame> body3(ConstructSpdyBodyFrame(5, false)); |
| 355 scoped_ptr<spdy::SpdyFrame> fbody3(ConstructSpdyBodyFrame(5, true)); |
| 356 |
| 357 MockWrite writes[] = { CreateMockWrite(*req), |
| 358 CreateMockWrite(*req2), |
| 359 CreateMockWrite(*req3), |
| 360 }; |
| 361 MockRead reads[] = { |
| 362 CreateMockRead(*resp, 1), |
| 363 CreateMockRead(*body), |
| 364 CreateMockRead(*resp2, 4), |
| 365 CreateMockRead(*body2), |
| 366 CreateMockRead(*resp3, 7), |
| 367 CreateMockRead(*body3), |
| 368 |
| 369 CreateMockRead(*fbody), |
| 370 CreateMockRead(*fbody2), |
| 371 CreateMockRead(*fbody3), |
| 372 |
| 373 MockRead(true, 0, 0), // EOF |
| 374 }; |
| 375 |
| 376 scoped_refptr<OrderedSocketData> data( |
| 377 new OrderedSocketData(reads, arraysize(reads), |
| 378 writes, arraysize(writes))); |
| 379 |
| 380 BoundNetLog log; |
| 381 TransactionHelperResult out; |
| 382 { |
| 383 SessionDependencies session_deps; |
| 384 HttpNetworkSession* session = CreateSession(&session_deps); |
| 385 SpdySession::SetSSLMode(false); |
| 386 scoped_ptr<SpdyNetworkTransaction> trans1( |
| 387 new SpdyNetworkTransaction(session)); |
| 388 scoped_ptr<SpdyNetworkTransaction> trans2( |
| 389 new SpdyNetworkTransaction(session)); |
| 390 scoped_ptr<SpdyNetworkTransaction> trans3( |
| 391 new SpdyNetworkTransaction(session)); |
| 392 |
| 393 session_deps.socket_factory.AddSocketDataProvider(data); |
| 394 |
| 395 TestCompletionCallback callback1; |
| 396 TestCompletionCallback callback2; |
| 397 TestCompletionCallback callback3; |
| 398 |
| 399 HttpRequestInfo httpreq1 = CreateGetRequest(); |
| 400 HttpRequestInfo httpreq2 = CreateGetRequest(); |
| 401 HttpRequestInfo httpreq3 = CreateGetRequest(); |
| 402 |
| 403 out.rv = trans1->Start(&httpreq1, &callback1, log); |
| 404 ASSERT_EQ(ERR_IO_PENDING, out.rv); |
| 405 out.rv = trans2->Start(&httpreq2, &callback2, log); |
| 406 ASSERT_EQ(ERR_IO_PENDING, out.rv); |
| 407 out.rv = trans3->Start(&httpreq3, &callback3, log); |
| 408 ASSERT_EQ(ERR_IO_PENDING, out.rv); |
| 409 |
| 410 out.rv = callback1.WaitForResult(); |
| 411 ASSERT_EQ(OK, out.rv); |
| 412 out.rv = callback3.WaitForResult(); |
| 413 ASSERT_EQ(OK, out.rv); |
| 414 |
| 415 const HttpResponseInfo* response1 = trans1->GetResponseInfo(); |
| 416 EXPECT_TRUE(response1->headers != NULL); |
| 417 EXPECT_TRUE(response1->was_fetched_via_spdy); |
| 418 out.status_line = response1->headers->GetStatusLine(); |
| 419 out.response_info = *response1; |
| 420 |
| 421 trans2->GetResponseInfo(); |
| 422 |
| 423 out.rv = ReadTransaction(trans1.get(), &out.response_data); |
| 424 } |
| 425 EXPECT_EQ(OK, out.rv); |
| 426 |
| 427 EXPECT_TRUE(data->at_read_eof()); |
| 428 EXPECT_TRUE(data->at_write_eof()); |
| 429 |
| 430 EXPECT_EQ(OK, out.rv); |
| 431 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 432 EXPECT_EQ("hello!hello!", out.response_data); |
| 433 } |
| 434 |
| 435 |
| 436 // Similar to ThreeGets above, however this test adds a SETTINGS |
| 437 // frame. The SETTINGS frame is read during the IO loop waiting on |
| 438 // the first transaction completion, and sets a maximum concurrent |
| 439 // stream limit of 1. This means that our IO loop exists after the |
| 440 // second transaction completes, so we can assert on read_index(). |
| 441 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) { |
| 442 // Construct the request. |
| 443 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 444 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 445 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, false)); |
| 446 scoped_ptr<spdy::SpdyFrame> fbody(ConstructSpdyBodyFrame(1, true)); |
| 447 |
| 448 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST)); |
| 449 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3)); |
| 450 scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(3, false)); |
| 451 scoped_ptr<spdy::SpdyFrame> fbody2(ConstructSpdyBodyFrame(3, true)); |
| 452 |
| 453 scoped_ptr<spdy::SpdyFrame> req3(ConstructSpdyGet(NULL, 0, false, 5, LOWEST)); |
| 454 scoped_ptr<spdy::SpdyFrame> resp3(ConstructSpdyGetSynReply(NULL, 0, 5)); |
| 455 scoped_ptr<spdy::SpdyFrame> body3(ConstructSpdyBodyFrame(5, false)); |
| 456 scoped_ptr<spdy::SpdyFrame> fbody3(ConstructSpdyBodyFrame(5, true)); |
| 457 |
| 458 spdy::SpdySettings settings; |
| 459 spdy::SettingsFlagsAndId id(0); |
| 460 id.set_id(spdy::SETTINGS_MAX_CONCURRENT_STREAMS); |
| 461 const size_t max_concurrent_streams = 1; |
| 462 |
| 463 settings.push_back(spdy::SpdySetting(id, max_concurrent_streams)); |
| 464 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings)); |
| 465 |
| 466 MockWrite writes[] = { CreateMockWrite(*req), |
| 467 CreateMockWrite(*req2), |
| 468 CreateMockWrite(*req3), |
| 469 }; |
| 470 MockRead reads[] = { |
| 471 CreateMockRead(*settings_frame, 0), |
| 472 CreateMockRead(*resp), |
| 473 CreateMockRead(*body), |
| 474 CreateMockRead(*fbody), |
| 475 CreateMockRead(*resp2, 6), |
| 476 CreateMockRead(*body2), |
| 477 CreateMockRead(*fbody2), |
| 478 CreateMockRead(*resp3, 11), |
| 479 CreateMockRead(*body3), |
| 480 CreateMockRead(*fbody3), |
| 481 |
| 482 MockRead(true, 0, 0), // EOF |
| 483 }; |
| 484 |
| 485 scoped_refptr<OrderedSocketData> data( |
| 486 new OrderedSocketData(reads, arraysize(reads), |
| 487 writes, arraysize(writes))); |
| 488 |
| 489 BoundNetLog log; |
| 490 TransactionHelperResult out; |
| 491 { |
| 492 SessionDependencies session_deps; |
| 493 HttpNetworkSession* session = CreateSession(&session_deps); |
| 494 SpdySession::SetSSLMode(false); |
| 495 scoped_ptr<SpdyNetworkTransaction> trans1( |
| 496 new SpdyNetworkTransaction(session)); |
| 497 scoped_ptr<SpdyNetworkTransaction> trans2( |
| 498 new SpdyNetworkTransaction(session)); |
| 499 scoped_ptr<SpdyNetworkTransaction> trans3( |
| 500 new SpdyNetworkTransaction(session)); |
| 501 |
| 502 session_deps.socket_factory.AddSocketDataProvider(data); |
| 503 |
| 504 TestCompletionCallback callback1; |
| 505 TestCompletionCallback callback2; |
| 506 TestCompletionCallback callback3; |
| 507 |
| 508 HttpRequestInfo httpreq1 = CreateGetRequest(); |
| 509 HttpRequestInfo httpreq2 = CreateGetRequest(); |
| 510 HttpRequestInfo httpreq3 = CreateGetRequest(); |
| 511 |
| 512 out.rv = trans1->Start(&httpreq1, &callback1, log); |
| 513 ASSERT_EQ(out.rv, ERR_IO_PENDING); |
| 514 // run transaction 1 through quickly to force a read of our SETTINGS |
| 515 // frame |
| 516 out.rv = callback1.WaitForResult(); |
| 517 |
| 518 out.rv = trans2->Start(&httpreq2, &callback2, log); |
| 519 ASSERT_EQ(out.rv, ERR_IO_PENDING); |
| 520 out.rv = trans3->Start(&httpreq3, &callback3, log); |
| 521 ASSERT_EQ(out.rv, ERR_IO_PENDING); |
| 522 out.rv = callback2.WaitForResult(); |
| 523 ASSERT_EQ(OK, out.rv); |
| 524 EXPECT_EQ(7U, data->read_index()); // i.e. the third trans was queued |
| 525 |
| 526 out.rv = callback3.WaitForResult(); |
| 527 ASSERT_EQ(OK, out.rv); |
| 528 |
| 529 const HttpResponseInfo* response1 = trans1->GetResponseInfo(); |
| 530 EXPECT_TRUE(response1->headers != NULL); |
| 531 EXPECT_TRUE(response1->was_fetched_via_spdy); |
| 532 out.status_line = response1->headers->GetStatusLine(); |
| 533 out.response_info = *response1; |
| 534 out.rv = ReadTransaction(trans1.get(), &out.response_data); |
| 535 EXPECT_EQ(OK, out.rv); |
| 536 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 537 EXPECT_EQ("hello!hello!", out.response_data); |
| 538 |
| 539 const HttpResponseInfo* response2 = trans2->GetResponseInfo(); |
| 540 out.status_line = response2->headers->GetStatusLine(); |
| 541 out.response_info = *response2; |
| 542 out.rv = ReadTransaction(trans2.get(), &out.response_data); |
| 543 EXPECT_EQ(OK, out.rv); |
| 544 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 545 EXPECT_EQ("hello!hello!", out.response_data); |
| 546 |
| 547 const HttpResponseInfo* response3 = trans3->GetResponseInfo(); |
| 548 out.status_line = response3->headers->GetStatusLine(); |
| 549 out.response_info = *response3; |
| 550 out.rv = ReadTransaction(trans3.get(), &out.response_data); |
| 551 EXPECT_EQ(OK, out.rv); |
| 552 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 553 EXPECT_EQ("hello!hello!", out.response_data); |
| 554 } |
| 555 EXPECT_EQ(OK, out.rv); |
| 556 |
| 557 EXPECT_TRUE(data->at_read_eof()); |
| 558 EXPECT_TRUE(data->at_write_eof()); |
| 559 } |
| 560 |
| 561 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds |
| 562 // a fourth transaction. The third and fourth transactions have |
| 563 // different data ("hello!" vs "hello!hello!") and because of the |
| 564 // user specified priority, we expect to see them inverted in |
| 565 // the response from the server. |
| 566 TEST_F(SpdyNetworkTransactionTest, FourGetsWithMaxConcurrentPriority) { |
| 567 // Construct the request. |
| 568 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 569 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 570 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, false)); |
| 571 scoped_ptr<spdy::SpdyFrame> fbody(ConstructSpdyBodyFrame(1, true)); |
| 572 |
| 573 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST)); |
| 574 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3)); |
| 575 scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(3, false)); |
| 576 scoped_ptr<spdy::SpdyFrame> fbody2(ConstructSpdyBodyFrame(3, true)); |
| 577 |
| 578 scoped_ptr<spdy::SpdyFrame> req4( |
| 579 ConstructSpdyGet(NULL, 0, false, 5, HIGHEST)); |
| 580 scoped_ptr<spdy::SpdyFrame> resp4(ConstructSpdyGetSynReply(NULL, 0, 5)); |
| 581 scoped_ptr<spdy::SpdyFrame> fbody4(ConstructSpdyBodyFrame(5, true)); |
| 582 |
| 583 scoped_ptr<spdy::SpdyFrame> req3(ConstructSpdyGet(NULL, 0, false, 7, LOWEST)); |
| 584 scoped_ptr<spdy::SpdyFrame> resp3(ConstructSpdyGetSynReply(NULL, 0, 7)); |
| 585 scoped_ptr<spdy::SpdyFrame> body3(ConstructSpdyBodyFrame(7, false)); |
| 586 scoped_ptr<spdy::SpdyFrame> fbody3(ConstructSpdyBodyFrame(7, true)); |
| 587 |
| 588 |
| 589 spdy::SpdySettings settings; |
| 590 spdy::SettingsFlagsAndId id(0); |
| 591 id.set_id(spdy::SETTINGS_MAX_CONCURRENT_STREAMS); |
| 592 const size_t max_concurrent_streams = 1; |
| 593 |
| 594 settings.push_back(spdy::SpdySetting(id, max_concurrent_streams)); |
| 595 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings)); |
| 596 |
| 597 MockWrite writes[] = { CreateMockWrite(*req), |
| 598 CreateMockWrite(*req2), |
| 599 CreateMockWrite(*req4), |
| 600 CreateMockWrite(*req3), |
| 601 }; |
| 602 MockRead reads[] = { |
| 603 CreateMockRead(*settings_frame, 0), |
| 604 CreateMockRead(*resp), |
| 605 CreateMockRead(*body), |
| 606 CreateMockRead(*fbody), |
| 607 CreateMockRead(*resp2, 6), |
| 608 CreateMockRead(*body2), |
| 609 CreateMockRead(*fbody2), |
| 610 CreateMockRead(*resp4, 12), |
| 611 CreateMockRead(*fbody4), |
| 612 CreateMockRead(*resp3, 15), |
| 613 CreateMockRead(*body3), |
| 614 CreateMockRead(*fbody3), |
| 615 |
| 616 MockRead(true, 0, 0), // EOF |
| 617 }; |
| 618 |
| 619 scoped_refptr<OrderedSocketData> data( |
| 620 new OrderedSocketData(reads, arraysize(reads), |
| 621 writes, arraysize(writes))); |
| 622 |
| 623 BoundNetLog log; |
| 624 TransactionHelperResult out; |
| 625 { |
| 626 SessionDependencies session_deps; |
| 627 HttpNetworkSession* session = CreateSession(&session_deps); |
| 628 SpdySession::SetSSLMode(false); |
| 629 scoped_ptr<SpdyNetworkTransaction> trans1( |
| 630 new SpdyNetworkTransaction(session)); |
| 631 scoped_ptr<SpdyNetworkTransaction> trans2( |
| 632 new SpdyNetworkTransaction(session)); |
| 633 scoped_ptr<SpdyNetworkTransaction> trans3( |
| 634 new SpdyNetworkTransaction(session)); |
| 635 scoped_ptr<SpdyNetworkTransaction> trans4( |
| 636 new SpdyNetworkTransaction(session)); |
| 637 |
| 638 session_deps.socket_factory.AddSocketDataProvider(data); |
| 639 |
| 640 TestCompletionCallback callback1; |
| 641 TestCompletionCallback callback2; |
| 642 TestCompletionCallback callback3; |
| 643 TestCompletionCallback callback4; |
| 644 |
| 645 HttpRequestInfo httpreq1 = CreateGetRequest(); |
| 646 HttpRequestInfo httpreq2 = CreateGetRequest(); |
| 647 HttpRequestInfo httpreq3 = CreateGetRequest(); |
| 648 HttpRequestInfo httpreq4 = CreateGetRequest(); |
| 649 httpreq4.priority = HIGHEST; |
| 650 |
| 651 out.rv = trans1->Start(&httpreq1, &callback1, log); |
| 652 ASSERT_EQ(ERR_IO_PENDING, out.rv); |
| 653 // run transaction 1 through quickly to force a read of our SETTINGS |
| 654 // frame |
| 655 out.rv = callback1.WaitForResult(); |
| 656 ASSERT_EQ(OK, out.rv); |
| 657 |
| 658 out.rv = trans2->Start(&httpreq2, &callback2, log); |
| 659 ASSERT_EQ(ERR_IO_PENDING, out.rv); |
| 660 out.rv = trans3->Start(&httpreq3, &callback3, log); |
| 661 ASSERT_EQ(ERR_IO_PENDING, out.rv); |
| 662 out.rv = trans4->Start(&httpreq4, &callback4, log); |
| 663 ASSERT_EQ(ERR_IO_PENDING, out.rv); |
| 664 |
| 665 out.rv = callback2.WaitForResult(); |
| 666 ASSERT_EQ(OK, out.rv); |
| 667 EXPECT_EQ(data->read_index(), 7U); // i.e. the third & fourth trans queued |
| 668 |
| 669 out.rv = callback3.WaitForResult(); |
| 670 ASSERT_EQ(OK, out.rv); |
| 671 |
| 672 const HttpResponseInfo* response1 = trans1->GetResponseInfo(); |
| 673 EXPECT_TRUE(response1->headers != NULL); |
| 674 EXPECT_TRUE(response1->was_fetched_via_spdy); |
| 675 out.status_line = response1->headers->GetStatusLine(); |
| 676 out.response_info = *response1; |
| 677 out.rv = ReadTransaction(trans1.get(), &out.response_data); |
| 678 EXPECT_EQ(OK, out.rv); |
| 679 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 680 EXPECT_EQ("hello!hello!", out.response_data); |
| 681 |
| 682 const HttpResponseInfo* response2 = trans2->GetResponseInfo(); |
| 683 out.status_line = response2->headers->GetStatusLine(); |
| 684 out.response_info = *response2; |
| 685 out.rv = ReadTransaction(trans2.get(), &out.response_data); |
| 686 EXPECT_EQ(OK, out.rv); |
| 687 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 688 EXPECT_EQ("hello!hello!", out.response_data); |
| 689 |
| 690 // notice: response3 gets two hellos, response4 gets one |
| 691 // hello, so we know dequeuing priority was respected. |
| 692 const HttpResponseInfo* response3 = trans3->GetResponseInfo(); |
| 693 out.status_line = response3->headers->GetStatusLine(); |
| 694 out.response_info = *response3; |
| 695 out.rv = ReadTransaction(trans3.get(), &out.response_data); |
| 696 EXPECT_EQ(OK, out.rv); |
| 697 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 698 EXPECT_EQ("hello!hello!", out.response_data); |
| 699 |
| 700 out.rv = callback4.WaitForResult(); |
| 701 EXPECT_EQ(OK, out.rv); |
| 702 const HttpResponseInfo* response4 = trans4->GetResponseInfo(); |
| 703 out.status_line = response4->headers->GetStatusLine(); |
| 704 out.response_info = *response4; |
| 705 out.rv = ReadTransaction(trans4.get(), &out.response_data); |
| 706 EXPECT_EQ(OK, out.rv); |
| 707 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 708 EXPECT_EQ("hello!", out.response_data); |
| 709 } |
| 710 EXPECT_EQ(OK, out.rv); |
| 711 |
| 712 EXPECT_TRUE(data->at_read_eof()); |
| 713 EXPECT_TRUE(data->at_write_eof()); |
| 714 } |
| 715 |
| 716 // Similar to ThreeGetsMaxConcurrrent above, however, this test |
| 717 // deletes a session in the middle of the transaction to insure |
| 718 // that we properly remove pendingcreatestream objects from |
| 719 // the spdy_session |
| 720 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) { |
| 721 // Construct the request. |
| 722 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
| 723 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 724 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, false)); |
| 725 scoped_ptr<spdy::SpdyFrame> fbody(ConstructSpdyBodyFrame(1, true)); |
| 726 |
| 727 scoped_ptr<spdy::SpdyFrame> req2(ConstructSpdyGet(NULL, 0, false, 3, LOWEST)); |
| 728 scoped_ptr<spdy::SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3)); |
| 729 scoped_ptr<spdy::SpdyFrame> body2(ConstructSpdyBodyFrame(3, false)); |
| 730 scoped_ptr<spdy::SpdyFrame> fbody2(ConstructSpdyBodyFrame(3, true)); |
| 731 |
| 732 scoped_ptr<spdy::SpdyFrame> req3(ConstructSpdyGet(NULL, 0, false, 5, LOWEST)); |
| 733 scoped_ptr<spdy::SpdyFrame> resp3(ConstructSpdyGetSynReply(NULL, 0, 5)); |
| 734 scoped_ptr<spdy::SpdyFrame> body3(ConstructSpdyBodyFrame(5, false)); |
| 735 scoped_ptr<spdy::SpdyFrame> fbody3(ConstructSpdyBodyFrame(5, true)); |
| 736 |
| 737 spdy::SpdySettings settings; |
| 738 spdy::SettingsFlagsAndId id(0); |
| 739 id.set_id(spdy::SETTINGS_MAX_CONCURRENT_STREAMS); |
| 740 const size_t max_concurrent_streams = 1; |
| 741 |
| 742 settings.push_back(spdy::SpdySetting(id, max_concurrent_streams)); |
| 743 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings)); |
| 744 |
| 745 MockWrite writes[] = { CreateMockWrite(*req), |
| 746 CreateMockWrite(*req2), |
| 747 }; |
| 748 MockRead reads[] = { |
| 749 CreateMockRead(*settings_frame, 0), |
| 750 CreateMockRead(*resp), |
| 751 CreateMockRead(*body), |
| 752 CreateMockRead(*fbody), |
| 753 CreateMockRead(*resp2, 6), |
| 754 CreateMockRead(*body2), |
| 755 CreateMockRead(*fbody2), |
| 756 MockRead(true, 0, 0), // EOF |
| 757 }; |
| 758 |
| 759 scoped_refptr<OrderedSocketData> data( |
| 760 new OrderedSocketData(reads, arraysize(reads), |
| 761 writes, arraysize(writes))); |
| 762 |
| 763 BoundNetLog log; |
| 764 TransactionHelperResult out; |
| 765 { |
| 766 SessionDependencies session_deps; |
| 767 HttpNetworkSession* session = CreateSession(&session_deps); |
| 768 SpdySession::SetSSLMode(false); |
| 769 scoped_ptr<SpdyNetworkTransaction> trans1( |
| 770 new SpdyNetworkTransaction(session)); |
| 771 scoped_ptr<SpdyNetworkTransaction> trans2( |
| 772 new SpdyNetworkTransaction(session)); |
| 773 scoped_ptr<SpdyNetworkTransaction> trans3( |
| 774 new SpdyNetworkTransaction(session)); |
| 775 |
| 776 session_deps.socket_factory.AddSocketDataProvider(data); |
| 777 |
| 778 TestCompletionCallback callback1; |
| 779 TestCompletionCallback callback2; |
| 780 TestCompletionCallback callback3; |
| 781 |
| 782 HttpRequestInfo httpreq1 = CreateGetRequest(); |
| 783 HttpRequestInfo httpreq2 = CreateGetRequest(); |
| 784 HttpRequestInfo httpreq3 = CreateGetRequest(); |
| 785 |
| 786 out.rv = trans1->Start(&httpreq1, &callback1, log); |
| 787 ASSERT_EQ(out.rv, ERR_IO_PENDING); |
| 788 // run transaction 1 through quickly to force a read of our SETTINGS |
| 789 // frame |
| 790 out.rv = callback1.WaitForResult(); |
| 791 |
| 792 out.rv = trans2->Start(&httpreq2, &callback2, log); |
| 793 ASSERT_EQ(out.rv, ERR_IO_PENDING); |
| 794 out.rv = trans3->Start(&httpreq3, &callback3, log); |
| 795 delete trans3.release(); |
| 796 ASSERT_EQ(out.rv, ERR_IO_PENDING); |
| 797 out.rv = callback2.WaitForResult(); |
| 798 |
| 799 EXPECT_EQ(8U, data->read_index()); |
| 800 |
| 801 const HttpResponseInfo* response1 = trans1->GetResponseInfo(); |
| 802 EXPECT_TRUE(response1->headers != NULL); |
| 803 EXPECT_TRUE(response1->was_fetched_via_spdy); |
| 804 out.status_line = response1->headers->GetStatusLine(); |
| 805 out.response_info = *response1; |
| 806 out.rv = ReadTransaction(trans1.get(), &out.response_data); |
| 807 EXPECT_EQ(OK, out.rv); |
| 808 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 809 EXPECT_EQ("hello!hello!", out.response_data); |
| 810 |
| 811 const HttpResponseInfo* response2 = trans2->GetResponseInfo(); |
| 812 out.status_line = response2->headers->GetStatusLine(); |
| 813 out.response_info = *response2; |
| 814 out.rv = ReadTransaction(trans2.get(), &out.response_data); |
| 815 EXPECT_EQ(OK, out.rv); |
| 816 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
| 817 EXPECT_EQ("hello!hello!", out.response_data); |
| 818 } |
| 819 EXPECT_EQ(OK, out.rv); |
| 820 |
| 821 EXPECT_TRUE(data->at_read_eof()); |
| 822 EXPECT_TRUE(data->at_write_eof()); |
| 823 } |
| 824 |
330 // Test that a simple POST works. | 825 // Test that a simple POST works. |
331 TEST_F(SpdyNetworkTransactionTest, Post) { | 826 TEST_F(SpdyNetworkTransactionTest, Post) { |
332 static const char upload[] = { "hello!" }; | 827 static const char upload[] = { "hello!" }; |
333 | 828 |
334 // Setup the request | 829 // Setup the request |
335 HttpRequestInfo request; | 830 HttpRequestInfo request; |
336 request.method = "POST"; | 831 request.method = "POST"; |
337 request.url = GURL("http://www.google.com/"); | 832 request.url = GURL("http://www.google.com/"); |
338 request.upload_data = new UploadData(); | 833 request.upload_data = new UploadData(); |
339 request.upload_data->AppendBytes(upload, strlen(upload)); | 834 request.upload_data->AppendBytes(upload, strlen(upload)); |
340 | 835 |
341 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0)); | 836 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0)); |
342 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 837 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
343 MockWrite writes[] = { | 838 MockWrite writes[] = { |
344 CreateMockWrite(*req), | 839 CreateMockWrite(*req), |
345 CreateMockWrite(*body), // POST upload frame | 840 CreateMockWrite(*body), // POST upload frame |
346 }; | 841 }; |
347 | 842 |
348 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); | 843 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); |
349 MockRead reads[] = { | 844 MockRead reads[] = { |
350 CreateMockRead(*resp), | 845 CreateMockRead(*resp), |
351 CreateMockRead(*body), | 846 CreateMockRead(*body), |
352 MockRead(true, 0, 0) // EOF | 847 MockRead(true, 0, 0) // EOF |
(...skipping 21 matching lines...) Expand all Loading... |
374 request.upload_data = new UploadData(); | 869 request.upload_data = new UploadData(); |
375 | 870 |
376 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0)); | 871 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0)); |
377 // Set the FIN bit since there will be no body. | 872 // Set the FIN bit since there will be no body. |
378 req->set_flags(spdy::CONTROL_FLAG_FIN); | 873 req->set_flags(spdy::CONTROL_FLAG_FIN); |
379 MockWrite writes[] = { | 874 MockWrite writes[] = { |
380 CreateMockWrite(*req), | 875 CreateMockWrite(*req), |
381 }; | 876 }; |
382 | 877 |
383 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); | 878 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); |
384 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 879 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
385 MockRead reads[] = { | 880 MockRead reads[] = { |
386 CreateMockRead(*resp), | 881 CreateMockRead(*resp), |
387 CreateMockRead(*body), | 882 CreateMockRead(*body), |
388 MockRead(true, 0, 0) // EOF | 883 MockRead(true, 0, 0) // EOF |
389 }; | 884 }; |
390 | 885 |
391 scoped_refptr<DelayedSocketData> data( | 886 scoped_refptr<DelayedSocketData> data( |
392 new DelayedSocketData(1, reads, arraysize(reads), | 887 new DelayedSocketData(1, reads, arraysize(reads), |
393 writes, arraysize(writes))); | 888 writes, arraysize(writes))); |
394 | 889 |
(...skipping 11 matching lines...) Expand all Loading... |
406 static const char upload[] = { "hello!" }; | 901 static const char upload[] = { "hello!" }; |
407 | 902 |
408 // Setup the request | 903 // Setup the request |
409 HttpRequestInfo request; | 904 HttpRequestInfo request; |
410 request.method = "POST"; | 905 request.method = "POST"; |
411 request.url = GURL("http://www.google.com/"); | 906 request.url = GURL("http://www.google.com/"); |
412 request.upload_data = new UploadData(); | 907 request.upload_data = new UploadData(); |
413 request.upload_data->AppendBytes(upload, sizeof(upload)); | 908 request.upload_data->AppendBytes(upload, sizeof(upload)); |
414 | 909 |
415 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0)); | 910 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyPost(NULL, 0)); |
416 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 911 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
417 MockWrite writes[] = { | 912 MockWrite writes[] = { |
418 CreateMockWrite(*req.get(), 2), | 913 CreateMockWrite(*req.get(), 2), |
419 CreateMockWrite(*body.get(), 3), // POST upload frame | 914 CreateMockWrite(*body.get(), 3), // POST upload frame |
420 }; | 915 }; |
421 | 916 |
422 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); | 917 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyPostSynReply(NULL, 0)); |
423 MockRead reads[] = { | 918 MockRead reads[] = { |
424 CreateMockRead(*resp.get(), 2), | 919 CreateMockRead(*resp.get(), 2), |
425 CreateMockRead(*body.get(), 3), | 920 CreateMockRead(*body.get(), 3), |
426 MockRead(false, 0, 0) // EOF | 921 MockRead(false, 0, 0) // EOF |
427 }; | 922 }; |
428 | 923 |
429 scoped_refptr<DelayedSocketData> data( | 924 scoped_refptr<DelayedSocketData> data( |
430 new DelayedSocketData(0, reads, arraysize(reads), | 925 new DelayedSocketData(0, reads, arraysize(reads), |
431 writes, arraysize(writes))); | 926 writes, arraysize(writes))); |
432 NormalSpdyTransactionHelper helper(request, | 927 NormalSpdyTransactionHelper helper(request, |
433 BoundNetLog()); | 928 BoundNetLog()); |
434 helper.AddData(data.get()); | 929 helper.AddData(data.get()); |
435 helper.RunPreTestSetup(); | 930 helper.RunPreTestSetup(); |
436 helper.RunDefaultTest(); | 931 helper.RunDefaultTest(); |
437 helper.VerifyDataNotConsumed(); | 932 helper.VerifyDataNotConsumed(); |
438 TransactionHelperResult out = helper.output(); | 933 TransactionHelperResult out = helper.output(); |
439 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); | 934 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); |
440 } | 935 } |
441 | 936 |
442 // Test that the transaction doesn't crash when we don't have a reply. | 937 // Test that the transaction doesn't crash when we don't have a reply. |
443 TEST_F(SpdyNetworkTransactionTest, ResponseWithoutSynReply) { | 938 TEST_F(SpdyNetworkTransactionTest, ResponseWithoutSynReply) { |
444 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 939 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
445 MockRead reads[] = { | 940 MockRead reads[] = { |
446 CreateMockRead(*body), | 941 CreateMockRead(*body), |
447 MockRead(true, 0, 0) // EOF | 942 MockRead(true, 0, 0) // EOF |
448 }; | 943 }; |
449 | 944 |
450 scoped_refptr<DelayedSocketData> data( | 945 scoped_refptr<DelayedSocketData> data( |
451 new DelayedSocketData(1, reads, arraysize(reads), NULL, 0)); | 946 new DelayedSocketData(1, reads, arraysize(reads), NULL, 0)); |
452 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 947 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
453 BoundNetLog()); | 948 BoundNetLog()); |
454 helper.RunToCompletion(data.get()); | 949 helper.RunToCompletion(data.get()); |
455 TransactionHelperResult out = helper.output(); | 950 TransactionHelperResult out = helper.output(); |
456 EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv); | 951 EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv); |
457 } | 952 } |
458 | 953 |
459 // Test that the transaction doesn't crash when we get two replies on the same | 954 // Test that the transaction doesn't crash when we get two replies on the same |
460 // stream ID. See http://crbug.com/45639. | 955 // stream ID. See http://crbug.com/45639. |
461 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { | 956 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { |
462 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 957 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
463 MockWrite writes[] = { CreateMockWrite(*req) }; | 958 MockWrite writes[] = { CreateMockWrite(*req) }; |
464 | 959 |
465 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 960 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
466 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 961 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
467 MockRead reads[] = { | 962 MockRead reads[] = { |
468 CreateMockRead(*resp), | 963 CreateMockRead(*resp), |
469 CreateMockRead(*resp), | 964 CreateMockRead(*resp), |
470 CreateMockRead(*body), | 965 CreateMockRead(*body), |
471 MockRead(true, 0, 0) // EOF | 966 MockRead(true, 0, 0) // EOF |
472 }; | 967 }; |
473 | 968 |
474 scoped_refptr<DelayedSocketData> data( | 969 scoped_refptr<DelayedSocketData> data( |
475 new DelayedSocketData(1, reads, arraysize(reads), | 970 new DelayedSocketData(1, reads, arraysize(reads), |
476 writes, arraysize(writes))); | 971 writes, arraysize(writes))); |
(...skipping 16 matching lines...) Expand all Loading... |
493 EXPECT_TRUE(response->was_fetched_via_spdy); | 988 EXPECT_TRUE(response->was_fetched_via_spdy); |
494 std::string response_data; | 989 std::string response_data; |
495 rv = ReadTransaction(trans, &response_data); | 990 rv = ReadTransaction(trans, &response_data); |
496 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, rv); | 991 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, rv); |
497 | 992 |
498 helper.VerifyDataConsumed(); | 993 helper.VerifyDataConsumed(); |
499 } | 994 } |
500 | 995 |
501 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) { | 996 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) { |
502 // Construct the request. | 997 // Construct the request. |
503 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 998 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
504 MockWrite writes[] = { | 999 MockWrite writes[] = { |
505 CreateMockWrite(*req), | 1000 CreateMockWrite(*req), |
506 }; | 1001 }; |
507 | 1002 |
508 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 1003 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
509 MockRead reads[] = { | 1004 MockRead reads[] = { |
510 CreateMockRead(*resp), | 1005 CreateMockRead(*resp), |
511 // This following read isn't used by the test, except during the | 1006 // This following read isn't used by the test, except during the |
512 // RunAllPending() call at the end since the SpdySession survives the | 1007 // RunAllPending() call at the end since the SpdySession survives the |
513 // HttpNetworkTransaction and still tries to continue Read()'ing. Any | 1008 // HttpNetworkTransaction and still tries to continue Read()'ing. Any |
514 // MockRead will do here. | 1009 // MockRead will do here. |
515 MockRead(true, 0, 0) // EOF | 1010 MockRead(true, 0, 0) // EOF |
516 }; | 1011 }; |
517 | 1012 |
518 StaticSocketDataProvider data(reads, arraysize(reads), | 1013 StaticSocketDataProvider data(reads, arraysize(reads), |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
559 | 1054 |
560 private: | 1055 private: |
561 scoped_refptr<HttpNetworkSession>& session_; | 1056 scoped_refptr<HttpNetworkSession>& session_; |
562 NormalSpdyTransactionHelper& helper_; | 1057 NormalSpdyTransactionHelper& helper_; |
563 }; | 1058 }; |
564 | 1059 |
565 // Verify that the client can correctly deal with the user callback attempting | 1060 // Verify that the client can correctly deal with the user callback attempting |
566 // to start another transaction on a session that is closing down. See | 1061 // to start another transaction on a session that is closing down. See |
567 // http://crbug.com/47455 | 1062 // http://crbug.com/47455 |
568 TEST_F(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) { | 1063 TEST_F(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) { |
569 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1064 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
570 MockWrite writes[] = { CreateMockWrite(*req) }; | 1065 MockWrite writes[] = { CreateMockWrite(*req) }; |
571 MockWrite writes2[] = { CreateMockWrite(*req) }; | 1066 MockWrite writes2[] = { CreateMockWrite(*req) }; |
572 | 1067 |
573 // The indicated length of this packet is longer than its actual length. When | 1068 // The indicated length of this packet is longer than its actual length. When |
574 // the session receives an empty packet after this one, it shuts down the | 1069 // the session receives an empty packet after this one, it shuts down the |
575 // session, and calls the read callback with the incomplete data. | 1070 // session, and calls the read callback with the incomplete data. |
576 const uint8 kGetBodyFrame2[] = { | 1071 const uint8 kGetBodyFrame2[] = { |
577 0x00, 0x00, 0x00, 0x01, | 1072 0x00, 0x00, 0x00, 0x01, |
578 0x01, 0x00, 0x00, 0x07, | 1073 0x01, 0x00, 0x00, 0x07, |
579 'h', 'e', 'l', 'l', 'o', '!', | 1074 'h', 'e', 'l', 'l', 'o', '!', |
580 }; | 1075 }; |
581 | 1076 |
582 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 1077 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
583 MockRead reads[] = { | 1078 MockRead reads[] = { |
584 CreateMockRead(*resp, 2), | 1079 CreateMockRead(*resp, 2), |
585 MockRead(true, ERR_IO_PENDING, 3), // Force a pause | 1080 MockRead(true, ERR_IO_PENDING, 3), // Force a pause |
586 MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame2), | 1081 MockRead(true, reinterpret_cast<const char*>(kGetBodyFrame2), |
587 arraysize(kGetBodyFrame2), 4), | 1082 arraysize(kGetBodyFrame2), 4), |
588 MockRead(true, ERR_IO_PENDING, 5), // Force a pause | 1083 MockRead(true, ERR_IO_PENDING, 5), // Force a pause |
589 MockRead(true, 0, 0, 6), // EOF | 1084 MockRead(true, 0, 0, 6), // EOF |
590 }; | 1085 }; |
591 MockRead reads2[] = { | 1086 MockRead reads2[] = { |
592 CreateMockRead(*resp, 2), | 1087 CreateMockRead(*resp, 2), |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 } | 1131 } |
637 | 1132 |
638 private: | 1133 private: |
639 NormalSpdyTransactionHelper& helper_; | 1134 NormalSpdyTransactionHelper& helper_; |
640 }; | 1135 }; |
641 | 1136 |
642 // Verify that the client can correctly deal with the user callback deleting the | 1137 // Verify that the client can correctly deal with the user callback deleting the |
643 // transaction. Failures will usually be valgrind errors. See | 1138 // transaction. Failures will usually be valgrind errors. See |
644 // http://crbug.com/46925 | 1139 // http://crbug.com/46925 |
645 TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) { | 1140 TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) { |
646 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1141 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
647 MockWrite writes[] = { CreateMockWrite(*req) }; | 1142 MockWrite writes[] = { CreateMockWrite(*req) }; |
648 | 1143 |
649 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 1144 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
650 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 1145 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
651 MockRead reads[] = { | 1146 MockRead reads[] = { |
652 CreateMockRead(*resp.get(), 2), | 1147 CreateMockRead(*resp.get(), 2), |
653 MockRead(true, ERR_IO_PENDING, 3), // Force a pause | 1148 MockRead(true, ERR_IO_PENDING, 3), // Force a pause |
654 CreateMockRead(*body.get(), 4), | 1149 CreateMockRead(*body.get(), 4), |
655 MockRead(true, 0, 0, 5), // EOF | 1150 MockRead(true, 0, 0, 5), // EOF |
656 }; | 1151 }; |
657 | 1152 |
658 scoped_refptr<OrderedSocketData> data( | 1153 scoped_refptr<OrderedSocketData> data( |
659 new OrderedSocketData(reads, arraysize(reads), | 1154 new OrderedSocketData(reads, arraysize(reads), |
660 writes, arraysize(writes))); | 1155 writes, arraysize(writes))); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 }, | 1216 }, |
722 "cookie: val1,val2\n" | 1217 "cookie: val1,val2\n" |
723 "hello: bye\n" | 1218 "hello: bye\n" |
724 "status: 200\n" | 1219 "status: 200\n" |
725 "url: /index.php\n" | 1220 "url: /index.php\n" |
726 "version: HTTP/1.1\n" | 1221 "version: HTTP/1.1\n" |
727 } | 1222 } |
728 }; | 1223 }; |
729 | 1224 |
730 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { | 1225 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { |
731 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1226 scoped_ptr<spdy::SpdyFrame> req( |
| 1227 ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
732 MockWrite writes[] = { CreateMockWrite(*req) }; | 1228 MockWrite writes[] = { CreateMockWrite(*req) }; |
733 | 1229 |
734 scoped_ptr<spdy::SpdyFrame> resp( | 1230 scoped_ptr<spdy::SpdyFrame> resp( |
735 ConstructSpdyGetSynReply(test_cases[i].extra_headers, | 1231 ConstructSpdyGetSynReply(test_cases[i].extra_headers, |
736 test_cases[i].num_headers)); | 1232 test_cases[i].num_headers, |
737 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 1233 1)); |
| 1234 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
738 MockRead reads[] = { | 1235 MockRead reads[] = { |
739 CreateMockRead(*resp), | 1236 CreateMockRead(*resp), |
740 CreateMockRead(*body), | 1237 CreateMockRead(*body), |
741 MockRead(true, 0, 0) // EOF | 1238 MockRead(true, 0, 0) // EOF |
742 }; | 1239 }; |
743 | 1240 |
744 scoped_refptr<DelayedSocketData> data( | 1241 scoped_refptr<DelayedSocketData> data( |
745 new DelayedSocketData(1, reads, arraysize(reads), | 1242 new DelayedSocketData(1, reads, arraysize(reads), |
746 writes, arraysize(writes))); | 1243 writes, arraysize(writes))); |
747 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 1244 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
850 NULL | 1347 NULL |
851 } | 1348 } |
852 } | 1349 } |
853 } | 1350 } |
854 }; | 1351 }; |
855 | 1352 |
856 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { | 1353 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { |
857 // Construct the request. | 1354 // Construct the request. |
858 scoped_ptr<spdy::SpdyFrame> frame_req( | 1355 scoped_ptr<spdy::SpdyFrame> frame_req( |
859 ConstructSpdyGet(test_cases[i].extra_headers[0], | 1356 ConstructSpdyGet(test_cases[i].extra_headers[0], |
860 test_cases[i].num_headers[0])); | 1357 test_cases[i].num_headers[0], |
| 1358 false, 1, LOWEST)); |
861 | 1359 |
862 MockWrite writes[] = { | 1360 MockWrite writes[] = { |
863 CreateMockWrite(*frame_req), | 1361 CreateMockWrite(*frame_req), |
864 }; | 1362 }; |
865 | 1363 |
866 // Construct the reply. | 1364 // Construct the reply. |
867 scoped_ptr<spdy::SpdyFrame> frame_reply( | 1365 scoped_ptr<spdy::SpdyFrame> frame_reply( |
868 ConstructSpdyPacket(*test_cases[i].syn_reply, | 1366 ConstructSpdyPacket(*test_cases[i].syn_reply, |
869 test_cases[i].extra_headers[1], | 1367 test_cases[i].extra_headers[1], |
870 test_cases[i].num_headers[1], | 1368 test_cases[i].num_headers[1], |
871 NULL, | 1369 NULL, |
872 0)); | 1370 0)); |
873 | 1371 |
874 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 1372 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
875 MockRead reads[] = { | 1373 MockRead reads[] = { |
876 CreateMockRead(*frame_reply), | 1374 CreateMockRead(*frame_reply), |
877 CreateMockRead(*body), | 1375 CreateMockRead(*body), |
878 MockRead(true, 0, 0) // EOF | 1376 MockRead(true, 0, 0) // EOF |
879 }; | 1377 }; |
880 | 1378 |
881 // Attach the headers to the request. | 1379 // Attach the headers to the request. |
882 int header_count = test_cases[i].num_headers[0]; | 1380 int header_count = test_cases[i].num_headers[0]; |
883 | 1381 |
884 HttpRequestInfo request = CreateGetRequest(); | 1382 HttpRequestInfo request = CreateGetRequest(); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 { "status", "200", | 1466 { "status", "200", |
969 "url", "/index.php", | 1467 "url", "/index.php", |
970 NULL | 1468 NULL |
971 }, | 1469 }, |
972 }, | 1470 }, |
973 // SYN_REPLY with no headers | 1471 // SYN_REPLY with no headers |
974 { 0, { NULL }, }, | 1472 { 0, { NULL }, }, |
975 }; | 1473 }; |
976 | 1474 |
977 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { | 1475 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { |
978 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1476 scoped_ptr<spdy::SpdyFrame> req( |
| 1477 ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
979 MockWrite writes[] = { | 1478 MockWrite writes[] = { |
980 CreateMockWrite(*req), | 1479 CreateMockWrite(*req), |
981 }; | 1480 }; |
982 | 1481 |
983 scoped_ptr<spdy::SpdyFrame> resp( | 1482 scoped_ptr<spdy::SpdyFrame> resp( |
984 ConstructSpdyPacket(kSynStartHeader, | 1483 ConstructSpdyPacket(kSynStartHeader, |
985 NULL, 0, | 1484 NULL, 0, |
986 test_cases[i].headers, | 1485 test_cases[i].headers, |
987 test_cases[i].num_headers)); | 1486 test_cases[i].num_headers)); |
988 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 1487 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
989 MockRead reads[] = { | 1488 MockRead reads[] = { |
990 CreateMockRead(*resp), | 1489 CreateMockRead(*resp), |
991 CreateMockRead(*body), | 1490 CreateMockRead(*body), |
992 MockRead(true, 0, 0) // EOF | 1491 MockRead(true, 0, 0) // EOF |
993 }; | 1492 }; |
994 | 1493 |
995 scoped_refptr<DelayedSocketData> data( | 1494 scoped_refptr<DelayedSocketData> data( |
996 new DelayedSocketData(1, reads, arraysize(reads), | 1495 new DelayedSocketData(1, reads, arraysize(reads), |
997 writes, arraysize(writes))); | 1496 writes, arraysize(writes))); |
998 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 1497 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
999 BoundNetLog()); | 1498 BoundNetLog()); |
1000 helper.RunToCompletion(data.get()); | 1499 helper.RunToCompletion(data.get()); |
1001 TransactionHelperResult out = helper.output(); | 1500 TransactionHelperResult out = helper.output(); |
1002 EXPECT_EQ(ERR_INVALID_RESPONSE, out.rv); | 1501 EXPECT_EQ(ERR_INVALID_RESPONSE, out.rv); |
1003 } | 1502 } |
1004 } | 1503 } |
1005 | 1504 |
1006 // Verify that we don't crash on some corrupt frames. | 1505 // Verify that we don't crash on some corrupt frames. |
1007 // TODO(eroman): Renable this test, see http://crbug.com/48588 | 1506 // TODO(eroman): Renable this test, see http://crbug.com/48588 |
1008 TEST_F(SpdyNetworkTransactionTest, DISABLED_CorruptFrameSessionError) { | 1507 TEST_F(SpdyNetworkTransactionTest, DISABLED_CorruptFrameSessionError) { |
1009 // This is the length field with a big number | 1508 // This is the length field with a big number |
1010 scoped_ptr<spdy::SpdyFrame> syn_reply_massive_length( | 1509 scoped_ptr<spdy::SpdyFrame> syn_reply_massive_length( |
1011 ConstructSpdyGetSynReply(NULL, 0)); | 1510 ConstructSpdyGetSynReply(NULL, 0, 1)); |
1012 syn_reply_massive_length->set_length(0x111126); | 1511 syn_reply_massive_length->set_length(0x111126); |
1013 | 1512 |
1014 struct SynReplyTests { | 1513 struct SynReplyTests { |
1015 const spdy::SpdyFrame* syn_reply; | 1514 const spdy::SpdyFrame* syn_reply; |
1016 } test_cases[] = { | 1515 } test_cases[] = { |
1017 { syn_reply_massive_length.get(), }, | 1516 { syn_reply_massive_length.get(), }, |
1018 }; | 1517 }; |
1019 | 1518 |
1020 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { | 1519 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { |
1021 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1520 scoped_ptr<spdy::SpdyFrame> req( |
| 1521 ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1022 MockWrite writes[] = { | 1522 MockWrite writes[] = { |
1023 CreateMockWrite(*req), | 1523 CreateMockWrite(*req), |
1024 MockWrite(true, 0, 0) // EOF | 1524 MockWrite(true, 0, 0) // EOF |
1025 }; | 1525 }; |
1026 | 1526 |
1027 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 1527 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
1028 MockRead reads[] = { | 1528 MockRead reads[] = { |
1029 CreateMockRead(*test_cases[i].syn_reply), | 1529 CreateMockRead(*test_cases[i].syn_reply), |
1030 CreateMockRead(*body), | 1530 CreateMockRead(*body), |
1031 MockRead(true, 0, 0) // EOF | 1531 MockRead(true, 0, 0) // EOF |
1032 }; | 1532 }; |
1033 | 1533 |
1034 scoped_refptr<DelayedSocketData> data( | 1534 scoped_refptr<DelayedSocketData> data( |
1035 new DelayedSocketData(1, reads, arraysize(reads), | 1535 new DelayedSocketData(1, reads, arraysize(reads), |
1036 writes, arraysize(writes))); | 1536 writes, arraysize(writes))); |
1037 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 1537 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
1038 BoundNetLog()); | 1538 BoundNetLog()); |
1039 helper.RunToCompletion(data.get()); | 1539 helper.RunToCompletion(data.get()); |
1040 TransactionHelperResult out = helper.output(); | 1540 TransactionHelperResult out = helper.output(); |
1041 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); | 1541 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); |
1042 } | 1542 } |
1043 } | 1543 } |
1044 | 1544 |
1045 // Test that we shutdown correctly on write errors. | 1545 // Test that we shutdown correctly on write errors. |
1046 TEST_F(SpdyNetworkTransactionTest, WriteError) { | 1546 TEST_F(SpdyNetworkTransactionTest, WriteError) { |
1047 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1547 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1048 MockWrite writes[] = { | 1548 MockWrite writes[] = { |
1049 // We'll write 10 bytes successfully | 1549 // We'll write 10 bytes successfully |
1050 MockWrite(true, req->data(), 10), | 1550 MockWrite(true, req->data(), 10), |
1051 // Followed by ERROR! | 1551 // Followed by ERROR! |
1052 MockWrite(true, ERR_FAILED), | 1552 MockWrite(true, ERR_FAILED), |
1053 }; | 1553 }; |
1054 | 1554 |
1055 scoped_refptr<DelayedSocketData> data( | 1555 scoped_refptr<DelayedSocketData> data( |
1056 new DelayedSocketData(2, NULL, 0, | 1556 new DelayedSocketData(2, NULL, 0, |
1057 writes, arraysize(writes))); | 1557 writes, arraysize(writes))); |
1058 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 1558 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
1059 BoundNetLog()); | 1559 BoundNetLog()); |
1060 helper.RunToCompletion(data.get()); | 1560 helper.RunToCompletion(data.get()); |
1061 TransactionHelperResult out = helper.output(); | 1561 TransactionHelperResult out = helper.output(); |
1062 EXPECT_EQ(ERR_FAILED, out.rv); | 1562 EXPECT_EQ(ERR_FAILED, out.rv); |
1063 data->Reset(); | 1563 data->Reset(); |
1064 } | 1564 } |
1065 | 1565 |
1066 // Test that partial writes work. | 1566 // Test that partial writes work. |
1067 TEST_F(SpdyNetworkTransactionTest, PartialWrite) { | 1567 TEST_F(SpdyNetworkTransactionTest, PartialWrite) { |
1068 // Chop the SYN_STREAM frame into 5 chunks. | 1568 // Chop the SYN_STREAM frame into 5 chunks. |
1069 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1569 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1070 const int kChunks = 5; | 1570 const int kChunks = 5; |
1071 scoped_array<MockWrite> writes(ChopWriteFrame(*req.get(), kChunks)); | 1571 scoped_array<MockWrite> writes(ChopWriteFrame(*req.get(), kChunks)); |
1072 | 1572 |
1073 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 1573 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
1074 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 1574 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
1075 MockRead reads[] = { | 1575 MockRead reads[] = { |
1076 CreateMockRead(*resp), | 1576 CreateMockRead(*resp), |
1077 CreateMockRead(*body), | 1577 CreateMockRead(*body), |
1078 MockRead(true, 0, 0) // EOF | 1578 MockRead(true, 0, 0) // EOF |
1079 }; | 1579 }; |
1080 | 1580 |
1081 scoped_refptr<DelayedSocketData> data( | 1581 scoped_refptr<DelayedSocketData> data( |
1082 new DelayedSocketData(kChunks, reads, arraysize(reads), | 1582 new DelayedSocketData(kChunks, reads, arraysize(reads), |
1083 writes.get(), kChunks)); | 1583 writes.get(), kChunks)); |
1084 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 1584 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
1085 BoundNetLog()); | 1585 BoundNetLog()); |
1086 helper.RunToCompletion(data.get()); | 1586 helper.RunToCompletion(data.get()); |
1087 TransactionHelperResult out = helper.output(); | 1587 TransactionHelperResult out = helper.output(); |
1088 EXPECT_EQ(OK, out.rv); | 1588 EXPECT_EQ(OK, out.rv); |
1089 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 1589 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
1090 EXPECT_EQ("hello!", out.response_data); | 1590 EXPECT_EQ("hello!", out.response_data); |
1091 } | 1591 } |
1092 | 1592 |
1093 // In this test, we enable compression, but get a uncompressed SynReply from | 1593 // In this test, we enable compression, but get a uncompressed SynReply from |
1094 // the server. Verify that teardown is all clean. | 1594 // the server. Verify that teardown is all clean. |
1095 TEST_F(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) { | 1595 TEST_F(SpdyNetworkTransactionTest, DecompressFailureOnSynReply) { |
1096 // For this test, we turn on the normal compression. | 1596 // For this test, we turn on the normal compression. |
1097 EnableCompression(true); | 1597 EnableCompression(true); |
1098 | 1598 |
1099 scoped_ptr<spdy::SpdyFrame> compressed(ConstructSpdyGet(NULL, 0, true)); | 1599 scoped_ptr<spdy::SpdyFrame> compressed( |
| 1600 ConstructSpdyGet(NULL, 0, true, 1, LOWEST)); |
1100 MockWrite writes[] = { | 1601 MockWrite writes[] = { |
1101 CreateMockWrite(*compressed), | 1602 CreateMockWrite(*compressed), |
1102 }; | 1603 }; |
1103 | 1604 |
1104 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 1605 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
1105 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 1606 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
1106 MockRead reads[] = { | 1607 MockRead reads[] = { |
1107 CreateMockRead(*resp), | 1608 CreateMockRead(*resp), |
1108 CreateMockRead(*body), | 1609 CreateMockRead(*body), |
1109 MockRead(true, 0, 0) // EOF | 1610 MockRead(true, 0, 0) // EOF |
1110 }; | 1611 }; |
1111 | 1612 |
1112 scoped_refptr<DelayedSocketData> data( | 1613 scoped_refptr<DelayedSocketData> data( |
1113 new DelayedSocketData(1, reads, arraysize(reads), | 1614 new DelayedSocketData(1, reads, arraysize(reads), |
1114 writes, arraysize(writes))); | 1615 writes, arraysize(writes))); |
1115 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 1616 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
1116 BoundNetLog()); | 1617 BoundNetLog()); |
1117 helper.RunToCompletion(data.get()); | 1618 helper.RunToCompletion(data.get()); |
1118 TransactionHelperResult out = helper.output(); | 1619 TransactionHelperResult out = helper.output(); |
1119 EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv); | 1620 EXPECT_EQ(ERR_SYN_REPLY_NOT_RECEIVED, out.rv); |
1120 data->Reset(); | 1621 data->Reset(); |
1121 | 1622 |
1122 EnableCompression(false); | 1623 EnableCompression(false); |
1123 } | 1624 } |
1124 | 1625 |
1125 // Test that the NetLog contains good data for a simple GET request. | 1626 // Test that the NetLog contains good data for a simple GET request. |
1126 TEST_F(SpdyNetworkTransactionTest, NetLog) { | 1627 TEST_F(SpdyNetworkTransactionTest, NetLog) { |
1127 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1628 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1128 MockWrite writes[] = { CreateMockWrite(*req) }; | 1629 MockWrite writes[] = { CreateMockWrite(*req) }; |
1129 | 1630 |
1130 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 1631 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
1131 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 1632 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
1132 MockRead reads[] = { | 1633 MockRead reads[] = { |
1133 CreateMockRead(*resp), | 1634 CreateMockRead(*resp), |
1134 CreateMockRead(*body), | 1635 CreateMockRead(*body), |
1135 MockRead(true, 0, 0) // EOF | 1636 MockRead(true, 0, 0) // EOF |
1136 }; | 1637 }; |
1137 | 1638 |
1138 net::CapturingBoundNetLog log(net::CapturingNetLog::kUnbounded); | 1639 net::CapturingBoundNetLog log(net::CapturingNetLog::kUnbounded); |
1139 | 1640 |
1140 scoped_refptr<DelayedSocketData> data( | 1641 scoped_refptr<DelayedSocketData> data( |
1141 new DelayedSocketData(1, reads, arraysize(reads), | 1642 new DelayedSocketData(1, reads, arraysize(reads), |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1174 net::NetLog::PHASE_END); | 1675 net::NetLog::PHASE_END); |
1175 } | 1676 } |
1176 | 1677 |
1177 // Since we buffer the IO from the stream to the renderer, this test verifies | 1678 // Since we buffer the IO from the stream to the renderer, this test verifies |
1178 // that when we read out the maximum amount of data (e.g. we received 50 bytes | 1679 // that when we read out the maximum amount of data (e.g. we received 50 bytes |
1179 // on the network, but issued a Read for only 5 of those bytes) that the data | 1680 // on the network, but issued a Read for only 5 of those bytes) that the data |
1180 // flow still works correctly. | 1681 // flow still works correctly. |
1181 TEST_F(SpdyNetworkTransactionTest, BufferFull) { | 1682 TEST_F(SpdyNetworkTransactionTest, BufferFull) { |
1182 spdy::SpdyFramer framer; | 1683 spdy::SpdyFramer framer; |
1183 | 1684 |
1184 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1685 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1185 MockWrite writes[] = { CreateMockWrite(*req) }; | 1686 MockWrite writes[] = { CreateMockWrite(*req) }; |
1186 | 1687 |
1187 // 2 data frames in a single read. | 1688 // 2 data frames in a single read. |
1188 scoped_ptr<spdy::SpdyFrame> data_frame_1( | 1689 scoped_ptr<spdy::SpdyFrame> data_frame_1( |
1189 framer.CreateDataFrame(1, "goodby", 6, spdy::DATA_FLAG_NONE)); | 1690 framer.CreateDataFrame(1, "goodby", 6, spdy::DATA_FLAG_NONE)); |
1190 scoped_ptr<spdy::SpdyFrame> data_frame_2( | 1691 scoped_ptr<spdy::SpdyFrame> data_frame_2( |
1191 framer.CreateDataFrame(1, "e worl", 6, spdy::DATA_FLAG_NONE)); | 1692 framer.CreateDataFrame(1, "e worl", 6, spdy::DATA_FLAG_NONE)); |
1192 const spdy::SpdyFrame* data_frames[2] = { | 1693 const spdy::SpdyFrame* data_frames[2] = { |
1193 data_frame_1.get(), | 1694 data_frame_1.get(), |
1194 data_frame_2.get(), | 1695 data_frame_2.get(), |
1195 }; | 1696 }; |
1196 char combined_data_frames[100]; | 1697 char combined_data_frames[100]; |
1197 int combined_data_frames_len = | 1698 int combined_data_frames_len = |
1198 CombineFrames(data_frames, arraysize(data_frames), | 1699 CombineFrames(data_frames, arraysize(data_frames), |
1199 combined_data_frames, arraysize(combined_data_frames)); | 1700 combined_data_frames, arraysize(combined_data_frames)); |
1200 scoped_ptr<spdy::SpdyFrame> last_frame( | 1701 scoped_ptr<spdy::SpdyFrame> last_frame( |
1201 framer.CreateDataFrame(1, "d", 1, spdy::DATA_FLAG_FIN)); | 1702 framer.CreateDataFrame(1, "d", 1, spdy::DATA_FLAG_FIN)); |
1202 | 1703 |
1203 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 1704 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
1204 MockRead reads[] = { | 1705 MockRead reads[] = { |
1205 CreateMockRead(*resp), | 1706 CreateMockRead(*resp), |
1206 MockRead(true, ERR_IO_PENDING), // Force a pause | 1707 MockRead(true, ERR_IO_PENDING), // Force a pause |
1207 MockRead(true, combined_data_frames, combined_data_frames_len), | 1708 MockRead(true, combined_data_frames, combined_data_frames_len), |
1208 MockRead(true, ERR_IO_PENDING), // Force a pause | 1709 MockRead(true, ERR_IO_PENDING), // Force a pause |
1209 CreateMockRead(*last_frame), | 1710 CreateMockRead(*last_frame), |
1210 MockRead(true, 0, 0) // EOF | 1711 MockRead(true, 0, 0) // EOF |
1211 }; | 1712 }; |
1212 | 1713 |
1213 scoped_refptr<DelayedSocketData> data( | 1714 scoped_refptr<DelayedSocketData> data( |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1268 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 1769 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
1269 EXPECT_EQ("goodbye world", out.response_data); | 1770 EXPECT_EQ("goodbye world", out.response_data); |
1270 } | 1771 } |
1271 | 1772 |
1272 // Verify that basic buffering works; when multiple data frames arrive | 1773 // Verify that basic buffering works; when multiple data frames arrive |
1273 // at the same time, ensure that we don't notify a read completion for | 1774 // at the same time, ensure that we don't notify a read completion for |
1274 // each data frame individually. | 1775 // each data frame individually. |
1275 TEST_F(SpdyNetworkTransactionTest, Buffering) { | 1776 TEST_F(SpdyNetworkTransactionTest, Buffering) { |
1276 spdy::SpdyFramer framer; | 1777 spdy::SpdyFramer framer; |
1277 | 1778 |
1278 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1779 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1279 MockWrite writes[] = { CreateMockWrite(*req) }; | 1780 MockWrite writes[] = { CreateMockWrite(*req) }; |
1280 | 1781 |
1281 // 4 data frames in a single read. | 1782 // 4 data frames in a single read. |
1282 scoped_ptr<spdy::SpdyFrame> data_frame( | 1783 scoped_ptr<spdy::SpdyFrame> data_frame( |
1283 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); | 1784 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); |
1284 scoped_ptr<spdy::SpdyFrame> data_frame_fin( | 1785 scoped_ptr<spdy::SpdyFrame> data_frame_fin( |
1285 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_FIN)); | 1786 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_FIN)); |
1286 const spdy::SpdyFrame* data_frames[4] = { | 1787 const spdy::SpdyFrame* data_frames[4] = { |
1287 data_frame.get(), | 1788 data_frame.get(), |
1288 data_frame.get(), | 1789 data_frame.get(), |
1289 data_frame.get(), | 1790 data_frame.get(), |
1290 data_frame_fin.get() | 1791 data_frame_fin.get() |
1291 }; | 1792 }; |
1292 char combined_data_frames[100]; | 1793 char combined_data_frames[100]; |
1293 int combined_data_frames_len = | 1794 int combined_data_frames_len = |
1294 CombineFrames(data_frames, arraysize(data_frames), | 1795 CombineFrames(data_frames, arraysize(data_frames), |
1295 combined_data_frames, arraysize(combined_data_frames)); | 1796 combined_data_frames, arraysize(combined_data_frames)); |
1296 | 1797 |
1297 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 1798 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
1298 MockRead reads[] = { | 1799 MockRead reads[] = { |
1299 CreateMockRead(*resp), | 1800 CreateMockRead(*resp), |
1300 MockRead(true, ERR_IO_PENDING), // Force a pause | 1801 MockRead(true, ERR_IO_PENDING), // Force a pause |
1301 MockRead(true, combined_data_frames, combined_data_frames_len), | 1802 MockRead(true, combined_data_frames, combined_data_frames_len), |
1302 MockRead(true, 0, 0) // EOF | 1803 MockRead(true, 0, 0) // EOF |
1303 }; | 1804 }; |
1304 | 1805 |
1305 scoped_refptr<DelayedSocketData> data( | 1806 scoped_refptr<DelayedSocketData> data( |
1306 new DelayedSocketData(1, reads, arraysize(reads), | 1807 new DelayedSocketData(1, reads, arraysize(reads), |
1307 writes, arraysize(writes))); | 1808 writes, arraysize(writes))); |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1362 | 1863 |
1363 EXPECT_EQ(OK, out.rv); | 1864 EXPECT_EQ(OK, out.rv); |
1364 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 1865 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
1365 EXPECT_EQ("messagemessagemessagemessage", out.response_data); | 1866 EXPECT_EQ("messagemessagemessagemessage", out.response_data); |
1366 } | 1867 } |
1367 | 1868 |
1368 // Verify the case where we buffer data but read it after it has been buffered. | 1869 // Verify the case where we buffer data but read it after it has been buffered. |
1369 TEST_F(SpdyNetworkTransactionTest, BufferedAll) { | 1870 TEST_F(SpdyNetworkTransactionTest, BufferedAll) { |
1370 spdy::SpdyFramer framer; | 1871 spdy::SpdyFramer framer; |
1371 | 1872 |
1372 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1873 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1373 MockWrite writes[] = { CreateMockWrite(*req) }; | 1874 MockWrite writes[] = { CreateMockWrite(*req) }; |
1374 | 1875 |
1375 // 5 data frames in a single read. | 1876 // 5 data frames in a single read. |
1376 scoped_ptr<spdy::SpdyFrame> syn_reply( | 1877 scoped_ptr<spdy::SpdyFrame> syn_reply( |
1377 ConstructSpdyGetSynReply(NULL, 0)); | 1878 ConstructSpdyGetSynReply(NULL, 0, 1)); |
1378 syn_reply->set_flags(spdy::CONTROL_FLAG_NONE); // turn off FIN bit | 1879 syn_reply->set_flags(spdy::CONTROL_FLAG_NONE); // turn off FIN bit |
1379 scoped_ptr<spdy::SpdyFrame> data_frame( | 1880 scoped_ptr<spdy::SpdyFrame> data_frame( |
1380 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); | 1881 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); |
1381 scoped_ptr<spdy::SpdyFrame> data_frame_fin( | 1882 scoped_ptr<spdy::SpdyFrame> data_frame_fin( |
1382 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_FIN)); | 1883 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_FIN)); |
1383 const spdy::SpdyFrame* frames[5] = { | 1884 const spdy::SpdyFrame* frames[5] = { |
1384 syn_reply.get(), | 1885 syn_reply.get(), |
1385 data_frame.get(), | 1886 data_frame.get(), |
1386 data_frame.get(), | 1887 data_frame.get(), |
1387 data_frame.get(), | 1888 data_frame.get(), |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1453 | 1954 |
1454 EXPECT_EQ(OK, out.rv); | 1955 EXPECT_EQ(OK, out.rv); |
1455 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 1956 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
1456 EXPECT_EQ("messagemessagemessagemessage", out.response_data); | 1957 EXPECT_EQ("messagemessagemessagemessage", out.response_data); |
1457 } | 1958 } |
1458 | 1959 |
1459 // Verify the case where we buffer data and close the connection. | 1960 // Verify the case where we buffer data and close the connection. |
1460 TEST_F(SpdyNetworkTransactionTest, BufferedClosed) { | 1961 TEST_F(SpdyNetworkTransactionTest, BufferedClosed) { |
1461 spdy::SpdyFramer framer; | 1962 spdy::SpdyFramer framer; |
1462 | 1963 |
1463 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 1964 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1464 MockWrite writes[] = { CreateMockWrite(*req) }; | 1965 MockWrite writes[] = { CreateMockWrite(*req) }; |
1465 | 1966 |
1466 // All data frames in a single read. | 1967 // All data frames in a single read. |
1467 // NOTE: We don't FIN the stream. | 1968 // NOTE: We don't FIN the stream. |
1468 scoped_ptr<spdy::SpdyFrame> data_frame( | 1969 scoped_ptr<spdy::SpdyFrame> data_frame( |
1469 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); | 1970 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); |
1470 const spdy::SpdyFrame* data_frames[4] = { | 1971 const spdy::SpdyFrame* data_frames[4] = { |
1471 data_frame.get(), | 1972 data_frame.get(), |
1472 data_frame.get(), | 1973 data_frame.get(), |
1473 data_frame.get(), | 1974 data_frame.get(), |
1474 data_frame.get() | 1975 data_frame.get() |
1475 }; | 1976 }; |
1476 char combined_data_frames[100]; | 1977 char combined_data_frames[100]; |
1477 int combined_data_frames_len = | 1978 int combined_data_frames_len = |
1478 CombineFrames(data_frames, arraysize(data_frames), | 1979 CombineFrames(data_frames, arraysize(data_frames), |
1479 combined_data_frames, arraysize(combined_data_frames)); | 1980 combined_data_frames, arraysize(combined_data_frames)); |
1480 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 1981 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
1481 MockRead reads[] = { | 1982 MockRead reads[] = { |
1482 CreateMockRead(*resp), | 1983 CreateMockRead(*resp), |
1483 MockRead(true, ERR_IO_PENDING), // Force a wait | 1984 MockRead(true, ERR_IO_PENDING), // Force a wait |
1484 MockRead(true, combined_data_frames, combined_data_frames_len), | 1985 MockRead(true, combined_data_frames, combined_data_frames_len), |
1485 MockRead(true, 0, 0) // EOF | 1986 MockRead(true, 0, 0) // EOF |
1486 }; | 1987 }; |
1487 | 1988 |
1488 scoped_refptr<DelayedSocketData> data( | 1989 scoped_refptr<DelayedSocketData> data( |
1489 new DelayedSocketData(1, reads, arraysize(reads), | 1990 new DelayedSocketData(1, reads, arraysize(reads), |
1490 writes, arraysize(writes))); | 1991 writes, arraysize(writes))); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1543 MessageLoop::current()->RunAllPending(); | 2044 MessageLoop::current()->RunAllPending(); |
1544 | 2045 |
1545 // Verify that we consumed all test data. | 2046 // Verify that we consumed all test data. |
1546 helper.VerifyDataConsumed(); | 2047 helper.VerifyDataConsumed(); |
1547 } | 2048 } |
1548 | 2049 |
1549 // Verify the case where we buffer data and cancel the transaction. | 2050 // Verify the case where we buffer data and cancel the transaction. |
1550 TEST_F(SpdyNetworkTransactionTest, BufferedCancelled) { | 2051 TEST_F(SpdyNetworkTransactionTest, BufferedCancelled) { |
1551 spdy::SpdyFramer framer; | 2052 spdy::SpdyFramer framer; |
1552 | 2053 |
1553 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 2054 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1554 MockWrite writes[] = { CreateMockWrite(*req) }; | 2055 MockWrite writes[] = { CreateMockWrite(*req) }; |
1555 | 2056 |
1556 // NOTE: We don't FIN the stream. | 2057 // NOTE: We don't FIN the stream. |
1557 scoped_ptr<spdy::SpdyFrame> data_frame( | 2058 scoped_ptr<spdy::SpdyFrame> data_frame( |
1558 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); | 2059 framer.CreateDataFrame(1, "message", 7, spdy::DATA_FLAG_NONE)); |
1559 | 2060 |
1560 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 2061 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
1561 MockRead reads[] = { | 2062 MockRead reads[] = { |
1562 CreateMockRead(*resp), | 2063 CreateMockRead(*resp), |
1563 MockRead(true, ERR_IO_PENDING), // Force a wait | 2064 MockRead(true, ERR_IO_PENDING), // Force a wait |
1564 CreateMockRead(*data_frame), | 2065 CreateMockRead(*data_frame), |
1565 MockRead(true, 0, 0) // EOF | 2066 MockRead(true, 0, 0) // EOF |
1566 }; | 2067 }; |
1567 | 2068 |
1568 scoped_refptr<DelayedSocketData> data( | 2069 scoped_refptr<DelayedSocketData> data( |
1569 new DelayedSocketData(1, reads, arraysize(reads), | 2070 new DelayedSocketData(1, reads, arraysize(reads), |
1570 writes, arraysize(writes))); | 2071 writes, arraysize(writes))); |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1637 }; | 2138 }; |
1638 | 2139 |
1639 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 2140 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
1640 BoundNetLog()); | 2141 BoundNetLog()); |
1641 | 2142 |
1642 // Verify that no settings exist initially. | 2143 // Verify that no settings exist initially. |
1643 HostPortPair host_port_pair("www.google.com", 443); | 2144 HostPortPair host_port_pair("www.google.com", 443); |
1644 EXPECT_TRUE(helper.session()->spdy_settings().Get(host_port_pair).empty()); | 2145 EXPECT_TRUE(helper.session()->spdy_settings().Get(host_port_pair).empty()); |
1645 | 2146 |
1646 // Construct the request. | 2147 // Construct the request. |
1647 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 2148 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1648 MockWrite writes[] = { CreateMockWrite(*req) }; | 2149 MockWrite writes[] = { CreateMockWrite(*req) }; |
1649 | 2150 |
1650 // Construct the reply. | 2151 // Construct the reply. |
1651 scoped_ptr<spdy::SpdyFrame> reply( | 2152 scoped_ptr<spdy::SpdyFrame> reply( |
1652 ConstructSpdyPacket(kSynReplyInfo, | 2153 ConstructSpdyPacket(kSynReplyInfo, |
1653 kExtraHeaders, | 2154 kExtraHeaders, |
1654 arraysize(kExtraHeaders) / 2, | 2155 arraysize(kExtraHeaders) / 2, |
1655 NULL, | 2156 NULL, |
1656 0)); | 2157 0)); |
1657 | 2158 |
(...skipping 16 matching lines...) Expand all Loading... |
1674 setting.set_flags(0); | 2175 setting.set_flags(0); |
1675 setting.set_id(kSampleId2); | 2176 setting.set_id(kSampleId2); |
1676 settings.push_back(std::make_pair(setting, kSampleValue2)); | 2177 settings.push_back(std::make_pair(setting, kSampleValue2)); |
1677 // Next add another persisted setting | 2178 // Next add another persisted setting |
1678 setting.set_flags(spdy::SETTINGS_FLAG_PLEASE_PERSIST); | 2179 setting.set_flags(spdy::SETTINGS_FLAG_PLEASE_PERSIST); |
1679 setting.set_id(kSampleId3); | 2180 setting.set_id(kSampleId3); |
1680 settings.push_back(std::make_pair(setting, kSampleValue3)); | 2181 settings.push_back(std::make_pair(setting, kSampleValue3)); |
1681 settings_frame.reset(ConstructSpdySettings(settings)); | 2182 settings_frame.reset(ConstructSpdySettings(settings)); |
1682 } | 2183 } |
1683 | 2184 |
1684 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 2185 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
1685 MockRead reads[] = { | 2186 MockRead reads[] = { |
1686 CreateMockRead(*reply), | 2187 CreateMockRead(*reply), |
1687 CreateMockRead(*body), | 2188 CreateMockRead(*body), |
1688 CreateMockRead(*settings_frame), | 2189 CreateMockRead(*settings_frame), |
1689 MockRead(true, 0, 0) // EOF | 2190 MockRead(true, 0, 0) // EOF |
1690 }; | 2191 }; |
1691 | 2192 |
1692 scoped_refptr<DelayedSocketData> data( | 2193 scoped_refptr<DelayedSocketData> data( |
1693 new DelayedSocketData(1, reads, arraysize(reads), | 2194 new DelayedSocketData(1, reads, arraysize(reads), |
1694 writes, arraysize(writes))); | 2195 writes, arraysize(writes))); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1768 } | 2269 } |
1769 | 2270 |
1770 EXPECT_EQ(2u, helper.session()->spdy_settings().Get(host_port_pair).size()); | 2271 EXPECT_EQ(2u, helper.session()->spdy_settings().Get(host_port_pair).size()); |
1771 | 2272 |
1772 // Construct the SETTINGS frame. | 2273 // Construct the SETTINGS frame. |
1773 const spdy::SpdySettings& settings = | 2274 const spdy::SpdySettings& settings = |
1774 helper.session()->spdy_settings().Get(host_port_pair); | 2275 helper.session()->spdy_settings().Get(host_port_pair); |
1775 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings)); | 2276 scoped_ptr<spdy::SpdyFrame> settings_frame(ConstructSpdySettings(settings)); |
1776 | 2277 |
1777 // Construct the request. | 2278 // Construct the request. |
1778 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 2279 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1779 | 2280 |
1780 MockWrite writes[] = { | 2281 MockWrite writes[] = { |
1781 CreateMockWrite(*settings_frame), | 2282 CreateMockWrite(*settings_frame), |
1782 CreateMockWrite(*req), | 2283 CreateMockWrite(*req), |
1783 }; | 2284 }; |
1784 | 2285 |
1785 // Construct the reply. | 2286 // Construct the reply. |
1786 scoped_ptr<spdy::SpdyFrame> reply( | 2287 scoped_ptr<spdy::SpdyFrame> reply( |
1787 ConstructSpdyPacket(kSynReplyInfo, | 2288 ConstructSpdyPacket(kSynReplyInfo, |
1788 kExtraHeaders, | 2289 kExtraHeaders, |
1789 arraysize(kExtraHeaders) / 2, | 2290 arraysize(kExtraHeaders) / 2, |
1790 NULL, | 2291 NULL, |
1791 0)); | 2292 0)); |
1792 | 2293 |
1793 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame()); | 2294 scoped_ptr<spdy::SpdyFrame> body(ConstructSpdyBodyFrame(1, true)); |
1794 MockRead reads[] = { | 2295 MockRead reads[] = { |
1795 CreateMockRead(*reply), | 2296 CreateMockRead(*reply), |
1796 CreateMockRead(*body), | 2297 CreateMockRead(*body), |
1797 MockRead(true, 0, 0) // EOF | 2298 MockRead(true, 0, 0) // EOF |
1798 }; | 2299 }; |
1799 | 2300 |
1800 scoped_refptr<DelayedSocketData> data( | 2301 scoped_refptr<DelayedSocketData> data( |
1801 new DelayedSocketData(2, reads, arraysize(reads), | 2302 new DelayedSocketData(2, reads, arraysize(reads), |
1802 writes, arraysize(writes))); | 2303 writes, arraysize(writes))); |
1803 helper.RunToCompletion(data.get()); | 2304 helper.RunToCompletion(data.get()); |
(...skipping 18 matching lines...) Expand all Loading... |
1822 // Verify the second persisted setting. | 2323 // Verify the second persisted setting. |
1823 setting = saved_settings.front(); | 2324 setting = saved_settings.front(); |
1824 saved_settings.pop_front(); | 2325 saved_settings.pop_front(); |
1825 EXPECT_EQ(spdy::SETTINGS_FLAG_PERSISTED, setting.first.flags()); | 2326 EXPECT_EQ(spdy::SETTINGS_FLAG_PERSISTED, setting.first.flags()); |
1826 EXPECT_EQ(kSampleId2, setting.first.id()); | 2327 EXPECT_EQ(kSampleId2, setting.first.id()); |
1827 EXPECT_EQ(kSampleValue2, setting.second); | 2328 EXPECT_EQ(kSampleValue2, setting.second); |
1828 } | 2329 } |
1829 } | 2330 } |
1830 | 2331 |
1831 TEST_F(SpdyNetworkTransactionTest, GoAwayWithActiveStream) { | 2332 TEST_F(SpdyNetworkTransactionTest, GoAwayWithActiveStream) { |
1832 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 2333 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1833 MockWrite writes[] = { CreateMockWrite(*req) }; | 2334 MockWrite writes[] = { CreateMockWrite(*req) }; |
1834 | 2335 |
1835 scoped_ptr<spdy::SpdyFrame> go_away(ConstructSpdyGoAway()); | 2336 scoped_ptr<spdy::SpdyFrame> go_away(ConstructSpdyGoAway()); |
1836 MockRead reads[] = { | 2337 MockRead reads[] = { |
1837 CreateMockRead(*go_away), | 2338 CreateMockRead(*go_away), |
1838 MockRead(true, 0, 0) // EOF | 2339 MockRead(true, 0, 0) // EOF |
1839 }; | 2340 }; |
1840 | 2341 |
1841 scoped_refptr<DelayedSocketData> data( | 2342 scoped_refptr<DelayedSocketData> data( |
1842 new DelayedSocketData(1, reads, arraysize(reads), | 2343 new DelayedSocketData(1, reads, arraysize(reads), |
1843 writes, arraysize(writes))); | 2344 writes, arraysize(writes))); |
1844 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 2345 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
1845 BoundNetLog()); | 2346 BoundNetLog()); |
1846 helper.RunToCompletion(data.get()); | 2347 helper.RunToCompletion(data.get()); |
1847 TransactionHelperResult out = helper.output(); | 2348 TransactionHelperResult out = helper.output(); |
1848 EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv); | 2349 EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv); |
1849 } | 2350 } |
1850 | 2351 |
1851 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) { | 2352 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) { |
1852 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0)); | 2353 scoped_ptr<spdy::SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
1853 MockWrite writes[] = { CreateMockWrite(*req) }; | 2354 MockWrite writes[] = { CreateMockWrite(*req) }; |
1854 | 2355 |
1855 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0)); | 2356 scoped_ptr<spdy::SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
1856 MockRead reads[] = { | 2357 MockRead reads[] = { |
1857 CreateMockRead(*resp), | 2358 CreateMockRead(*resp), |
1858 MockRead(false, 0, 0) // EOF | 2359 MockRead(false, 0, 0) // EOF |
1859 }; | 2360 }; |
1860 | 2361 |
1861 scoped_refptr<DelayedSocketData> data( | 2362 scoped_refptr<DelayedSocketData> data( |
1862 new DelayedSocketData(1, reads, arraysize(reads), | 2363 new DelayedSocketData(1, reads, arraysize(reads), |
1863 writes, arraysize(writes))); | 2364 writes, arraysize(writes))); |
1864 BoundNetLog log; | 2365 BoundNetLog log; |
1865 NormalSpdyTransactionHelper helper(CreateGetRequest(), | 2366 NormalSpdyTransactionHelper helper(CreateGetRequest(), |
(...skipping 14 matching lines...) Expand all Loading... |
1880 EXPECT_TRUE(response->headers != NULL); | 2381 EXPECT_TRUE(response->headers != NULL); |
1881 EXPECT_TRUE(response->was_fetched_via_spdy); | 2382 EXPECT_TRUE(response->was_fetched_via_spdy); |
1882 out.rv = ReadTransaction(trans, &out.response_data); | 2383 out.rv = ReadTransaction(trans, &out.response_data); |
1883 EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv); | 2384 EXPECT_EQ(ERR_CONNECTION_CLOSED, out.rv); |
1884 | 2385 |
1885 // Verify that we consumed all test data. | 2386 // Verify that we consumed all test data. |
1886 helper.VerifyDataConsumed(); | 2387 helper.VerifyDataConsumed(); |
1887 } | 2388 } |
1888 | 2389 |
1889 } // namespace net | 2390 } // namespace net |
OLD | NEW |